changeset-operations@v0.1.3, cargo-changeset@v0.1.4 #5
Workflow file for this run
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: Publish Docker Image | |
| on: | |
| push: | |
| tags: | |
| - "cargo-changeset@v*" | |
| workflow_dispatch: | |
| inputs: | |
| tag: | |
| description: "Tag to publish (e.g. cargo-changeset@v0.1.0). Uses latest git tag if empty." | |
| required: false | |
| env: | |
| GHCR_IMAGE: ghcr.io/lukidoescode/cargo-changeset | |
| jobs: | |
| build: | |
| runs-on: ${{ matrix.runner }} | |
| environment: docker publish | |
| env: | |
| DOCKERHUB_IMAGE: ${{ secrets.DOCKERHUB_USERNAME }}/cargo-changeset | |
| permissions: | |
| contents: read | |
| packages: write | |
| strategy: | |
| matrix: | |
| include: | |
| - platform: linux/amd64 | |
| runner: ubuntu-latest | |
| digest-name: linux-amd64 | |
| - platform: linux/arm64 | |
| runner: ubuntu-24.04-arm | |
| digest-name: linux-arm64 | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| persist-credentials: false | |
| - name: Extract metadata | |
| id: meta | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: | | |
| ${{ env.GHCR_IMAGE }} | |
| ${{ env.DOCKERHUB_IMAGE }} | |
| - name: Log in to GHCR | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ghcr.io | |
| username: ${{ github.actor }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Log in to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Set up Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Build and push by digest | |
| id: build | |
| uses: docker/build-push-action@v6 | |
| with: | |
| context: . | |
| platforms: ${{ matrix.platform }} | |
| labels: ${{ steps.meta.outputs.labels }} | |
| outputs: type=image,"name=${{ env.GHCR_IMAGE }},${{ env.DOCKERHUB_IMAGE }}",push-by-digest=true,name-canonical=true,push=true | |
| - name: Export digest | |
| run: | # zizmor: ignore[template-injection] | |
| mkdir -p /tmp/digests | |
| digest="${{ steps.build.outputs.digest }}" | |
| touch "/tmp/digests/${digest#sha256:}" | |
| - name: Upload digest | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: digests-${{ matrix.digest-name }} | |
| path: /tmp/digests/* | |
| if-no-files-found: error | |
| retention-days: 1 | |
| merge: | |
| runs-on: ubuntu-latest | |
| needs: build | |
| environment: docker publish | |
| env: | |
| DOCKERHUB_IMAGE: ${{ secrets.DOCKERHUB_USERNAME }}/cargo-changeset | |
| permissions: | |
| contents: read | |
| packages: write | |
| steps: | |
| - name: Download digests | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: /tmp/digests | |
| pattern: digests-* | |
| merge-multiple: true | |
| - name: Log in to GHCR | |
| uses: docker/login-action@v3 | |
| with: | |
| registry: ghcr.io | |
| username: ${{ github.actor }} | |
| password: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Log in to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Set up Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Extract metadata for GHCR | |
| id: meta-ghcr | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: ${{ env.GHCR_IMAGE }} | |
| tags: | | |
| type=match,pattern=cargo-changeset@v(.*),group=1 | |
| type=raw,value=latest | |
| - name: Extract metadata for Docker Hub | |
| id: meta-dockerhub | |
| uses: docker/metadata-action@v5 | |
| with: | |
| images: ${{ env.DOCKERHUB_IMAGE }} | |
| tags: | | |
| type=match,pattern=cargo-changeset@v(.*),group=1 | |
| type=raw,value=latest | |
| - name: Create multi-arch manifest for GHCR | |
| working-directory: /tmp/digests | |
| run: | # zizmor: ignore[template-injection] | |
| # shellcheck disable=SC2046 | |
| docker buildx imagetools create \ | |
| $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< '${{ steps.meta-ghcr.outputs.json }}') \ | |
| $(printf '${{ env.GHCR_IMAGE }}@sha256:%s ' *) | |
| - name: Create multi-arch manifest for Docker Hub | |
| working-directory: /tmp/digests | |
| run: | # zizmor: ignore[template-injection] | |
| # shellcheck disable=SC2046 | |
| docker buildx imagetools create \ | |
| $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< '${{ steps.meta-dockerhub.outputs.json }}') \ | |
| $(printf '${{ env.DOCKERHUB_IMAGE }}@sha256:%s ' *) | |
| - name: Inspect GHCR manifest | |
| run: docker buildx imagetools inspect ${{ env.GHCR_IMAGE }}:latest # zizmor: ignore[template-injection] | |
| - name: Inspect Docker Hub manifest | |
| run: docker buildx imagetools inspect ${{ env.DOCKERHUB_IMAGE }}:latest # zizmor: ignore[template-injection] |