From bfc20d2ce95a4a0a0c25814f9c1bbf2eaab19b88 Mon Sep 17 00:00:00 2001 From: Viktor Barzin Date: Sun, 15 Mar 2026 23:25:36 +0000 Subject: [PATCH] move Docker builds to GitHub Actions, Woodpecker becomes deploy-only - GHA ci.yml: add build + deploy jobs (push to DockerHub, trigger Woodpecker) - Drop test matrix to single Python 3.12, preserve mypy step - Build/deploy gated on push to main (PRs still run tests only) - Woodpecker: deploy.yml (manual event, kubectl set image + slack notify) - Old pipeline preserved as build-fallback.yml (manual trigger) --- .github/workflows/ci.yml | 51 ++++++++++++++++--- .../build-fallback.yml | 3 +- .woodpecker/deploy.yml | 18 +++++++ 3 files changed, 63 insertions(+), 9 deletions(-) rename .woodpecker.yml => .woodpecker/build-fallback.yml (96%) create mode 100644 .woodpecker/deploy.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 806e542..8229a00 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,31 +6,68 @@ on: pull_request: branches: [main] +env: + IMAGE_NAME: claude-memory-mcp + jobs: test: runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: ${{ matrix.python-version }} + python-version: "3.12" - run: pip install -e ".[api,dev]" - run: ruff check src/ tests/ - run: mypy src/claude_memory/ - run: pytest tests/ -v --tb=short - docker: + build: runs-on: ubuntu-latest needs: test + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + outputs: + image_tag: ${{ steps.meta.outputs.sha }} steps: - uses: actions/checkout@v4 - uses: docker/setup-buildx-action@v3 + - uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - id: meta + run: echo "sha=$(echo ${{ github.sha }} | cut -c1-8)" >> $GITHUB_OUTPUT - uses: docker/build-push-action@v6 with: context: . file: docker/Dockerfile - push: false - tags: claude-memory-mcp:test + push: true + platforms: linux/amd64 + tags: | + viktorbarzin/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.sha }} + viktorbarzin/${{ env.IMAGE_NAME }}:latest + cache-from: type=gha + cache-to: type=gha,mode=max + + deploy: + needs: build + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + steps: + - name: Trigger Woodpecker deploy + run: | + for attempt in 1 2 3; do + STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X POST \ + "https://ci.viktorbarzin.me/api/repos/ViktorBarzin/claude-memory-mcp/pipelines" \ + -H "Authorization: Bearer ${{ secrets.WOODPECKER_TOKEN }}" \ + -H "Content-Type: application/json" \ + -d '{"branch":"main","variables":{"IMAGE_TAG":"${{ needs.build.outputs.image_tag }}","IMAGE_NAME":"viktorbarzin/${{ env.IMAGE_NAME }}"}}') + if [ "$STATUS" -ge 200 ] && [ "$STATUS" -lt 300 ]; then + echo "Woodpecker deploy triggered (HTTP $STATUS)" + exit 0 + fi + echo "Attempt $attempt failed (HTTP $STATUS), retrying in 30s..." + sleep 30 + done + echo "Failed to trigger Woodpecker deploy after 3 attempts" + exit 1 diff --git a/.woodpecker.yml b/.woodpecker/build-fallback.yml similarity index 96% rename from .woodpecker.yml rename to .woodpecker/build-fallback.yml index f89403e..9571bf2 100644 --- a/.woodpecker.yml +++ b/.woodpecker/build-fallback.yml @@ -1,6 +1,5 @@ when: - - event: push - branch: main + - event: manual clone: git: diff --git a/.woodpecker/deploy.yml b/.woodpecker/deploy.yml new file mode 100644 index 0000000..0214ee5 --- /dev/null +++ b/.woodpecker/deploy.yml @@ -0,0 +1,18 @@ +when: + - event: manual + +steps: + - name: deploy + image: bitnami/kubectl:1.32 + commands: + - kubectl set image deployment/claude-memory claude-memory=${IMAGE_NAME}:${IMAGE_TAG} -n claude-memory + - kubectl rollout status deployment/claude-memory -n claude-memory --timeout=300s + + - name: notify + image: woodpeckerci/plugin-slack + settings: + webhook: + from_secret: slack-webhook-url + channel: general + when: + - status: [success, failure]