Skip to content

Commit 1e21ea2

Browse files
committedJun 13, 2023
ci: use podman gitlab-runner for multiarch builds
The build runs in two stages: 1. Cross compilation for target architecture on native arch image 2. Installation into target architecture image Currently it requires a third stage to workaround an issue in podman/buildah: containers/buildah#4742 Configuring a gitlab-runner with podman: 1. Follow this documentation: https://docs.gitlab.com/runner/executors/docker.html#use-podman-to-run-docker-commands 2. Install the `crun` and `qemu-user-static` packages
1 parent dabb2c0 commit 1e21ea2

File tree

3 files changed

+151
-193
lines changed

3 files changed

+151
-193
lines changed
 

‎.dockerignore

+1
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ docker/Dockerfile
66
docker-compose.yml
77
arm-build/
88
**/target/
9+
build/

‎.gitlab-ci.yml

+92-166
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# Runner tags:
2+
# - podman: use 'podman' to build multiplatform images
3+
14
stages:
25
- schedule
36
- labels
@@ -40,7 +43,7 @@ check_labels:
4043
.env:
4144
image: paritytech/ci-linux:1.68.2-buster
4245
tags:
43-
- dind
46+
- podman
4447

4548
fmt_and_clippy:
4649
extends: .env
@@ -58,232 +61,155 @@ fmt_and_clippy:
5861
- cargo clippy -- -V
5962
- cargo clippy --all --tests -- -D warnings
6063

61-
build_debug:
62-
extends: .env
63-
rules:
64-
- if: $CI_COMMIT_TAG
65-
when: never
66-
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master"'
67-
changes:
68-
- Cargo.lock
69-
- when: never
64+
.docker_build:
7065
stage: build
7166
script:
72-
- cargo clean -p duniter
73-
- cargo build --locked
74-
- mkdir build
75-
- mv target/debug/duniter build/duniter
76-
artifacts:
77-
paths:
78-
- build/
79-
expire_in: 3 day
80-
cache:
81-
- key:
82-
files:
83-
- Cargo.lock
84-
paths:
85-
- target/debug
86-
policy: push
67+
- echo podman build --layers --tag "$IMAGE_NAME:$IMAGE_TAG" -f docker/Dockerfile $PODMAN_BUILD_OPTIONS .
68+
- podman build --layers --tag "$IMAGE_NAME:$IMAGE_TAG" -f docker/Dockerfile $PODMAN_BUILD_OPTIONS .
69+
tags:
70+
- podman
8771

88-
build_debug_with_cache:
89-
extends: .env
72+
.docker_deploy:
73+
stage: deploy
74+
before_script:
75+
- podman login -u "duniterteam" -p "$DUNITERTEAM_PASSWD" docker.io
76+
tags:
77+
- podman
78+
79+
.docker_deploy_native:
80+
extends: .docker_deploy
81+
script:
82+
- podman push "localhost/$IMAGE_NAME:$IMAGE_TAG" "docker://docker.io/$IMAGE_NAME:$IMAGE_TAG"
83+
84+
.docker_deploy_multiplatform:
85+
extends: .docker_deploy
86+
script:
87+
- podman manifest rm "$MANIFEST" 2>/dev/null || true
88+
- podman build --layers --platform linux/amd64,linux/arm64 --manifest "$MANIFEST" -f docker/Dockerfile $PODMAN_BUILD_OPTIONS .
89+
- podman manifest push --all "$MANIFEST" "docker://docker.io/$IMAGE_NAME:$IMAGE_TAG"
90+
after_script:
91+
- podman manifest rm "$MANIFEST"
92+
variables:
93+
MANIFEST: "localhost/manifest-$IMAGE_NAME:$IMAGE_TAG"
94+
95+
build_debug:
96+
extends: .docker_build
9097
rules:
91-
- changes:
92-
- Cargo.lock
93-
when: never
9498
- if: $CI_COMMIT_TAG
9599
when: never
96100
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master"'
97101
- when: never
98-
stage: build
99-
script:
100-
- cargo clean -p duniter
101-
- cargo build --locked
102-
- mkdir build
103-
- mv target/debug/duniter build/duniter
104-
artifacts:
105-
paths:
106-
- build/
107-
expire_in: 3 day
108-
cache:
109-
- key:
110-
files:
111-
- Cargo.lock
112-
paths:
113-
- target/debug
114-
policy: pull
102+
variables:
103+
IMAGE_NAME: "duniter/duniter-v2s"
104+
IMAGE_TAG: "debug-sha-$CI_COMMIT_SHORT_SHA"
105+
PODMAN_BUILD_OPTIONS: "--build-arg debug=1"
115106

