1515env :
1616 REGISTRY : ghcr.io
1717jobs :
18+ build-toolchain :
19+ name : Build LLVM7 base (${{ matrix.variance.name }} / ${{ matrix.platform.arch }})
20+ runs-on : ${{ matrix.platform.runner }}
21+ permissions :
22+ contents : read
23+ packages : write
24+ strategy :
25+ fail-fast : false
26+ matrix :
27+ platform :
28+ - runner : ubuntu-latest
29+ arch : amd64
30+ - runner : ubuntu-24.04-arm
31+ arch : arm64
32+ variance :
33+ - name : Ubuntu-22.04
34+ toolchain_image : " rust-gpu/rust-cuda-ubuntu22-llvm7"
35+ toolchain_dockerfile : ./container/llvm7-ubuntu22/Dockerfile
36+ toolchain_artifact : llvm7-ubuntu22
37+ - name : Ubuntu-24.04
38+ toolchain_image : " rust-gpu/rust-cuda-ubuntu24-llvm7"
39+ toolchain_dockerfile : ./container/llvm7-ubuntu24/Dockerfile
40+ toolchain_artifact : llvm7-ubuntu24
41+ - name : RockyLinux-9
42+ toolchain_image : " rust-gpu/rust-cuda-rockylinux9-llvm7"
43+ toolchain_dockerfile : ./container/llvm7-rockylinux9/Dockerfile
44+ toolchain_artifact : llvm7-rockylinux9
45+ steps :
46+ - name : Checkout repository
47+ uses : actions/checkout@v4
48+ - name : Validate platform
49+ run : |
50+ ARCH=$(uname -m)
51+ if [[ "${{ matrix.platform.arch }}" == "amd64" && "$ARCH" != "x86_64" ]]; then
52+ echo "Error: Expected x86_64 but got $ARCH"
53+ exit 1
54+ fi
55+ if [[ "${{ matrix.platform.arch }}" == "arm64" && "$ARCH" != "aarch64" ]]; then
56+ echo "Error: Expected aarch64 but got $ARCH"
57+ exit 1
58+ fi
59+ echo "Platform validation passed: $ARCH matches ${{ matrix.platform.arch }}"
60+ - name : Log in to the Container registry
61+ uses : docker/login-action@v3
62+ with :
63+ registry : ${{ env.REGISTRY }}
64+ username : ${{ github.actor }}
65+ password : ${{ secrets.GITHUB_TOKEN }}
66+ - name : Extract metadata (tags, labels) for toolchain
67+ id : toolchain-meta
68+ uses : docker/metadata-action@v5
69+ with :
70+ images : ${{ env.REGISTRY }}/${{ matrix.variance.toolchain_image }}
71+ - name : Set up Docker Buildx
72+ uses : docker/setup-buildx-action@v3
73+ with :
74+ driver : docker
75+ - name : Build and push toolchain
76+ id : toolchain-build
77+ uses : docker/build-push-action@v6
78+ with :
79+ context : .
80+ file : ${{ matrix.variance.toolchain_dockerfile }}
81+ platforms : linux/${{ matrix.platform.arch }}
82+ labels : ${{ steps.toolchain-meta.outputs.labels }}
83+ tags : |
84+ ${{ steps.toolchain-meta.outputs.tags }}
85+ ${{ env.REGISTRY }}/${{ matrix.variance.toolchain_image }}:ci-${{ github.run_id }}-${{ matrix.platform.arch }}
86+ outputs : |
87+ type=image,name=${{ env.REGISTRY }}/${{ matrix.variance.toolchain_image }},push-by-digest=true,name-canonical=true,push=${{ github.event_name != 'pull_request' }}
88+ type=docker,dest=/tmp/${{ matrix.variance.toolchain_artifact }}-${{ matrix.platform.arch }}.tar
89+ cache-from : type=gha
90+ - name : Export digest
91+ if : github.event_name != 'pull_request'
92+ run : |
93+ mkdir -p /tmp/digests
94+ digest="${{ steps.toolchain-build.outputs.digest }}"
95+ touch "/tmp/digests/${digest#sha256:}"
96+ - name : Upload digest
97+ if : github.event_name != 'pull_request'
98+ uses : actions/upload-artifact@v4
99+ with :
100+ name : digests-${{ matrix.variance.toolchain_artifact }}-${{ matrix.platform.arch }}
101+ path : /tmp/digests/*
102+ if-no-files-found : error
103+ retention-days : 1
104+ - name : Upload LLVM7 base layer
105+ uses : actions/upload-artifact@v4
106+ with :
107+ name : ${{ matrix.variance.toolchain_artifact }}-${{ matrix.platform.arch }}
108+ path : /tmp/${{ matrix.variance.toolchain_artifact }}-${{ matrix.platform.arch }}.tar
109+ if-no-files-found : error
110+ retention-days : 1
111+ - name : Clean up Docker cache
112+ if : always()
113+ run : |
114+ docker builder prune --all --force || true
115+ docker system prune --volumes --force || true
116+
18117 build-images :
19118 name : Build ${{ matrix.variance.name }} (${{ matrix.platform.arch }})
119+ needs : build-toolchain
20120 runs-on : ${{ matrix.platform.runner }}
21121 permissions :
22122 contents : read
@@ -33,18 +133,33 @@ jobs:
33133 - name : Ubuntu-22.04/CUDA-11.8.0
34134 image : " rust-gpu/rust-cuda-ubuntu22-cuda11"
35135 dockerfile : ./container/ubuntu22-cuda11/Dockerfile
136+ toolchain_image : " rust-gpu/rust-cuda-ubuntu22-llvm7"
137+ toolchain_artifact : llvm7-ubuntu22
36138 - name : Ubuntu-22.04/CUDA-12.8.1
37139 image : " rust-gpu/rust-cuda-ubuntu22-cuda12"
38140 dockerfile : ./container/ubuntu22-cuda12/Dockerfile
141+ toolchain_image : " rust-gpu/rust-cuda-ubuntu22-llvm7"
142+ toolchain_artifact : llvm7-ubuntu22
39143 - name : Ubuntu-24.04/CUDA-12.8.1
40144 image : " rust-gpu/rust-cuda-ubuntu24-cuda12"
41145 dockerfile : ./container/ubuntu24-cuda12/Dockerfile
146+ toolchain_image : " rust-gpu/rust-cuda-ubuntu24-llvm7"
147+ toolchain_artifact : llvm7-ubuntu24
42148 - name : RockyLinux-9/CUDA-12.8.1
43149 image : " rust-gpu/rust-cuda-rockylinux9-cuda12"
44150 dockerfile : ./container/rockylinux9-cuda12/Dockerfile
151+ toolchain_image : " rust-gpu/rust-cuda-rockylinux9-llvm7"
152+ toolchain_artifact : llvm7-rockylinux9
45153 steps :
46154 - name : Checkout repository
47155 uses : actions/checkout@v4
156+ - name : Download LLVM base image
157+ uses : actions/download-artifact@v4
158+ with :
159+ name : ${{ matrix.variance.toolchain_artifact }}-${{ matrix.platform.arch }}
160+ path : /tmp/toolchain
161+ - name : Load LLVM base image
162+ run : docker load --input /tmp/toolchain/${{ matrix.variance.toolchain_artifact }}-${{ matrix.platform.arch }}.tar
48163 - name : Validate platform
49164 run : |
50165 ARCH=$(uname -m)
70185 images : ${{ env.REGISTRY }}/${{ matrix.variance.image }}
71186 - name : Set up Docker Buildx
72187 uses : docker/setup-buildx-action@v3
188+ with :
189+ driver : docker
73190 - name : Build and push by digest
74191 id : build
75192 uses : docker/build-push-action@v6
80197 labels : ${{ steps.meta.outputs.labels }}
81198 outputs : type=image,name=${{ env.REGISTRY }}/${{ matrix.variance.image }},push-by-digest=true,name-canonical=true,push=${{ github.event_name != 'pull_request' }}
82199 cache-from : type=gha
83- cache-to : type=gha,mode=max
200+ build-args : |
201+ LLVM_BASE_IMAGE=${{ env.REGISTRY }}/${{ matrix.variance.toolchain_image }}:ci-${{ github.run_id }}-${{ matrix.platform.arch }}
84202 - name : Set artifact name
85203 if : github.event_name != 'pull_request'
86204 run : |
@@ -101,6 +219,71 @@ jobs:
101219 path : /tmp/digests/*
102220 if-no-files-found : error
103221 retention-days : 1
222+ - name : Clean up Docker cache
223+ if : always()
224+ run : |
225+ docker builder prune --all --force || true
226+ docker system prune --volumes --force || true
227+
228+ merge-toolchain :
229+ name : Create manifest for LLVM7 base (${{ matrix.variance.name }})
230+ runs-on : ubuntu-latest
231+ if : github.event_name != 'pull_request'
232+ needs : build-toolchain
233+ permissions :
234+ contents : read
235+ packages : write
236+ attestations : write
237+ id-token : write
238+ strategy :
239+ fail-fast : false
240+ matrix :
241+ variance :
242+ - name : Ubuntu-22.04
243+ toolchain_image : " rust-gpu/rust-cuda-ubuntu22-llvm7"
244+ toolchain_artifact : llvm7-ubuntu22
245+ - name : Ubuntu-24.04
246+ toolchain_image : " rust-gpu/rust-cuda-ubuntu24-llvm7"
247+ toolchain_artifact : llvm7-ubuntu24
248+ - name : RockyLinux-9
249+ toolchain_image : " rust-gpu/rust-cuda-rockylinux9-llvm7"
250+ toolchain_artifact : llvm7-rockylinux9
251+ steps :
252+ - name : Download digests
253+ uses : actions/download-artifact@v4
254+ with :
255+ path : /tmp/digests
256+ pattern : digests-${{ matrix.variance.toolchain_artifact }}-*
257+ merge-multiple : true
258+ - name : Set up Docker Buildx
259+ uses : docker/setup-buildx-action@v3
260+ - name : Docker meta
261+ id : toolchain-meta
262+ uses : docker/metadata-action@v5
263+ with :
264+ images : ${{ env.REGISTRY }}/${{ matrix.variance.toolchain_image }}
265+ tags : |
266+ type=ref,event=branch
267+ type=ref,event=pr
268+ type=semver,pattern={{version}}
269+ type=semver,pattern={{major}}.{{minor}}
270+ type=semver,pattern={{major}}
271+ type=sha,format=short
272+ type=raw,value=latest,enable={{is_default_branch}}
273+ - name : Login to Registry
274+ uses : docker/login-action@v3
275+ with :
276+ registry : ${{ env.REGISTRY }}
277+ username : ${{ github.actor }}
278+ password : ${{ secrets.GITHUB_TOKEN }}
279+ - name : Create manifest list and push
280+ working-directory : /tmp/digests
281+ run : |
282+ docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
283+ $(printf '${{ env.REGISTRY }}/${{ matrix.variance.toolchain_image }}@sha256:%s ' *)
284+ - name : Inspect image
285+ run : |
286+ docker buildx imagetools inspect ${{ env.REGISTRY }}/${{ matrix.variance.toolchain_image }}:${{ steps.toolchain-meta.outputs.version }}
104287
105288 merge-manifests :
106289 name : Create manifest for ${{ matrix.variance.name }}
0 commit comments