name: Build and Deploy on: push: branches: [main, master] workflow_dispatch: env: IMAGE_NAME: beadboard REGISTRY: registry.viktorbarzin.me:5050 jobs: build: runs-on: ubuntu-latest outputs: image_tag: ${{ steps.meta.outputs.sha }} steps: - uses: actions/checkout@v4 - uses: docker/setup-buildx-action@v3 - id: meta run: echo "sha=$(echo ${{ github.sha }} | cut -c1-8)" >> "$GITHUB_OUTPUT" - name: Log in to private registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ secrets.REGISTRY_USERNAME }} password: ${{ secrets.REGISTRY_PASSWORD }} - name: Build and push uses: docker/build-push-action@v6 with: context: . file: Dockerfile push: true platforms: linux/amd64 tags: | ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.sha }} ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest cache-from: type=gha cache-to: type=gha,mode=max deploy: needs: build runs-on: ubuntu-latest if: github.event_name == 'push' steps: - name: Trigger Woodpecker deploy env: # TODO: set WOODPECKER_REPO_ID once the beadboard repo is registered # with Woodpecker (infra CLAUDE.md: "Woodpecker API uses numeric repo IDs"). WOODPECKER_REPO_ID: "TBD" run: | if [ "$WOODPECKER_REPO_ID" = "TBD" ]; then echo "Woodpecker repo not yet registered — skipping deploy trigger." echo "Image built and pushed as ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.build.outputs.image_tag }}" exit 0 fi for attempt in 1 2 3; do STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X POST \ "https://ci.viktorbarzin.me/api/repos/${WOODPECKER_REPO_ID}/pipelines" \ -H "Authorization: Bearer ${{ secrets.WOODPECKER_TOKEN }}" \ -H "Content-Type: application/json" \ -d "{\"branch\":\"main\",\"variables\":{\"IMAGE_TAG\":\"${{ needs.build.outputs.image_tag }}\"}}") 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