Skip to content

Commit 61a1ecd

Browse files
committed
Give fully parallelised build a try
1 parent 4fcf86b commit 61a1ecd

4 files changed

Lines changed: 134 additions & 30 deletions

File tree

.github/workflows/nightly.yml

Lines changed: 94 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,16 @@ permissions:
99
contents: read
1010
packages: write
1111

12+
env:
13+
REGISTRY_IMAGE: ghcr.io/docker-ruby-nightly/ruby
14+
1215
jobs:
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 }}

architectures.rb

Lines changed: 0 additions & 16 deletions
This file was deleted.

images.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/usr/bin/env ruby
2+
3+
require "json"
4+
5+
json = JSON.parse(File.read("versions.json"))
6+
latest_release = json.compact.keys.max_by(&:to_f)
7+
variants = json[latest_release]["variants"]
8+
9+
# Result:
10+
# [
11+
# { "variant": "slim-bullseye", "platform": "linux/amd64" },
12+
# { "variant": "slim-bullseye", "platform": "linux/arm64/v8" },
13+
# { "variant": "slim-bullseye", "platform": "linux/386" },
14+
# { "variant": "alpine3.20", "platform": "linux/amd64" },
15+
# { "variant": "alpine3.20", "platform": "linux/arm64/v8" },
16+
# { "variant": "alpine3.20", "platform": "linux/386" }
17+
# ]
18+
images = variants.map do |variant|
19+
# debian:bullseye-slim
20+
base_image = File.read("master/#{variant}/Dockerfile")[/FROM (.*)/, 1]
21+
manifest_inspect = JSON.parse(`docker manifest inspect #{base_image}`)
22+
23+
# ["linux/amd64", "linux/arm64/v8", "linux/386"]
24+
platforms = manifest_inspect["manifests"].filter_map do |manifest|
25+
platform = manifest["platform"]
26+
next unless platform["os"] == "linux"
27+
28+
optional_variant = "/#{platform['variant']}" if platform['variant']
29+
"#{platform['os']}/#{platform['architecture']}#{optional_variant}"
30+
end
31+
32+
platforms.map { |platform| { variant: variant, platform: platform } }
33+
end.flatten
34+
35+
puts images.to_json

nightly-versions.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,8 @@
2020
"rust" => donor["rust"],
2121
"rustup" => donor["rustup"],
2222
})
23-
puts JSON.generate({ "master" => master })
23+
result = { "master" => master }.to_json
24+
# For step output
25+
puts result
26+
# For apply-templates.sh
27+
File.write("versions.json", result)

0 commit comments

Comments
 (0)