mirror of
https://github.com/johndoe6345789/SparkOS.git
synced 2026-04-24 13:34:56 +00:00
Add Dockerfile and GitHub Actions workflow for GHCR publishing
Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com>
This commit is contained in:
111
.github/workflows/docker-publish.yml
vendored
Normal file
111
.github/workflows/docker-publish.yml
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
name: Docker Build and Publish
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- develop
|
||||
tags:
|
||||
- 'v*'
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- develop
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
REGISTRY: ghcr.io
|
||||
IMAGE_NAME: ${{ github.repository }}
|
||||
|
||||
jobs:
|
||||
build-and-test:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Log in to GitHub Container Registry
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
type=ref,event=branch
|
||||
type=ref,event=pr
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
type=sha,prefix={{branch}}-
|
||||
type=raw,value=latest,enable={{is_default_branch}}
|
||||
|
||||
- name: Build Docker image
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
push: false
|
||||
load: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
- name: Test Docker image
|
||||
run: |
|
||||
echo "Testing SparkOS Docker image..."
|
||||
# Get the first tag from the metadata output
|
||||
IMAGE_TAG=$(echo "${{ steps.meta.outputs.tags }}" | head -n1)
|
||||
echo "Using image: $IMAGE_TAG"
|
||||
|
||||
# Run the container and check output
|
||||
docker run --rm "$IMAGE_TAG"
|
||||
|
||||
# Verify init binary exists and is executable
|
||||
docker run --rm "$IMAGE_TAG" sh -c "test -x /sparkos/rootfs/sbin/init && echo 'Init binary is executable'"
|
||||
|
||||
echo "Docker image test completed successfully!"
|
||||
|
||||
- name: Push Docker image to GHCR
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
- name: Output image details
|
||||
if: github.event_name != 'pull_request'
|
||||
run: |
|
||||
echo "### Docker Image Published! 🐳" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Registry:** ${{ env.REGISTRY }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Repository:** ${{ env.IMAGE_NAME }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Tags:**" >> $GITHUB_STEP_SUMMARY
|
||||
echo '```' >> $GITHUB_STEP_SUMMARY
|
||||
echo "${{ steps.meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY
|
||||
echo '```' >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "**Pull command:**" >> $GITHUB_STEP_SUMMARY
|
||||
echo '```bash' >> $GITHUB_STEP_SUMMARY
|
||||
echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" >> $GITHUB_STEP_SUMMARY
|
||||
echo '```' >> $GITHUB_STEP_SUMMARY
|
||||
96
Dockerfile
Normal file
96
Dockerfile
Normal file
@@ -0,0 +1,96 @@
|
||||
# SparkOS Docker Image
|
||||
# Multi-stage build for minimal final image size
|
||||
|
||||
# Build stage - use gcc image which has all build tools pre-installed
|
||||
FROM gcc:13-bookworm AS builder
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /build
|
||||
|
||||
# Copy source files
|
||||
COPY src/ ./src/
|
||||
COPY Makefile .
|
||||
COPY scripts/ ./scripts/
|
||||
|
||||
# Build the init system
|
||||
RUN make init
|
||||
|
||||
# Runtime stage - use Alpine for minimal size
|
||||
FROM alpine:3.19
|
||||
|
||||
# Note: Alpine includes busybox by default
|
||||
|
||||
# Create minimal rootfs structure
|
||||
RUN mkdir -p /sparkos/rootfs/bin \
|
||||
/sparkos/rootfs/sbin \
|
||||
/sparkos/rootfs/etc \
|
||||
/sparkos/rootfs/proc \
|
||||
/sparkos/rootfs/sys \
|
||||
/sparkos/rootfs/dev \
|
||||
/sparkos/rootfs/tmp \
|
||||
/sparkos/rootfs/usr/bin \
|
||||
/sparkos/rootfs/usr/sbin \
|
||||
/sparkos/rootfs/usr/lib \
|
||||
/sparkos/rootfs/var/log \
|
||||
/sparkos/rootfs/var/run \
|
||||
/sparkos/rootfs/root \
|
||||
/sparkos/rootfs/home/spark && \
|
||||
chmod 1777 /sparkos/rootfs/tmp && \
|
||||
chmod 700 /sparkos/rootfs/root && \
|
||||
chmod 755 /sparkos/rootfs/home/spark
|
||||
|
||||
# Copy built init binary from builder
|
||||
COPY --from=builder /build/init /sparkos/rootfs/sbin/init
|
||||
|
||||
# Copy setup scripts
|
||||
COPY scripts/setup_rootfs.sh /sparkos/scripts/
|
||||
|
||||
# Set up basic configuration files
|
||||
RUN echo "sparkos" > /sparkos/rootfs/etc/hostname && \
|
||||
echo "127.0.0.1 localhost" > /sparkos/rootfs/etc/hosts && \
|
||||
echo "127.0.1.1 sparkos" >> /sparkos/rootfs/etc/hosts && \
|
||||
echo "root:x:0:0:root:/root:/bin/sh" > /sparkos/rootfs/etc/passwd && \
|
||||
echo "spark:x:1000:1000:SparkOS User:/home/spark:/bin/sh" >> /sparkos/rootfs/etc/passwd && \
|
||||
echo "root:x:0:" > /sparkos/rootfs/etc/group && \
|
||||
echo "spark:x:1000:" >> /sparkos/rootfs/etc/group
|
||||
|
||||
# Create a test entrypoint
|
||||
COPY <<'EOF' /sparkos/test.sh
|
||||
#!/bin/sh
|
||||
echo "SparkOS Docker Test Environment"
|
||||
echo "================================"
|
||||
echo ""
|
||||
echo "SparkOS init binary: /sparkos/rootfs/sbin/init"
|
||||
echo ""
|
||||
echo "Verifying init binary..."
|
||||
if [ -f /sparkos/rootfs/sbin/init ]; then
|
||||
echo "✓ Init binary exists"
|
||||
ls -lh /sparkos/rootfs/sbin/init
|
||||
echo ""
|
||||
echo "File type:"
|
||||
file /sparkos/rootfs/sbin/init
|
||||
echo ""
|
||||
echo "Dependencies:"
|
||||
ldd /sparkos/rootfs/sbin/init 2>&1 || echo " Static binary (no dependencies)"
|
||||
else
|
||||
echo "✗ Init binary not found!"
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
echo "Root filesystem structure:"
|
||||
ls -la /sparkos/rootfs/
|
||||
echo ""
|
||||
echo "SparkOS is ready for testing!"
|
||||
echo ""
|
||||
echo "To test the init system:"
|
||||
echo " docker run --rm <image> /sparkos/rootfs/sbin/init --help"
|
||||
echo ""
|
||||
exec /bin/sh
|
||||
EOF
|
||||
|
||||
RUN chmod +x /sparkos/test.sh
|
||||
|
||||
WORKDIR /sparkos
|
||||
|
||||
# Set entrypoint
|
||||
ENTRYPOINT ["/sparkos/test.sh"]
|
||||
Reference in New Issue
Block a user