@@ -12,18 +12,31 @@ defaults:
1212jobs :
1313 build_amd64 :
1414 runs-on : [self-hosted, x64]
15+ permissions :
16+ packages : write
1517 if : |
1618 github.event_name != 'create' ||
1719 startsWith(github.ref_name, 'tag/')
1820 steps :
1921 - name : Set tag name
2022 run : |
21- if [ "${GITHUB_BASE_REF}" = 'main' ]; then
23+ if [ "${GITHUB_REF_NAME}" = 'main' ]; then
24+ echo "WKDEV_SDK_TAG=latest" >> "${GITHUB_ENV}"
25+ elif [[ "${GITHUB_REF_NAME}" =~ ^tag/(.+)$ ]]; then
26+ echo "WKDEV_SDK_TAG=${BASH_REMATCH[1]}" >> "${GITHUB_ENV}"
27+ else
2228 echo "WKDEV_SDK_TAG=latest" >> "${GITHUB_ENV}"
2329 fi
2430 echo "WKDEV_SDK_CONTAINER_REGISTRY_USER_NAME=$(echo ${GITHUB_REPOSITORY_OWNER} | tr '[:upper:]' '[:lower:]')" >> "${GITHUB_ENV}"
2531 echo "REPO=ghcr.io/$(echo ${GITHUB_REPOSITORY_OWNER} | tr '[:upper:]' '[:lower:]')/wkdev-sdk" >> "${GITHUB_ENV}"
2632
33+ - name : Debug tag information
34+ run : |
35+ echo "GITHUB_REF_NAME=${GITHUB_REF_NAME}"
36+ echo "WKDEV_SDK_TAG=${WKDEV_SDK_TAG}"
37+ echo "REPO=${REPO}"
38+ echo "Full image tag: ${REPO}:${WKDEV_SDK_TAG}_amd64"
39+
2740 - name : Install podman
2841 run : sudo apt-get update && sudo apt-get -y install podman fuse-overlayfs
2942
@@ -41,16 +54,14 @@ jobs:
4154
4255 - name : Clean unrelated images
4356 run : |
44- podman rmi --ignore --force ${REPO}:latest
45- podman manifest rm ${REPO}:latest || true
46- podman rmi --ignore --force ${REPO}:latest_amd64
57+ podman rmi --ignore --force ${REPO}:${WKDEV_SDK_TAG}
58+ podman manifest rm ${REPO}:${WKDEV_SDK_TAG} || true
59+ podman rmi --ignore --force ${REPO}:${WKDEV_SDK_TAG}_amd64
4760
4861 - name : Build image
4962 run : |
50- source ./register-sdk-on-host.sh
51- wkdev-sdk-bakery --mode=build --verbose --arch amd64
63+ podman build -t ${REPO}:${WKDEV_SDK_TAG}_amd64 --arch=amd64 images/wkdev_sdk
5264 podman image list
53- wkdev-sdk-bakery --mode=export --verbose --arch amd64
5465
5566 - name : Test image
5667 run : |
@@ -62,13 +73,11 @@ jobs:
6273 wkdev-enter -n ${CONTAINER} --exec -- ./WebKit/Tools/Scripts/build-webkit --wpe --release --generate-project-only
6374 wkdev-enter -n ${CONTAINER} --exec -- ./WebKit/Tools/Scripts/build-webkit --gtk --release --generate-project-only
6475
65- - name : Archive image
76+ - name : Push image
6677 if : github.ref_name == 'main' || startsWith(github.ref_name, 'tag/')
67- uses : actions/upload-artifact@v4
68- with :
69- name : wkdev-sdk-amd64.tar
70- path : wkdev-sdk-amd64.tar
71- retention-days : 7
78+ run : |
79+ echo "${{ secrets.GITHUB_TOKEN }}" | podman login ghcr.io --username=${GITHUB_REPOSITORY_OWNER} --password-stdin
80+ podman push ${REPO}:${WKDEV_SDK_TAG}_amd64
7281
7382 - name : Cleanup test artifacts
7483 if : always()
@@ -84,18 +93,31 @@ jobs:
8493
8594 build_arm64 :
8695 runs-on : [self-hosted, arch-arm64]
96+ permissions :
97+ packages : write
8798 if : |
8899 github.event_name != 'create' ||
89100 startsWith(github.ref_name, 'tag/')
90101 steps :
91102 - name : Set tag name
92103 run : |
93- if [ "${GITHUB_BASE_REF}" = 'main' ]; then
104+ if [ "${GITHUB_REF_NAME}" = 'main' ]; then
105+ echo "WKDEV_SDK_TAG=latest" >> "${GITHUB_ENV}"
106+ elif [[ "${GITHUB_REF_NAME}" =~ ^tag/(.+)$ ]]; then
107+ echo "WKDEV_SDK_TAG=${BASH_REMATCH[1]}" >> "${GITHUB_ENV}"
108+ else
94109 echo "WKDEV_SDK_TAG=latest" >> "${GITHUB_ENV}"
95110 fi
96111 echo "WKDEV_SDK_CONTAINER_REGISTRY_USER_NAME=$(echo ${GITHUB_REPOSITORY_OWNER} | tr '[:upper:]' '[:lower:]')" >> "${GITHUB_ENV}"
97112 echo "REPO=ghcr.io/$(echo ${GITHUB_REPOSITORY_OWNER} | tr '[:upper:]' '[:lower:]')/wkdev-sdk" >> "${GITHUB_ENV}"
98113
114+ - name : Debug tag information
115+ run : |
116+ echo "GITHUB_REF_NAME=${GITHUB_REF_NAME}"
117+ echo "WKDEV_SDK_TAG=${WKDEV_SDK_TAG}"
118+ echo "REPO=${REPO}"
119+ echo "Full image tag: ${REPO}:${WKDEV_SDK_TAG}_arm64"
120+
99121 - name : Install podman
100122 run : sudo apt-get update && sudo apt-get -y install podman fuse-overlayfs
101123
@@ -113,16 +135,14 @@ jobs:
113135
114136 - name : Clean unrelated images
115137 run : |
116- podman rmi --ignore --force ${REPO}:latest
117- podman manifest rm ${REPO}:latest || true
118- podman rmi --ignore --force ${REPO}:latest_amd64
138+ podman rmi --ignore --force ${REPO}:${WKDEV_SDK_TAG}
139+ podman manifest rm ${REPO}:${WKDEV_SDK_TAG} || true
140+ podman rmi --ignore --force ${REPO}:${WKDEV_SDK_TAG}_arm64
119141
120142 - name : Build image
121143 run : |
122- source ./register-sdk-on-host.sh
123- wkdev-sdk-bakery --mode=build --verbose --arch arm64
144+ podman build -t ${REPO}:${WKDEV_SDK_TAG}_arm64 --arch=arm64 images/wkdev_sdk
124145 podman image list
125- wkdev-sdk-bakery --mode=export --verbose --arch arm64
126146
127147 - name : Test image
128148 run : |
@@ -134,13 +154,11 @@ jobs:
134154 wkdev-enter -n ${CONTAINER} --exec -- ./WebKit/Tools/Scripts/build-webkit --wpe --release --generate-project-only
135155 wkdev-enter -n ${CONTAINER} --exec -- ./WebKit/Tools/Scripts/build-webkit --gtk --release --generate-project-only
136156
137- - name : Archive image
157+ - name : Push image
138158 if : github.ref_name == 'main' || startsWith(github.ref_name, 'tag/')
139- uses : actions/upload-artifact@v4
140- with :
141- name : wkdev-sdk-arm64.tar
142- path : wkdev-sdk-arm64.tar
143- retention-days : 7
159+ run : |
160+ echo "${{ secrets.GITHUB_TOKEN }}" | podman login ghcr.io --username=${GITHUB_REPOSITORY_OWNER} --password-stdin
161+ podman push ${REPO}:${WKDEV_SDK_TAG}_arm64
144162
145163 - name : Cleanup test artifacts
146164 if : always()
@@ -156,18 +174,31 @@ jobs:
156174
157175 build_armv7 :
158176 runs-on : [self-hosted, arch-armv7]
177+ permissions :
178+ packages : write
159179 if : |
160180 github.event_name != 'create' ||
161181 startsWith(github.ref_name, 'tag/')
162182 steps :
163183 - name : Set tag name
164184 run : |
165- if [ "${GITHUB_BASE_REF}" = 'main' ]; then
185+ if [ "${GITHUB_REF_NAME}" = 'main' ]; then
186+ echo "WKDEV_SDK_TAG=latest" >> "${GITHUB_ENV}"
187+ elif [[ "${GITHUB_REF_NAME}" =~ ^tag/(.+)$ ]]; then
188+ echo "WKDEV_SDK_TAG=${BASH_REMATCH[1]}" >> "${GITHUB_ENV}"
189+ else
166190 echo "WKDEV_SDK_TAG=latest" >> "${GITHUB_ENV}"
167191 fi
168192 echo "WKDEV_SDK_CONTAINER_REGISTRY_USER_NAME=$(echo ${GITHUB_REPOSITORY_OWNER} | tr '[:upper:]' '[:lower:]')" >> "${GITHUB_ENV}"
169193 echo "REPO=ghcr.io/$(echo ${GITHUB_REPOSITORY_OWNER} | tr '[:upper:]' '[:lower:]')/wkdev-sdk" >> "${GITHUB_ENV}"
170194
195+ - name : Debug tag information
196+ run : |
197+ echo "GITHUB_REF_NAME=${GITHUB_REF_NAME}"
198+ echo "WKDEV_SDK_TAG=${WKDEV_SDK_TAG}"
199+ echo "REPO=${REPO}"
200+ echo "Full image tag: ${REPO}:${WKDEV_SDK_TAG}_arm"
201+
171202 - name : Install podman
172203 run : sudo apt-get update && sudo apt-get -y install podman fuse-overlayfs
173204
@@ -185,16 +216,14 @@ jobs:
185216
186217 - name : Clean unrelated images
187218 run : |
188- podman rmi --ignore --force ${REPO}:latest
189- podman manifest rm ${REPO}:latest || true
190- podman rmi --ignore --force ${REPO}:latest_amd64
219+ podman rmi --ignore --force ${REPO}:${WKDEV_SDK_TAG}
220+ podman manifest rm ${REPO}:${WKDEV_SDK_TAG} || true
221+ podman rmi --ignore --force ${REPO}:${WKDEV_SDK_TAG}_arm
191222
192223 - name : Build image
193224 run : |
194- source ./register-sdk-on-host.sh
195- wkdev-sdk-bakery --mode=build --verbose --arch arm
225+ podman build -t ${REPO}:${WKDEV_SDK_TAG}_arm --arch=arm images/wkdev_sdk
196226 podman image list
197- wkdev-sdk-bakery --mode=export --verbose --arch arm
198227
199228 - name : Test image
200229 run : |
@@ -206,13 +235,11 @@ jobs:
206235 wkdev-enter -n ${CONTAINER} --exec -- ./WebKit/Tools/Scripts/build-webkit --wpe --release --generate-project-only
207236 wkdev-enter -n ${CONTAINER} --exec -- ./WebKit/Tools/Scripts/build-webkit --gtk --release --generate-project-only
208237
209- - name : Archive image
238+ - name : Push image
210239 if : github.ref_name == 'main' || startsWith(github.ref_name, 'tag/')
211- uses : actions/upload-artifact@v4
212- with :
213- name : wkdev-sdk-arm.tar
214- path : wkdev-sdk-arm.tar
215- retention-days : 7
240+ run : |
241+ echo "${{ secrets.GITHUB_TOKEN }}" | podman login ghcr.io --username=${GITHUB_REPOSITORY_OWNER} --password-stdin
242+ podman push ${REPO}:${WKDEV_SDK_TAG}_arm
216243
217244 - name : Cleanup test artifacts
218245 if : always()
@@ -228,19 +255,32 @@ jobs:
228255
229256 deploy :
230257 runs-on : [self-hosted, x64]
258+ permissions :
259+ packages : write
231260 needs : [build_amd64, build_armv7, build_arm64]
232261 if : |
233262 (github.event_name != 'create' || startsWith(github.ref_name, 'tag/')) &&
234263 (github.ref_name == 'main' || startsWith(github.ref_name, 'tag/'))
235264 steps :
236265 - name : Set tag name
237266 run : |
238- if [ "${GITHUB_BASE_REF}" = 'main' ]; then
267+ if [ "${GITHUB_REF_NAME}" = 'main' ]; then
268+ echo "WKDEV_SDK_TAG=latest" >> "${GITHUB_ENV}"
269+ elif [[ "${GITHUB_REF_NAME}" =~ ^tag/(.+)$ ]]; then
270+ echo "WKDEV_SDK_TAG=${BASH_REMATCH[1]}" >> "${GITHUB_ENV}"
271+ else
239272 echo "WKDEV_SDK_TAG=latest" >> "${GITHUB_ENV}"
240273 fi
241274 echo "WKDEV_SDK_CONTAINER_REGISTRY_USER_NAME=$(echo ${GITHUB_REPOSITORY_OWNER} | tr '[:upper:]' '[:lower:]')" >> "${GITHUB_ENV}"
242275 echo "REPO=ghcr.io/$(echo ${GITHUB_REPOSITORY_OWNER} | tr '[:upper:]' '[:lower:]')/wkdev-sdk" >> "${GITHUB_ENV}"
243276
277+ - name : Debug tag information
278+ run : |
279+ echo "GITHUB_REF_NAME=${GITHUB_REF_NAME}"
280+ echo "WKDEV_SDK_TAG=${WKDEV_SDK_TAG}"
281+ echo "REPO=${REPO}"
282+ echo "Multi-arch manifest tag: ${REPO}:${WKDEV_SDK_TAG}"
283+
244284 - name : Install podman
245285 run : sudo apt-get update && sudo apt-get -y install podman fuse-overlayfs
246286
@@ -256,28 +296,60 @@ jobs:
256296 - name : Checkout repo
257297 uses : actions/checkout@v4
258298
259- - name : Download images
260- uses : actions/download-artifact@v4
261- with :
262- pattern : wkdev-sdk-*
263- merge-multiple : true
264- - run : ls -al
299+ - name : Login to registry
300+ run : echo "${{ secrets.GITHUB_TOKEN }}" | podman login ghcr.io --username=${GITHUB_REPOSITORY_OWNER} --password-stdin
301+
302+ - name : Validate all architecture images exist in registry
303+ id : validate
304+ run : |
305+ VALIDATION_FAILED=0
306+ for arch in amd64 arm64 arm; do
307+ if ! podman manifest inspect docker://${REPO}:${WKDEV_SDK_TAG}_${arch} > /dev/null 2>&1; then
308+ echo "Error: Image ${REPO}:${WKDEV_SDK_TAG}_${arch} does not exist in registry"
309+ VALIDATION_FAILED=1
310+ else
311+ echo "Validated: ${REPO}:${WKDEV_SDK_TAG}_${arch} exists in registry"
312+ fi
313+ done
314+ if [ $VALIDATION_FAILED -eq 1 ]; then
315+ echo "validation_failed=true" >> $GITHUB_OUTPUT
316+ exit 1
317+ fi
318+ echo "validation_failed=false" >> $GITHUB_OUTPUT
265319
266- - name : Clean all previous images
320+ - name : Clean up arch-specific images on validation failure
321+ if : failure() && steps.validate.outputs.validation_failed == 'true'
267322 run : |
268- podman rmi --ignore --force ${REPO}:latest
269- podman manifest rm ${REPO}:latest || true
270- podman rmi --ignore --force ${REPO}:latest_arm64
271- podman rmi --ignore --force ${REPO}:latest_amd64
272- podman rmi --ignore --force ${REPO}:latest_arm
323+ echo "Validation failed, cleaning up any pushed arch-specific images from registry..."
324+ for arch in amd64 arm64 arm; do
325+ if podman manifest inspect docker://${REPO}:${WKDEV_SDK_TAG}_${arch} > /dev/null 2>&1; then
326+ echo "Deleting ${REPO}:${WKDEV_SDK_TAG}_${arch} from registry..."
327+ podman rmi docker://${REPO}:${WKDEV_SDK_TAG}_${arch} || true
328+ fi
329+ done
330+
331+ - name : Clean all previous local images
332+ run : |
333+ podman rmi --ignore --force ${REPO}:${WKDEV_SDK_TAG}
334+ podman manifest rm ${REPO}:${WKDEV_SDK_TAG} || true
335+ podman rmi --ignore --force ${REPO}:${WKDEV_SDK_TAG}_arm64
336+ podman rmi --ignore --force ${REPO}:${WKDEV_SDK_TAG}_amd64
337+ podman rmi --ignore --force ${REPO}:${WKDEV_SDK_TAG}_arm
273338
274- - name : Deploy image
339+ - name : Create and push multi-arch manifest
275340 run : |
276- podman load < ./wkdev-sdk-amd64.tar
277- podman load < ./wkdev-sdk-arm64.tar
278- podman load < ./wkdev-sdk-arm.tar
279- podman image list
280341 echo "${{ secrets.GITHUB_TOKEN }}" | podman login ghcr.io --username=${GITHUB_REPOSITORY_OWNER} --password-stdin
281- source ./register-sdk-on-host.sh
282- wkdev-sdk-bakery --mode=deploy --verbose --multiarch
283- podman image list
342+ podman manifest create ${REPO}:${WKDEV_SDK_TAG}
343+ podman manifest add ${REPO}:${WKDEV_SDK_TAG} docker://${REPO}:${WKDEV_SDK_TAG}_amd64
344+ podman manifest add ${REPO}:${WKDEV_SDK_TAG} docker://${REPO}:${WKDEV_SDK_TAG}_arm64
345+ podman manifest add ${REPO}:${WKDEV_SDK_TAG} docker://${REPO}:${WKDEV_SDK_TAG}_arm
346+ podman manifest push --all ${REPO}:${WKDEV_SDK_TAG} docker://${REPO}:${WKDEV_SDK_TAG}
347+
348+ - name : Clean up arch-specific tags from registry
349+ if : success()
350+ run : |
351+ echo "Multi-arch manifest successfully pushed, cleaning up arch-specific tags from registry..."
352+ for arch in amd64 arm64 arm; do
353+ echo "Deleting ${REPO}:${WKDEV_SDK_TAG}_${arch} from registry..."
354+ podman rmi docker://${REPO}:${WKDEV_SDK_TAG}_${arch} || true
355+ done
0 commit comments