116107
build_release:
117-
extends: .env
108+
extends: .docker_build
118109
rules:
119110
- if: "$CI_COMMIT_TAG && $CI_COMMIT_TAG =~ /^v*/"
120-
- when: never
121-
stage: build
122-
script:
123-
- cargo build --locked --release
124-
- mkdir build
125-
- mv target/release/duniter build/duniter
126-
artifacts:
127-
paths:
128-
- build/
129-
expire_in: 3 day
130-
131-
build_release_manual:
132-
extends: .env
133-
rules:
134-
- if: $CI_COMMIT_TAG
135-
when: never
111+
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master"'
136112
- when: manual
137-
stage: build
138-
allow_failure: true
139-
script:
140-
- cargo build --locked --release
141-
- mkdir build
142-
- mv target/release/duniter build/duniter
143-
artifacts:
144-
paths:
145-
- build/
146-
expire_in: 3 day
113+
variables:
114+
IMAGE_NAME: "duniter/duniter-v2s"
115+
IMAGE_TAG: "sha-$CI_COMMIT_SHORT_SHA"
116+
PODMAN_BUILD_OPTIONS: "--platform linux/amd64"
147117

148-
tests_debug:
149-
extends: .env
118+
test_debug:
119+
stage: tests
120+
extends: .docker_build
150121
rules:
151122
- if: $CI_COMMIT_REF_NAME =~ /^wip*$/
152123
when: manual
153124
- if: $CI_COMMIT_TAG
154125
when: never
155126
- if: '$CI_MERGE_REQUEST_ID || $CI_COMMIT_BRANCH == "master"'
156127
- when: manual
157-
stage: tests
158128
variables:
159-
DUNITER_BINARY_PATH: "../build/duniter"
160-
DUNITER_END2END_TESTS_SPAWN_NODE_TIMEOUT: "20"
161-
script:
162-
- cargo test --workspace --exclude duniter-end2end-tests --exclude duniter-live-tests
163-
- cargo cucumber -i account_creation*
164-
- cargo cucumber -i certification*
165-
- cargo cucumber -i identity_creation*
166-
- cargo cucumber -i monetary_mass*
167-
- cargo cucumber -i oneshot_account*
168-
- cargo cucumber -i transfer_all*
169-
after_script:
170-
- cd target/debug/deps/
171-
- rm cucumber_tests-*.d
172-
- mv cucumber_tests* ../../../build/duniter-cucumber
173-
artifacts:
174-
paths:
175-
- build/
176-
expire_in: 3 day
129+
IMAGE_NAME: "duniter/duniter-v2s-test"
130+
IMAGE_TAG: "debug-sha-$CI_COMMIT_SHORT_SHA"
131+
PODMAN_BUILD_OPTIONS: "--target build --build-arg debug=1 --build-arg cucumber=1"
177132

178-
tests_release:
179-
extends: .env
133+
test_release:
134+
stage: tests
135+
extends: .docker_build
180136
rules:
181137
- if: "$CI_COMMIT_TAG && $CI_COMMIT_TAG =~ /^v*/"
182138
- when: never
183-
stage: tests
184139
variables:
185-
DUNITER_BINARY_PATH: "../build/duniter"
186-
DUNITER_END2END_TESTS_SPAWN_NODE_TIMEOUT: "20"
187-
script:
188-
- cargo test --workspace --exclude duniter-end2end-tests --exclude duniter-live-tests
189-
- cargo cucumber -i account_creation*
190-
- cargo cucumber -i certification*
191-
- cargo cucumber -i identity_creation*
192-
- cargo cucumber -i monetary_mass*
193-
- cargo cucumber -i oneshot_account*
194-
- cargo cucumber -i transfer_all*
195-
after_script:
196-
- cd target/debug/deps/
197-
- rm cucumber_tests-*.d
198-
- mv cucumber_tests* ../../../build/duniter-cucumber
199-
artifacts:
200-
paths:
201-
- build/
202-
expire_in: 3 day
203-
dependencies:
204-
- build_release
140+
IMAGE_NAME: "duniter/duniter-v2s-test"
141+
IMAGE_TAG: "sha-$CI_COMMIT_SHORT_SHA"
142+
PODMAN_BUILD_OPTIONS: "--target build --build-arg cucumber=1"
205143

206-
.docker-build-app-image:
144+
deploy_docker_debug_sha:
207145
stage: deploy
208-
image: docker:18.06
209-
tags:
210-
- docker
211-
services:
212-
- docker:dind
213-
before_script:
214-
- docker info
215-
script:
216-
- docker pull $CI_REGISTRY_IMAGE:$IMAGE_TAG || true
217-
- docker build --cache-from $CI_REGISTRY_IMAGE:$IMAGE_TAG --pull -t "$CI_REGISTRY_IMAGE:$IMAGE_TAG" -f $DOCKERFILE_PATH .
218-
- docker login -u "duniterteam" -p "$DUNITERTEAM_PASSWD"
219-
- docker tag "$CI_REGISTRY_IMAGE:$IMAGE_TAG" "duniter/duniter-v2s:$IMAGE_TAG"
220-
- docker push "duniter/duniter-v2s:$IMAGE_TAG"
221-
222-
deploy_docker_test_image:
223-
extends: .docker-build-app-image
146+
extends: .docker_deploy_native
224147
rules:
225-
- if: $CI_COMMIT_REF_NAME =~ /^wip*$/
226-
when: manual
227-
- if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH == "master"'
148+
- if: $CI_COMMIT_TAG
228149
when: never
229-
- when: manual
230-
allow_failure: true
150+
- if: $CI_COMMIT_BRANCH == "master"
231151
variables:
232-
DOCKERFILE_PATH: "docker/Dockerfile"
233-
IMAGE_TAG: "test-image-$CI_COMMIT_SHORT_SHA"
152+
IMAGE_NAME: "duniter/duniter-v2s"
153+
IMAGE_TAG: "debug-sha-$CI_COMMIT_SHORT_SHA"
234154

