Skip to content

Commit fc61b8a

Browse files
DEV: Introduce arm64 dev image and multi-arch manifests (#829)
- Combines dev image build into the `base` job - Calculates a single timestamp for all builds - Pushes timestamped per-arch images to Dockerhub for base, base-slim and dev images - If both arch build jobs are successful, multiarch manifests are generated & pushed
1 parent b110891 commit fc61b8a

File tree

2 files changed

+99
-55
lines changed

2 files changed

+99
-55
lines changed

.github/workflows/build.yml

Lines changed: 82 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,19 @@ env:
1414
BUILDKIT_PROGRESS: plain
1515
DISCOURSE_TURBO_RSPEC_RETRY_AND_LOG_FLAKY_TESTS: true
1616

17+
1718
jobs:
19+
timestamp:
20+
runs-on: ubuntu-latest
21+
outputs:
22+
timestamp: ${{ steps.timestamp.outputs.timestamp }}
23+
steps:
24+
- id: timestamp
25+
run: |
26+
timestamp=`date +%Y%m%d-%H%M`
27+
echo "timestamp=$timestamp"
28+
echo "timestamp=$timestamp" >> $GITHUB_OUTPUT
29+
1830
base:
1931
# `unbuntu-22.04-8core` for arch amd64 non-scheduled builds
2032
# `unbuntu-22.04` for arch amd64 scheduled builds
@@ -25,58 +37,102 @@ jobs:
2537
matrix:
2638
arch: [amd64, arm64]
2739
timeout-minutes: ${{ (github.event_name != 'schedule' && 30) || ((matrix.arch == 'arm64' && 60) || 30) }}
40+
needs: timestamp
41+
env:
42+
ARCH: ${{matrix.arch}}
43+
TIMESTAMP: ${{ needs.timestamp.outputs.timestamp }}
2844
steps:
2945
- uses: actions/checkout@v3
3046
with:
3147
fetch-depth: 1
32-
- name: Set arch helper output
33-
id: arch-helper
34-
run: |
35-
echo "arch_postfix_dash=${{ (matrix.arch == 'arm64' && '-arm64') || '' }}" >> $GITHUB_OUTPUT
36-
echo "arch_postfix_underscore=${{ (matrix.arch == 'arm64' && '_arm64') || '' }}" >> $GITHUB_OUTPUT
3748
- name: build slim image
3849
run: |
39-
cd image && ruby auto_build.rb base_slim${{ steps.arch-helper.outputs.arch_postfix_underscore }}
50+
cd image && ruby auto_build.rb base_slim_$ARCH
4051
- name: tag slim images
41-
id: tag-images
4252
run: |
43-
TAG=`date +%Y%m%d-%H%M`
44-
echo "tag=$(echo $TAG)" >> $GITHUB_OUTPUT
45-
docker tag discourse/base:build_slim${{ steps.arch-helper.outputs.arch_postfix_underscore }} discourse/base:2.0.$TAG-slim${{ steps.arch-helper.outputs.arch_postfix_dash }}
46-
docker tag discourse/base:build_slim${{ steps.arch-helper.outputs.arch_postfix_underscore }} discourse/base:slim${{ steps.arch-helper.outputs.arch_postfix_dash }}
53+
docker tag discourse/base:build_slim_$ARCH discourse/base:2.0.$TIMESTAMP-slim-$ARCH
54+
docker tag discourse/base:build_slim_$ARCH discourse/base:slim-$ARCH
4755
- name: build release image
4856
run: |
49-
cd image && ruby auto_build.rb base${{ steps.arch-helper.outputs.arch_postfix_underscore }}
50-
- name: tag amd64 release images
57+
cd image && ruby auto_build.rb base_$ARCH
58+
- name: tag release images
5159
run: |
52-
TAG=${{ steps.tag-images.outputs.tag }}
53-
docker tag discourse/base:build${{ steps.arch-helper.outputs.arch_postfix_underscore }} discourse/base:2.0.$TAG${{ steps.arch-helper.outputs.arch_postfix_dash }}
54-
docker tag discourse/base:build${{ steps.arch-helper.outputs.arch_postfix_underscore }} discourse/base:release${{ steps.arch-helper.outputs.arch_postfix_dash }}
60+
docker tag discourse/base:build_$ARCH discourse/base:2.0.$TIMESTAMP-$ARCH
61+
docker tag discourse/base:build_$ARCH discourse/base:release-$ARCH
5562
- name: build test_build image
5663
run: |
57-
cd image && ruby auto_build.rb discourse_test_build${{ steps.arch-helper.outputs.arch_postfix_underscore }}
64+
cd image && ruby auto_build.rb discourse_test_build_$ARCH
5865
- name: run specs
5966
run: |
60-
docker run --rm -e RUBY_ONLY=1 -e USE_TURBO=1 -e SKIP_PLUGINS=1 -e SKIP_LINT=1 discourse/discourse_test:build${{ steps.arch-helper.outputs.arch_postfix_underscore }}
67+
docker run --rm -e RUBY_ONLY=1 -e USE_TURBO=1 -e SKIP_PLUGINS=1 -e SKIP_LINT=1 discourse/discourse_test:build_$ARCH
68+
- name: build & tag dev image
69+
run: |
70+
cd image && ruby auto_build.rb discourse_dev_$ARCH
71+
docker tag discourse/discourse_dev:build_$ARCH discourse/discourse_dev:$TIMESTAMP-$ARCH
6172
- name: Print summary
6273
run: |
6374
docker images discourse/base
6475
- name: push to dockerhub
65-
if: success() && (github.ref == 'refs/heads/main')
76+
if: github.ref == 'refs/heads/main'
6677
env:
6778
DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }}
6879
run: |
69-
TAG=${{ steps.tag-images.outputs.tag }}
7080
docker login --username discoursebuild --password $DOCKERHUB_PASSWORD
71-
docker push discourse/base:2.0.$TAG-slim${{ steps.arch-helper.outputs.arch_postfix_dash }}
72-
docker push discourse/base:slim${{ steps.arch-helper.outputs.arch_postfix_dash }}
73-
docker push discourse/base:2.0.$TAG${{ steps.arch-helper.outputs.arch_postfix_dash }}
74-
docker push discourse/base:release${{ steps.arch-helper.outputs.arch_postfix_dash }}
81+
docker push discourse/base:2.0.$TIMESTAMP-slim-$ARCH
82+
docker push discourse/base:2.0.$TIMESTAMP-$ARCH
83+
docker push discourse/discourse_dev:$TIMESTAMP-$ARCH
7584
- name: Push discourse/base:aarch64 image for backwards compatibility
76-
if: success() && (github.ref == 'refs/heads/main') && (matrix.arch == 'arm64')
85+
if: (github.ref == 'refs/heads/main') && (matrix.arch == 'arm64')
7786
run: |
78-
docker tag discourse/base:release${{ steps.arch-helper.outputs.arch_postfix_dash }} discourse/base:aarch64
87+
docker tag discourse/base:2.0.$TIMESTAMP-$ARCH discourse/base:aarch64
7988
docker push discourse/base:aarch64
89+
push_multiarch_manifests:
90+
runs-on: ubuntu-latest
91+
needs: [base, timestamp]
92+
env:
93+
TIMESTAMP: ${{ needs.timestamp.outputs.timestamp }}
94+
if: github.ref == 'refs/heads/main'
95+
steps:
96+
- name: create and push multiarch manifests
97+
run: |
98+
docker login --username discoursebuild --password ${{ secrets.DOCKERHUB_PASSWORD }}
99+
100+
# Slim timestamped
101+
docker manifest create discourse/base:2.0.$TIMESTAMP-slim \
102+
-a discourse/base:2.0.$TIMESTAMP-slim-amd64 \
103+
-a discourse/base:2.0.$TIMESTAMP-slim-arm64
104+
105+
# Slim release
106+
docker manifest create discourse/base:release-slim \
107+
-a discourse/base:2.0.$TIMESTAMP-slim-amd64 \
108+
-a discourse/base:2.0.$TIMESTAMP-slim-arm64
109+
110+
# Full timestamped
111+
docker manifest create discourse/base:2.0.$TIMESTAMP \
112+
-a discourse/base:2.0.$TIMESTAMP-amd64 \
113+
-a discourse/base:2.0.$TIMESTAMP-arm64
114+
115+
# Full release
116+
docker manifest create discourse/base:release \
117+
-a discourse/base:2.0.$TIMESTAMP-amd64 \
118+
-a discourse/base:2.0.$TIMESTAMP-arm64
119+
120+
# Dev timestamped
121+
docker manifest create discourse/discourse_dev:$TIMESTAMP \
122+
-a discourse/discourse_dev:$TIMESTAMP-amd64 \
123+
-a discourse/discourse_dev:$TIMESTAMP-arm64
124+
125+
# Dev release
126+
docker manifest create discourse/discourse_dev:release \
127+
-a discourse/discourse_dev:$TIMESTAMP-amd64 \
128+
-a discourse/discourse_dev:$TIMESTAMP-arm64
129+
130+
docker manifest push discourse/base:2.0.$TIMESTAMP-slim
131+
docker manifest push discourse/base:release-slim
132+
docker manifest push discourse/base:2.0.$TIMESTAMP
133+
docker manifest push discourse/base:release
134+
docker manifest push discourse/discourse_dev:$TIMESTAMP
135+
docker manifest push discourse/discourse_dev:release
80136
test:
81137
runs-on: ubuntu-22.04${{ ((github.event_name != 'schedule') && '-8core') || '' }}
82138
timeout-minutes: 30
@@ -118,22 +174,3 @@ jobs:
118174
docker push discourse/discourse_test:slim
119175
docker push discourse/discourse_test:slim-browsers
120176
docker push discourse/discourse_test:release
121-
dev:
122-
runs-on: ubuntu-22.04${{ ((github.event_name != 'schedule') && '-8core') || '' }}
123-
timeout-minutes: 30
124-
needs: base
125-
steps:
126-
- uses: actions/checkout@v3
127-
with:
128-
fetch-depth: 1
129-
- name: build discourse_dev image
130-
run: |
131-
cd image && ruby auto_build.rb discourse_dev
132-
- name: push to dockerhub
133-
if: success() && (github.ref == 'refs/heads/main')
134-
env:
135-
DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }}
136-
run: |
137-
docker tag discourse/discourse_dev:build discourse/discourse_dev:release
138-
docker login --username discoursebuild --password $DOCKERHUB_PASSWORD
139-
docker push discourse/discourse_dev:release

