Build Multi-Platform Docker Images #35
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build Multi-Platform Docker Images | |
| on: | |
| workflow_run: | |
| workflows: ["Build Binaries"] | |
| types: [completed] | |
| release: | |
| types: [published] | |
| workflow_dispatch: | |
| env: | |
| # GitHub Container Registry | |
| GHCR_REGISTRY: ghcr.io | |
| GHCR_IMAGE_NAME: ${{ github.repository }} | |
| jobs: | |
| build-docker: | |
| name: Build Multi-Platform Docker Image | |
| runs-on: ubuntu-latest | |
| if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' || github.event_name == 'release' }} | |
| permissions: | |
| contents: read | |
| packages: write | |
| actions: read | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Download artifacts from Build Binaries workflow (triggered by Build Binaries) | |
| if: github.event_name == 'workflow_run' | |
| uses: dawidd6/action-download-artifact@v6 | |
| with: | |
| github_token: ${{ secrets.GITHUB_TOKEN }} | |
| workflow: build.yml | |
| run_id: ${{ github.event.workflow_run.id }} | |
| name_is_regexp: true | |
| name: perfecto-mcp-.* | |
| path: artifacts/ | |
| - name: Download artifacts from Build Binaries workflow (triggered by release/manual) | |
| if: github.event_name != 'workflow_run' | |
| uses: dawidd6/action-download-artifact@v6 | |
| with: | |
| github_token: ${{ secrets.GITHUB_TOKEN }} | |
| workflow: build.yml | |
| commit: ${{ github.sha }} | |
| workflow_conclusion: success | |
| name_is_regexp: true | |
| name: perfecto-mcp-.* | |
| path: artifacts/ | |
| - name: Get tag for version (when triggered by Build Binaries) | |
| if: github.event_name == 'workflow_run' | |
| id: get_tag | |
| run: | | |
| git fetch --tags --force 2>/dev/null || true | |
| TAG=$(git tag --points-at ${{ github.event.workflow_run.head_sha }} 2>/dev/null | grep -E '^v[0-9]+\.[0-9]+' | sort -V | tail -1) | |
| echo "tag_name=$TAG" >> $GITHUB_OUTPUT | |
| echo "Tag for ${{ github.event.workflow_run.head_sha }}: $TAG" | |
| - name: Set ref tag without v (tag event processed) | |
| if: github.event_name == 'release' || (github.event_name == 'workflow_run' && steps.get_tag.outputs.tag_name != '') | |
| id: ref_tag | |
| run: | | |
| if [ "${{ github.event_name }}" = "release" ]; then | |
| RAW="${{ github.event.release.tag_name }}" | |
| else | |
| RAW="${{ steps.get_tag.outputs.tag_name }}" | |
| fi | |
| VERSION="${RAW#v}" | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| MAJOR_MINOR=$(echo "$VERSION" | sed -n 's/^\([0-9]*\.[0-9]*\).*/\1/p') | |
| echo "major_minor=$MAJOR_MINOR" >> $GITHUB_OUTPUT | |
| MAJOR=$(echo "$VERSION" | sed -n 's/^\([0-9]*\).*/\1/p') | |
| echo "major=$MAJOR" >> $GITHUB_OUTPUT | |
| echo "Ref tag (no v): $VERSION ($MAJOR_MINOR, $MAJOR)" | |
| - name: Organize binaries for Docker build | |
| run: | | |
| mkdir -p dist/ | |
| # Copy and rename binaries to match Docker expectations | |
| if [ -f artifacts/perfecto-mcp-linux-amd64/perfecto-mcp-linux-amd64 ]; then | |
| cp artifacts/perfecto-mcp-linux-amd64/perfecto-mcp-linux-amd64 dist/perfecto-mcp-linux-amd64 | |
| echo "AMD64 binary found" | |
| else | |
| echo "AMD64 binary missing" | |
| exit 1 | |
| fi | |
| # Check for ARM64 binary (optional for now) | |
| if [ -f artifacts/perfecto-mcp-linux-arm64/perfecto-mcp-linux-arm64 ]; then | |
| cp artifacts/perfecto-mcp-linux-arm64/perfecto-mcp-linux-arm64 dist/perfecto-mcp-linux-arm64 | |
| echo "ARM64 binary found" | |
| echo "PLATFORMS=linux/amd64,linux/arm64" >> $GITHUB_ENV | |
| else | |
| echo "ARM64 binary missing - building AMD64 only" | |
| echo "PLATFORMS=linux/amd64" >> $GITHUB_ENV | |
| fi | |
| echo "Available binaries:" | |
| ls -la dist/ | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Log in to GitHub Container Registry | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ${{ env.GHCR_REGISTRY }} | |
| username: ${{ github.actor }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Extract metadata | |
| id: meta | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: | | |
| ${{ env.GHCR_REGISTRY }}/${{ env.GHCR_IMAGE_NAME }} | |
| tags: | | |
| type=ref,event=branch | |
| type=ref,event=pr | |
| type=match,pattern=v(.*),group=1 | |
| type=raw,value=${{ steps.ref_tag.outputs.version }},enable=${{ steps.ref_tag.outputs.version != '' }} | |
| type=raw,value=${{ steps.ref_tag.outputs.major_minor }},enable=${{ steps.ref_tag.outputs.major_minor != '' }} | |
| type=raw,value=${{ steps.ref_tag.outputs.major }},enable=${{ steps.ref_tag.outputs.major != '' }} | |
| type=raw,value=latest,enable=${{ steps.ref_tag.outputs.version != '' }} | |
| - name: Build and push Docker image | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| platforms: ${{ env.PLATFORMS }} | |
| push: true | |
| tags: ${{ steps.meta.outputs.tags }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| cache-from: type=gha | |
| cache-to: type=gha,mode=max |