name: Publish Docker images
on:
  push:
  pull_request:

jobs:
  push_to_registry:
    name: Push Docker image to GitHub Packages
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        llvm: [11, 12, 13, 14, 15, 16, 17, 18, 19]
        ubuntu: [20, 22, 24]
        exclude:
          - ubuntu: 22
            llvm: 11
          - ubuntu: 22
            llvm: 12
          - ubuntu: 24
            llvm: 11
          - ubuntu: 24
            llvm: 12
          - ubuntu: 24
            llvm: 13
          - ubuntu: 24
            llvm: 14
          - ubuntu: 24
            llvm: 15
          - ubuntu: 24
            llvm: 16
    permissions:
      packages: write
      contents: read
    env:
      REGISTRY: ghcr.io
      IMAGE_NAME: ${{ github.repository }}/ubuntu-${{ matrix.ubuntu }}-llvm-${{ matrix.llvm }}
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4
        
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        with:
          platforms: linux/amd64,linux/arm64
          
      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v3
        
      - name: Log in to GitHub Docker Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
          
      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          
      - name: Build and push Docker image (amd64 & arm64)
        uses: docker/build-push-action@v6
        with:
          context: .
          push: ${{ startsWith(github.ref, 'refs/tags/v') }}
          builder: ${{ steps.buildx.outputs.name }}
          platforms: linux/amd64,linux/arm64
          provenance: false
          build-args: | 
            LLVM_VERSION=${{ matrix.llvm }}
            UBUNTU_VERSION=${{ matrix.ubuntu }}.04
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max