portail 2.1.0

Unified proxy/gateway: AI Gateway + MCP Gateway + CDN cache
Documentation
name: Docker

# Architecture: Triggered on version tags (v*). Builds multi-arch Docker images
# (linux/amd64 + linux/arm64) using Docker Buildx with QEMU emulation.
# Pushes to ghcr.io with SBOM and provenance attestations.
# Signs the image with cosign (keyless via GitHub OIDC).
# The self-hosted runner on dev-cx53 handles the build.

on:
  push:
    tags: ["v*"]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build:
    runs-on: self-hosted
    permissions:
      contents: read
      packages: write
      id-token: write

    steps:
      - uses: actions/checkout@v7

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v4

      - name: Log in to ghcr.io
        uses: docker/login-action@v4
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Generate image metadata
        id: meta
        uses: docker/metadata-action@v6
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          tags: |
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=semver,pattern={{major}}
            type=edge

      - name: Build and push (multi-arch)
        id: build
        uses: docker/build-push-action@v7
        with:
          context: .
          push: true
          platforms: linux/amd64,linux/arm64
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
          sbom: true
          provenance: true

      - name: Install cosign
        uses: sigstore/cosign-installer@v4

      - name: Sign container image (keyless)
        run: |
          cosign sign --yes \
            --recursive \
            ${{ steps.meta.outputs.tags }}

      - name: Verify signature
        run: |
          cosign verify --yes \
            ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}