From a8723f687516f2308c3260911770cf61f33cb5fe Mon Sep 17 00:00:00 2001 From: Fork Less Date: Wed, 24 Jun 2026 16:24:50 +0200 Subject: [PATCH] ci: ARM64 Docker build via Gitea Actions --- .gitea/workflows/docker.yml | 99 +++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 .gitea/workflows/docker.yml diff --git a/.gitea/workflows/docker.yml b/.gitea/workflows/docker.yml new file mode 100644 index 0000000..46b0a08 --- /dev/null +++ b/.gitea/workflows/docker.yml @@ -0,0 +1,99 @@ +name: Docker Build (ARM64) + +on: + push: + branches: [main] + paths: + - 'Dockerfile' + - 'Dockerfile.canvas' + - 'src/**' + - 'frontend/**' + - 'package*.json' + - '.dockerignore' + pull_request: + branches: [main] + paths: + - 'Dockerfile' + - 'Dockerfile.canvas' + - 'src/**' + - 'frontend/**' + - 'package*.json' + - '.dockerignore' + workflow_dispatch: + +concurrency: + group: docker-arm64-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +env: + REGISTRY: gitea.forkless.com + IMAGE_MCP: gitea.forkless.com/forkless/excalidraw-mcp-sentinel + IMAGE_CANVAS: gitea.forkless.com/forkless/excalidraw-mcp-sentinel-canvas + +jobs: + docker: + name: Build & Push + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Docker info + run: | + docker info --format 'Arch: {{ .Architecture }}, OS: {{ .OSType }}' + echo "Building ARM64 natively — no buildx needed" + + - name: Build MCP Server + run: | + docker build \ + --tag ${{ env.IMAGE_MCP }}:latest \ + --tag ${{ env.IMAGE_MCP }}:${{ github.sha }} \ + --file Dockerfile . + + - name: Build Canvas Server + run: | + docker build \ + --tag ${{ env.IMAGE_CANVAS }}:latest \ + --tag ${{ env.IMAGE_CANVAS }}:${{ github.sha }} \ + --file Dockerfile.canvas . + + - name: Login to Gitea Container Registry + if: github.ref == 'refs/heads/main' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') + run: | + echo "${{ secrets.GITEATOKEN }}" | \ + docker login ${{ env.REGISTRY }} \ + --username "${{ secrets.GITEAUSER }}" \ + --password-stdin + + - name: Push latest + if: github.ref == 'refs/heads/main' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') + run: | + docker push ${{ env.IMAGE_MCP }}:latest + docker push ${{ env.IMAGE_MCP }}:${{ github.sha }} + docker push ${{ env.IMAGE_CANVAS }}:latest + docker push ${{ env.IMAGE_CANVAS }}:${{ github.sha }} + + - name: Tag version + if: startsWith(github.ref, 'refs/tags/v') + run: | + VERSION=${GITHUB_REF#refs/tags/v} + docker tag ${{ env.IMAGE_MCP }}:latest ${{ env.IMAGE_MCP }}:$VERSION + docker tag ${{ env.IMAGE_CANVAS }}:latest ${{ env.IMAGE_CANVAS }}:$VERSION + docker push ${{ env.IMAGE_MCP }}:$VERSION + docker push ${{ env.IMAGE_CANVAS }}:$VERSION + + - name: Smoke test (PR only) + if: github.event_name == 'pull_request' + run: | + docker run -d --network host \ + --name test-canvas \ + ${{ env.IMAGE_CANVAS }}:${{ github.sha }} + trap "docker rm -f test-canvas" EXIT + for i in $(seq 1 15); do + if curl -sf http://localhost:3000/health > /dev/null 2>&1; then + echo "Canvas healthy" + exit 0 + fi + sleep 1 + done + echo "Health check timeout" + exit 1