1- name : Docker Push
1+ name : Docker Push (multi-platform)
22
33on :
44 push :
99 tags :
1010 - ' *'
1111
12+ env :
13+ REGISTRY_IMAGE : mczachurski/vernissage-proxy
14+
1215jobs :
13- deploy :
14- name : Deploy app to DockerHub
15- runs-on : ubuntu-latest
16+ build :
17+ name : Build image for ${{ matrix.platform }}
18+ runs-on : ${{ matrix.runner }}
19+ strategy :
20+ matrix :
21+ platform : [amd64, arm64]
22+ include :
23+ - platform : amd64
24+ runner : ubuntu-24.04
25+ - platform : arm64
26+ runner : ubuntu-24.04-arm
1627 steps :
1728 - name : Checkout
1829 uses : actions/checkout@v4
30+ - name : Prepare
31+ run : |
32+ platform=linux/${{ matrix.platform }}
33+ echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
1934 - name : Docker meta
2035 id : meta
2136 uses : docker/metadata-action@v5
2237 with :
23- images : mczachurski/vernissage-proxy
38+ images : ${{ env.REGISTRY_IMAGE }}
2439 - name : Login to DockerHub
2540 if : github.event_name != 'pull_request'
2641 uses : docker/login-action@v3
2742 with :
2843 username : ${{ secrets.DOCKER_USER }}
2944 password : ${{ secrets.DOCKER_PASSWORD }}
30- - name : Build and push
45+ - name : Set up Docker Buildx
46+ uses : docker/setup-buildx-action@v3
47+ - name : Build and push by digest
48+ id : build
3149 uses : docker/build-push-action@v6
3250 with :
3351 context : .
34- push : ${{ github.event_name != 'pull_request' }}
35- tags : ${{ steps.meta.outputs.tags }}
36- labels : ${{ steps.meta.outputs.labels }}
52+ platforms : linux/${{ matrix.platform }}
53+ labels : ${{ steps.meta.outputs.labels }}
54+ tags : ${{ env.REGISTRY_IMAGE }}
55+ outputs : type=image,push-by-digest=true,name-canonical=true,push=true
56+ - name : Export digest
57+ run : |
58+ mkdir -p ${{ runner.temp }}/digests
59+ digest="${{ steps.build.outputs.digest }}"
60+ touch "${{ runner.temp }}/digests/${digest#sha256:}"
61+ - name : Upload digest
62+ uses : actions/upload-artifact@v4
63+ with :
64+ name : digests-${{ env.PLATFORM_PAIR }}
65+ path : ${{ runner.temp }}/digests/*
66+ if-no-files-found : error
67+ retention-days : 1
68+ merge :
69+ runs-on : ubuntu-24.04
70+ needs :
71+ - build
72+ steps :
73+ - name : Download digests
74+ uses : actions/download-artifact@v4
75+ with :
76+ path : ${{ runner.temp }}/digests
77+ pattern : digests-*
78+ merge-multiple : true
79+ - name : Login to DockerHub
80+ if : github.event_name != 'pull_request'
81+ uses : docker/login-action@v3
82+ with :
83+ username : ${{ secrets.DOCKER_USER }}
84+ password : ${{ secrets.DOCKER_PASSWORD }}
85+ - name : Set up Docker Buildx
86+ uses : docker/setup-buildx-action@v3
87+ - name : Docker meta
88+ id : meta
89+ uses : docker/metadata-action@v5
90+ with :
91+ images : ${{ env.REGISTRY_IMAGE }}
92+ - name : Create manifest list and push
93+ working-directory : ${{ runner.temp }}/digests
94+ run : |
95+ docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
96+ $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
97+ - name : Inspect image
98+ run : |
99+ docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
0 commit comments