image/auto_build.rb

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,46 @@
44
require "optparse"
55

66
images = {
7-
base_slim: {
7+
base_slim_amd64: {
88
name: "base",
9-
tag: "discourse/base:build_slim",
9+
tag: "discourse/base:build_slim_amd64",
1010
extra_args: "-f slim.Dockerfile",
1111
},
1212
base_slim_arm64: {
1313
name: "base",
1414
tag: "discourse/base:build_slim_arm64",
1515
extra_args: "-f slim.Dockerfile --platform linux/arm64",
1616
},
17-
base: {
17+
base_amd64: {
1818
name: "base",
19-
tag: "discourse/base:build",
20-
extra_args: "-f release.Dockerfile",
19+
tag: "discourse/base:build_amd64",
20+
extra_args: "-f release.Dockerfile --build-arg=\"tag=build_slim_amd64\"",
2121
},
2222
base_arm64: {
2323
name: "base",
2424
tag: "discourse/base:build_arm64",
2525
extra_args: "-f release.Dockerfile --platform linux/arm64 --build-arg=\"tag=build_slim_arm64\"",
2626
},
27-
discourse_test_build: {
27+
discourse_test_build_amd64: {
2828
name: "discourse_test",
29-
tag: "discourse/discourse_test:build",
29+
tag: "discourse/discourse_test:build_amd64",
30+
extra_args: "--build-arg=\"from_tag=build_amd64\"",
3031
},
3132
discourse_test_build_arm64: {
3233
name: "discourse_test",
3334
tag: "discourse/discourse_test:build_arm64",
3435
extra_args: "--platform linux/arm64 --build-arg=\"from_tag=build_arm64\"",
3536
},
36-
discourse_dev: {
37+
discourse_dev_amd64: {
3738
name: "discourse_dev",
38-
tag: "discourse/discourse_dev:build",
39+
tag: "discourse/discourse_dev:build_amd64",
40+
extra_args: "--build-arg=\"from_tag=build_slim_amd64\""
3941
},
42+
discourse_dev_arm64: {
43+
name: "discourse_dev",
44+
tag: "discourse/discourse_dev:build_arm64",
45+
extra_args: "--platform linux/arm64 --build-arg=\"from_tag=build_slim_arm64\""
46+
}
4047
}
4148

4249
def run(command)
@@ -94,7 +101,7 @@ def dev_deps()
94101
end
95102

96103
puts "Building #{images[image]}"
97-
dev_deps() if image == :discourse_dev
104+
dev_deps() if image == :discourse_dev_amd64 || image == :discourse_dev_arm64
98105

99106
build(images[image], ARGV[1..-1].join(" "))
100107
end

0 commit comments

Comments
 (0)