Add workflow to build and push images #1
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: Create and publish Docker images | |
| on: | |
| push: | |
| branches: | |
| - main | |
| - master | |
| - v0.* | |
| pull_request: | |
| branches: | |
| - main | |
| - master | |
| - v0.* | |
| env: | |
| IMAGE_NAME: ${{ github.repository }} | |
| IMAGE_REGISTRY: ghcr.io | |
| REGISTRY_USER: ${{ github.actor }} | |
| REGISTRY_PASSWORD: ${{ github.token }} | |
| jobs: | |
| build-amd64: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
| - name: Log in to the Container registry | |
| uses: docker/login-action@40891eba8c2bcd1309b07ba8b11232f313e86779 | |
| with: | |
| registry: ${{ env.IMAGE_REGISTRY }} | |
| username: ${{ env.REGISTRY_USER }} | |
| password: ${{ env.REGISTRY_PASSWORD }} | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@988b5a0280414f521da01fcc63a27aeeb4b104db | |
| - name: Extract metadata (tags, labels) for Docker | |
| id: meta | |
| uses: docker/metadata-action@c4ee3adeed93b1fa6a762f209fb01608c1a22f1e | |
| with: | |
| images: ${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_NAME }} | |
| flavor: | | |
| suffix=-amd64 | |
| tags: | | |
| type=schedule | |
| type=ref,event=branch | |
| type=ref,event=tag | |
| type=ref,event=pr | |
| type=sha,format=long | |
| - name: Print tags for debugging | |
| run: | | |
| echo "tags: ${{ steps.meta.outputs.tags }}" | |
| echo "labels: ${{ steps.meta.outputs.labels }}" | |
| - name: Build and push Docker image | |
| uses: docker/build-push-action@91df6b874e498451163feb47610c87c4a218c1ee | |
| with: | |
| platforms: linux/amd64 | |
| push: true | |
| build-args: | | |
| DOCKER_METADATA_OUTPUT_JSON | |
| tags: ${{ steps.meta.outputs.tags }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| build-arm64: | |
| runs-on: ubuntu-22.04-arm | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
| - name: Log in to the Container registry | |
| uses: docker/login-action@40891eba8c2bcd1309b07ba8b11232f313e86779 | |
| with: | |
| registry: ${{ env.IMAGE_REGISTRY }} | |
| username: ${{ env.REGISTRY_USER }} | |
| password: ${{ env.REGISTRY_PASSWORD }} | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@988b5a0280414f521da01fcc63a27aeeb4b104db | |
| - name: Extract metadata (tags, labels) for Docker | |
| id: meta | |
| uses: docker/metadata-action@c4ee3adeed93b1fa6a762f209fb01608c1a22f1e | |
| with: | |
| images: ${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_NAME }} | |
| flavor: | | |
| suffix=-arm64 | |
| tags: | | |
| type=schedule | |
| type=ref,event=branch | |
| type=ref,event=tag | |
| type=ref,event=pr | |
| type=sha,format=long | |
| - name: Print tags for debugging | |
| run: | | |
| echo "tags: ${{ steps.meta.outputs.tags }}" | |
| echo "labels: ${{ steps.meta.outputs.labels }}" | |
| - name: Build and push Docker image | |
| uses: docker/build-push-action@91df6b874e498451163feb47610c87c4a218c1ee | |
| with: | |
| platforms: linux/arm64 | |
| push: true | |
| build-args: | | |
| DOCKER_METADATA_OUTPUT_JSON | |
| tags: ${{ steps.meta.outputs.tags }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| create-multi-arch-manifest: | |
| runs-on: ubuntu-latest | |
| needs: | |
| - build-amd64 | |
| - build-arm64 | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
| - name: Log in to the Container registry | |
| uses: docker/login-action@40891eba8c2bcd1309b07ba8b11232f313e86779 | |
| with: | |
| registry: ${{ env.IMAGE_REGISTRY }} | |
| username: ${{ env.REGISTRY_USER }} | |
| password: ${{ env.REGISTRY_PASSWORD }} | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@988b5a0280414f521da01fcc63a27aeeb4b104db | |
| - name: Extract metadata (tags, labels) for Docker | |
| id: meta | |
| uses: docker/metadata-action@c4ee3adeed93b1fa6a762f209fb01608c1a22f1e | |
| with: | |
| images: ${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_NAME }} | |
| tags: | | |
| type=schedule | |
| type=ref,event=branch | |
| type=ref,event=tag | |
| type=ref,event=pr | |
| type=sha,format=long | |
| - name: Print tags for debugging | |
| run: | | |
| echo "tags: ${{ steps.meta.outputs.tags }}" | |
| echo "labels: ${{ steps.meta.outputs.labels }}" | |
| - name: Create multi-arch manifests | |
| run: | | |
| tags="${{ steps.meta.outputs.tags }}" | |
| IFS=$'\n' | |
| for tag in $tags; do | |
| echo "Creating manifest for $tag" | |
| # Combine all manifests into a single manifest | |
| __amd64_digests=$(docker manifest inspect ${tag}-amd64 | jq -r '.manifests[] | .digest') | |
| __arm64_digests=$(docker manifest inspect ${tag}-arm64 | jq -r '.manifests[] | .digest') | |
| __sources=() | |
| for digest in $__amd64_digests; do | |
| __sources+=(${IMAGE_REGISTRY}/${IMAGE_NAME}@${digest}) | |
| done | |
| for digest in $__arm64_digests; do | |
| __sources+=(${IMAGE_REGISTRY}/${IMAGE_NAME}@${digest}) | |
| done | |
| docker manifest create ${tag} ${__sources[@]} | |
| docker manifest push ${tag} | |
| done |