@@ -9,11 +9,16 @@ permissions:
99 contents : read
1010 packages : write
1111
12+ env :
13+ REGISTRY_IMAGE : ghcr.io/docker-ruby-nightly/ruby
14+
1215jobs :
1316 set-up-matrix :
1417 name : Set up matrix
1518 runs-on : ubuntu-latest
1619 outputs :
20+ date : ${{ steps.fetch-date.outputs.date }}
21+ images : ${{ steps.fetch-matrix.outputs.images }}
1722 variants : ${{ steps.fetch-variants.outputs.variants }}
1823 json : ${{ steps.fetch-json.outputs.json }}
1924 steps :
@@ -22,22 +27,34 @@ jobs:
2227 run : echo "variants=$(./variants.rb)" >> "$GITHUB_OUTPUT"
2328 - id : fetch-json
2429 run : echo "json=$(./nightly-versions.rb)" >> "$GITHUB_OUTPUT"
30+ - id : fetch-date
31+ run : echo "date=$(jq -r .master.date versions.json)" >> $GITHUB_OUTPUT
32+ - run : ./apply-templates.sh
33+
34+ - id : fetch-matrix
35+ run : echo "images=$(./images.rb)" >> "$GITHUB_OUTPUT"
2536
2637 build :
2738 needs : set-up-matrix
2839 runs-on : ubuntu-latest
2940 strategy :
3041 fail-fast : false
3142 matrix :
32- variant : ${{ fromJson(needs.set-up-matrix.outputs.variants ) }}
33- name : ${{ matrix.variant }}
43+ image : ${{ fromJson(needs.set-up-matrix.outputs.images ) }}
44+ name : ${{ matrix.image. variant }} - ${{ matrix.image.platform }}
3445 steps :
3546 - uses : actions/checkout@v4
3647 - run : echo '${{ needs.set-up-matrix.outputs.json }}' > versions.json
37- - run : echo date=$(jq -r .master.date versions.json) >> $GITHUB_ENV
3848 - run : ./apply-templates.sh
39- - run : echo base=$(ruby -e 's = File.read("master/${{ matrix.variant }}/Dockerfile"); puts s[/FROM (.*)/, 1]') >> $GITHUB_ENV
40- - run : echo platforms=$(./architectures.rb $base) >> $GITHUB_ENV
49+
50+ - name : Docker meta
51+ id : meta
52+ uses : docker/metadata-action@v5
53+ with :
54+ images : ${{ env.REGISTRY_IMAGE }}
55+ tags : |
56+ ${{ matrix.image.variant }}-nightly-${{ needs.set-up-matrix.outputs.date }}
57+ ${{ matrix.image.variant }}-nightly
4158
4259 - name : Set up QEMU
4360 uses : docker/setup-qemu-action@v3
@@ -52,13 +69,77 @@ jobs:
5269 username : ${{ github.repository_owner }}
5370 password : ${{ github.token }}
5471
55- - name : Build and push
72+ - name : Build and push by digest
73+ id : build
5674 uses : docker/build-push-action@v6
57- env :
58- tag1 : ghcr.io/docker-ruby-nightly/ruby:${{ matrix.variant }}-nightly-${{ env.date }}
59- tag2 : ghcr.io/docker-ruby-nightly/ruby:${{ matrix.variant }}-nightly
6075 with :
61- context : ./master/${{ matrix.variant }}
62- push : true
63- platforms : ${{ env.platforms }}
64- tags : ${{ env.tag1 }},${{ env.tag2 }}
76+ context : ./master/${{ matrix.image.variant }}
77+ platforms : ${{ matrix.image.platform }}
78+ outputs : type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
79+
80+ - name : Export digest
81+ run : |
82+ mkdir -p /tmp/digests
83+ digest="${{ steps.build.outputs.digest }}"
84+ touch "/tmp/digests/${digest#sha256:}"
85+
86+ # linux/amd64 => linux-amd64
87+ - run : |
88+ platform=${{ matrix.image.platform }}
89+ echo "platform_safe=${platform//\//-}" >> $GITHUB_ENV
90+
91+ - name : Upload digest
92+ uses : actions/upload-artifact@v4
93+ with :
94+ name : digests-${{ matrix.image.variant }}-${{ env.platform_safe }}
95+ path : /tmp/digests/*
96+ if-no-files-found : error
97+ retention-days : 1
98+
99+ merge :
100+ runs-on : ubuntu-latest
101+ needs :
102+ - build
103+ - set-up-matrix
104+ strategy :
105+ fail-fast : false
106+ matrix :
107+ variant : ${{ fromJson(needs.set-up-matrix.outputs.variants) }}
108+ name : Merge - ${{ matrix.variant }}
109+
110+ steps :
111+ - name : Download digests
112+ uses : actions/download-artifact@v4
113+ with :
114+ path : /tmp/digests
115+ pattern : digests-${{ matrix.variant }}-*
116+ merge-multiple : true
117+
118+ - name : Set up Docker Buildx
119+ uses : docker/setup-buildx-action@v3
120+
121+ - name : Docker meta
122+ id : meta
123+ uses : docker/metadata-action@v5
124+ with :
125+ images : ${{ env.REGISTRY_IMAGE }}
126+ tags : |
127+ ${{ matrix.variant }}-nightly-${{ needs.set-up-matrix.outputs.date }}
128+ ${{ matrix.variant }}-nightly
129+
130+ - name : Login to Github Container Registry
131+ uses : docker/login-action@v3
132+ with :
133+ registry : ghcr.io
134+ username : ${{ github.repository_owner }}
135+ password : ${{ github.token }}
136+
137+ - name : Create manifest list and push
138+ working-directory : /tmp/digests
139+ run : |
140+ docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
141+ $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
142+
143+ - name : Inspect image
144+ run : |
145+ docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
0 commit comments