235-
deploy_docker_debug_sha:
236-
extends: .docker-build-app-image
155+
deploy_docker_release_sha:
156+
stage: deploy
157+
extends: .docker_deploy_native
237158
rules:
238159
- if: $CI_COMMIT_TAG
239160
when: never
240-
- if: $CI_COMMIT_BRANCH == "master"
161+
- when: manual
241162
variables:
242-
DOCKERFILE_PATH: "docker/Dockerfile"
243-
IMAGE_TAG: "debug-sha-$CI_COMMIT_SHORT_SHA"
244-
after_script:
245-
- docker login -u "duniterteam" -p "$DUNITERTEAM_PASSWD"
246-
- docker tag "duniter/duniter-v2s:$IMAGE_TAG" "duniter/duniter-v2s:debug-latest"
247-
- docker push "duniter/duniter-v2s:debug-latest"
163+
IMAGE_NAME: "duniter/duniter-v2s"
164+
IMAGE_TAG: "sha-$CI_COMMIT_SHORT_SHA"
248165

249-
deploy_docker_release_sha:
250-
extends: .docker-build-app-image
166+
deploy_docker_release_sha_multiplatform:
167+
stage: deploy
168+
needs: ["deploy_docker_release_sha"]
169+
extends: .docker_deploy_multiplatform
251170
rules:
252171
- if: $CI_COMMIT_TAG
253172
when: never
254173
- when: manual
255-
allow_failure: true
256174
variables:
257-
DOCKERFILE_PATH: "docker/Dockerfile"
175+
IMAGE_NAME: "duniter/duniter-v2s"
258176
IMAGE_TAG: "sha-$CI_COMMIT_SHORT_SHA"
259-
dependencies:
260-
- build_release_manual
261177

262178
deploy_docker_release_tag:
263-
extends: .docker-build-app-image
179+
stage: deploy
180+
extends: .docker_deploy_native
264181
rules:
265182
- if: "$CI_COMMIT_TAG && $CI_COMMIT_TAG =~ /^v*/"
266183
- when: never
267184
variables:
268-
DOCKERFILE_PATH: "docker/Dockerfile"
185+
IMAGE_NAME: "duniter/duniter-v2s"
186+
IMAGE_TAG: "$CI_COMMIT_TAG"
187+
188+
deploy_docker_release_tag_multiplatform:
189+
stage: deploy
190+
needs: ["deploy_docker_release_tag"]
191+
extends: .docker_deploy_multiplatform
192+
rules:
193+
- if: "$CI_COMMIT_TAG && $CI_COMMIT_TAG =~ /^v*/"
194+
- when: never
195+
script:
196+
- !reference [.docker_deploy_multiplatform, script]
197+
- podman manifest push --all "$MANIFEST" "docker://docker.io/$IMAGE_NAME:latest"
198+
variables:
199+
IMAGE_NAME: "duniter/duniter-v2s"
269200
IMAGE_TAG: "$CI_COMMIT_TAG"
270-
after_script:
271-
- docker login -u "duniterteam" -p "$DUNITERTEAM_PASSWD"
272-
- docker tag "duniter/duniter-v2s:$IMAGE_TAG" "duniter/duniter-v2s:latest"
273-
- docker push "duniter/duniter-v2s:latest"
274-
dependencies:
275-
- build_release
276201

277202
readme_docker_release_tag:
278203
stage: deploy_readme
204+
needs: ["deploy_docker_release_tag"]
279205
rules:
280206
- if: "$CI_COMMIT_TAG && $CI_COMMIT_TAG =~ /^v*/"
281207
- when: never
282208
image:
283209
name: chko/docker-pushrm
284210
entrypoint: ["/bin/sh", "-c", "/docker-pushrm"]
285211
variables:
286-
DOCKER_USER: "duniterteam"
212+
DOCKER_USER: duniterteam
287213
DOCKER_PASS: "$DUNITERTEAM_PASSWD"
288214
PUSHRM_SHORT: "Duniter v2 based on Substrate framework"
289215
PUSHRM_TARGET: "docker.io/duniter/duniter-v2s"

0 commit comments

Comments
 (0)