42
42
# (matrix.host-platform == 'win-64' && 'windows-amd64-cpu8') }}
43
43
outputs :
44
44
BUILD_CTK_VER : ${{ steps.pass_env.outputs.CUDA_VERSION }}
45
+ USE_GH_CACHE : ${{ steps.pass_env.outputs.USE_CACHE }}
46
+ defaults :
47
+ run :
48
+ shell : bash --noprofile --norc -xeuo pipefail {0}
45
49
steps :
46
50
- name : Checkout ${{ github.event.repository.name }}
47
51
uses : actions/checkout@v4
62
66
uses : ilammy/msvc-dev-cmd@v1
63
67
64
68
- name : Set environment variables
65
- shell : bash --noprofile --norc -xeuo pipefail {0}
66
69
run : |
67
70
PYTHON_VERSION_FORMATTED=$(echo '${{ matrix.python-version }}' | tr -d '.')
68
71
if [[ "${{ matrix.host-platform }}" == linux* ]]; then
@@ -75,14 +78,23 @@ jobs:
75
78
fi
76
79
77
80
echo "PARALLEL_LEVEL=$(nproc)" >> $GITHUB_ENV
78
- echo "CUDA_CORE_ARTIFACT_NAME=cuda-core-python${PYTHON_VERSION_FORMATTED}-${{ matrix.host-platform }}-${{ github.sha }}" >> $GITHUB_ENV
81
+ echo "CUDA_CORE_ARTIFACT_BASENAME=cuda-core-python${PYTHON_VERSION_FORMATTED}-${{ matrix.host-platform }}" >> $GITHUB_ENV
82
+ echo "CUDA_CORE_ARTIFACT_NAME=${CUDA_CORE_ARTIFACT_BASENAME}-${{ github.sha }}" >> $GITHUB_ENV
79
83
echo "CUDA_CORE_ARTIFACTS_DIR=$(realpath "$REPO_DIR/cuda_core/dist")" >> $GITHUB_ENV
80
- echo "CUDA_BINDINGS_ARTIFACT_NAME=cuda-bindings-python${PYTHON_VERSION_FORMATTED}-cuda${{ matrix.cuda-version }}-${{ matrix.host-platform }}-${{ github.sha }}" >> $GITHUB_ENV
84
+ echo "CUDA_BINDINGS_ARTIFACT_BASENAME=cuda-bindings-python${PYTHON_VERSION_FORMATTED}-cuda${{ matrix.cuda-version }}-${{ matrix.host-platform }}" >> $GITHUB_ENV
85
+ echo "CUDA_BINDINGS_ARTIFACT_NAME=${CUDA_BINDINGS_ARTIFACT_BASENAME}-${{ github.sha }}" >> $GITHUB_ENV
81
86
echo "CUDA_BINDINGS_ARTIFACTS_DIR=$(realpath "$REPO_DIR/cuda_bindings/dist")" >> $GITHUB_ENV
82
87
echo "CIBW_BUILD=${CIBW_BUILD}" >> $GITHUB_ENV
83
-
88
+
89
+ # When the CI is run due to merging to main, we want it to populate GHA Cache not Artifacts,
90
+ # so that CI workflows running on every branch have a fallback to use.
91
+ if [[ "${{ github.ref_name}}" == main ]]; then
92
+ echo "USE_CACHE=1" >> $GITHUB_ENV
93
+ else
94
+ echo "USE_CACHE=0" >> $GITHUB_ENV
95
+ fi
96
+
84
97
- name : Dump environment
85
- shell : bash --noprofile --norc -xeuo pipefail {0}
86
98
run : |
87
99
env
88
100
97
109
output-dir : ${{ env.CUDA_CORE_ARTIFACTS_DIR }}
98
110
99
111
- name : List the cuda.core artifacts directory
100
- shell : bash --noprofile --norc -xeuo pipefail {0}
101
112
run : |
102
113
if [[ "${{ matrix.host-platform }}" == win* ]]; then
103
114
export CHOWN=chown
@@ -108,19 +119,29 @@ jobs:
108
119
ls -lahR ${{ env.CUDA_CORE_ARTIFACTS_DIR }}
109
120
110
121
- name : Check cuda.core wheel
111
- shell : bash --noprofile --norc -xeuo pipefail {0}
112
122
run : |
113
123
pip install twine
114
124
twine check ${{ env.CUDA_CORE_ARTIFACTS_DIR }}/*.whl
125
+ # unconditionally prepare the cache in case needed later
126
+ tar -c -f "${{ env.CUDA_CORE_ARTIFACT_BASENAME }}.tar.gz" -C "${{ env.CUDA_CORE_ARTIFACTS_DIR }}" .
127
+ du -h "${{ env.CUDA_CORE_ARTIFACT_BASENAME }}.tar.gz"
115
128
116
129
- name : Upload cuda.core build artifacts
130
+ if : ${{ env.USE_CACHE == '0' }}
117
131
uses : actions/upload-artifact@v4
118
132
with :
119
133
name : ${{ env.CUDA_CORE_ARTIFACT_NAME }}
120
134
path : ${{ env.CUDA_CORE_ARTIFACTS_DIR }}/*.whl
121
135
if-no-files-found : error
122
136
overwrite : ' true'
123
137
138
+ - name : Cache cuda.core build artifacts
139
+ if : ${{ env.USE_CACHE == '1' }}
140
+ uses : actions/cache/save@v4
141
+ with :
142
+ key : ${{ env.CUDA_CORE_ARTIFACT_NAME }}
143
+ path : ${{ env.CUDA_CORE_ARTIFACT_BASENAME }}.tar.gz
144
+
124
145
- name : Set up mini CTK
125
146
uses : ./.github/actions/fetch_ctk
126
147
continue-on-error : false
@@ -146,7 +167,6 @@ jobs:
146
167
output-dir : ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}
147
168
148
169
- name : List the cuda.bindings artifacts directory
149
- shell : bash --noprofile --norc -xeuo pipefail {0}
150
170
run : |
151
171
if [[ "${{ matrix.host-platform }}" == win* ]]; then
152
172
export CHOWN=chown
@@ -156,24 +176,35 @@ jobs:
156
176
$CHOWN -R $(whoami) ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}
157
177
ls -lahR ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}
158
178
159
- # TODO: enable this after NVIDIA/cuda-python#297 is resolved
160
- # - name: Check cuda.bindings wheel
161
- # shell: bash --noprofile --norc -xeuo pipefail {0}
162
- # run: |
163
- # twine check ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}/*.whl
179
+ - name : Check cuda.bindings wheel
180
+ run : |
181
+ # TODO: enable this after NVIDIA/cuda-python#297 is resolved
182
+ # twine check ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}/*.whl
183
+ # unconditionally prepare the cache in case needed later
184
+ tar -c -f "${{ env.CUDA_BINDINGS_ARTIFACT_BASENAME }}.tar.gz" -C "${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}" .
185
+ du -h "${{ env.CUDA_BINDINGS_ARTIFACT_BASENAME }}.tar.gz"
164
186
165
187
- name : Upload cuda.bindings build artifacts
188
+ if : ${{ env.USE_CACHE == '0' }}
166
189
uses : actions/upload-artifact@v4
167
190
with :
168
191
name : ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }}
169
192
path : ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}/*.whl
170
193
if-no-files-found : error
171
194
overwrite : ' true'
172
195
196
+ - name : Cache cuda.bindings build artifacts
197
+ if : ${{ env.USE_CACHE == '1' }}
198
+ uses : actions/cache/save@v4
199
+ with :
200
+ key : ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }}
201
+ path : ${{ env.CUDA_BINDINGS_ARTIFACT_BASENAME }}.tar.gz
202
+
173
203
- name : Pass environment variables to the next runner
174
204
id : pass_env
175
205
run : |
176
206
echo "CUDA_VERSION=${{ matrix.cuda-version }}" >> $GITHUB_OUTPUT
207
+ echo "USE_CACHE=${{ env.USE_CACHE }}" >> $GITHUB_OUTPUT
177
208
178
209
test :
179
210
strategy :
@@ -221,9 +252,11 @@ jobs:
221
252
NVIDIA_VISIBLE_DEVICES : ${{ env.NVIDIA_VISIBLE_DEVICES }}
222
253
needs :
223
254
- build
255
+ defaults :
256
+ run :
257
+ shell : bash --noprofile --norc -xeuo pipefail {0}
224
258
steps :
225
259
- name : Ensure GPU is working
226
- shell : bash --noprofile --norc -xeuo pipefail {0}
227
260
run : nvidia-smi
228
261
229
262
- name : Checkout ${{ github.event.repository.name }}
@@ -232,7 +265,6 @@ jobs:
232
265
fetch-depth : 0
233
266
234
267
- name : Set environment variables
235
- shell : bash --noprofile --norc -xeuo pipefail {0}
236
268
run : |
237
269
PYTHON_VERSION_FORMATTED=$(echo '${{ matrix.python-version }}' | tr -d '.')
238
270
if [[ "${{ matrix.host-platform }}" == linux* ]]; then
@@ -251,32 +283,85 @@ jobs:
251
283
fi
252
284
253
285
# make outputs from the previous job as env vars
254
- echo "CUDA_CORE_ARTIFACT_NAME=cuda-core-python${PYTHON_VERSION_FORMATTED}-${{ matrix.host-platform }}-${{ github.sha }}" >> $GITHUB_ENV
286
+ echo "CUDA_CORE_ARTIFACT_BASENAME=cuda-core-python${PYTHON_VERSION_FORMATTED}-${{ matrix.host-platform }}" >> $GITHUB_ENV
287
+ echo "CUDA_CORE_ARTIFACT_NAME=${CUDA_CORE_ARTIFACT_BASENAME}-${{ github.sha }}" >> $GITHUB_ENV
255
288
echo "CUDA_CORE_ARTIFACTS_DIR=$(realpath "$REPO_DIR/cuda_core/dist")" >> $GITHUB_ENV
256
- echo "CUDA_BINDINGS_ARTIFACT_NAME=cuda-bindings-python${PYTHON_VERSION_FORMATTED}-cuda${{ needs.build.outputs.BUILD_CTK_VER }}-${{ matrix.host-platform }}-${{ github.sha }}" >> $GITHUB_ENV
289
+ echo "CUDA_BINDINGS_ARTIFACT_BASENAME=cuda-bindings-python${PYTHON_VERSION_FORMATTED}-cuda${{ matrix.cuda-version }}-${{ matrix.host-platform }}" >> $GITHUB_ENV
290
+ echo "CUDA_BINDINGS_ARTIFACT_NAME=${CUDA_BINDINGS_ARTIFACT_BASENAME}-${{ github.sha }}" >> $GITHUB_ENV
257
291
echo "CUDA_BINDINGS_ARTIFACTS_DIR=$(realpath "$REPO_DIR/cuda_bindings/dist")" >> $GITHUB_ENV
258
292
echo "SKIP_CUDA_BINDINGS_TEST=${SKIP_CUDA_BINDINGS_TEST}" >> $GITHUB_ENV
259
293
294
+ # When the CI is run due to merging to main, we want it to populate GHA Cache not Artifacts,
295
+ # so that CI workflows running on every branch have a fallback to use.
296
+ echo "USE_CACHE=${{ needs.build.outputs.USE_GH_CACHE }}" >> $GITHUB_ENV
297
+
298
+ # We'll try GHA Artifacts first, and then fall back to GHA Cache
260
299
- name : Download cuda.bindings build artifacts
300
+ id : cuda-bindings-download
261
301
uses : actions/download-artifact@v4
262
302
with :
263
303
name : ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }}
264
304
path : ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}
265
305
306
+ - name : Restore cuda.bindings cache
307
+ if : ${{ failure() && steps.cuda-bindings-download.conclusion == 'failure' }}
308
+ id : cuda-bindings-cache
309
+ uses : actions/cache/restore@v4
310
+ with :
311
+ key : ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }}
312
+ path : ${{ env.CUDA_BINDINGS_ARTIFACTS_BASENAME }}.tar.gz
313
+ restore-keys : ${{ env.CUDA_BINDINGS_ARTIFACT_BASENAME }}
314
+ fail-on-cache-miss : true
315
+
316
+ - name : Report cache restore status (hit)
317
+ if : ${{ steps.cuda-bindings-cache.conclusion != 'skipped' &&
318
+ steps.cuda-bindings-cache.outputs.cache-hit == 'true' }}
319
+ run : |
320
+ echo "cache is found"
321
+ CACHE_DIR="${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}"
322
+ CACHE_ARCHIVE="${{ env.CUDA_BINDINGS_ARTIFACTS_BASENAME }}.tar.gz"
323
+ ls -l $CACHE_ARCHIVE
324
+ mkdir -p $CACHE_DIR
325
+ du -h $CACHE_ARCHIVE &&
326
+ tar -x -f $CACHE_ARCHIVE -C $CACHE_DIR &&
327
+ rm -f $CACHE_ARCHIVE || echo "WARNING: cache could not be retrieved."
328
+
266
329
- name : Display structure of downloaded cuda.bindings artifacts
267
- shell : bash --noprofile --norc -xeuo pipefail {0}
268
330
run : |
269
331
pwd
270
332
ls -lahR $CUDA_BINDINGS_ARTIFACTS_DIR
271
333
272
334
- name : Download cuda.core build artifacts
335
+ id : cuda-core-download
273
336
uses : actions/download-artifact@v4
274
337
with :
275
338
name : ${{ env.CUDA_CORE_ARTIFACT_NAME }}
276
339
path : ${{ env.CUDA_CORE_ARTIFACTS_DIR }}
277
340
341
+ - name : Restore cuda.core cache
342
+ if : ${{ failure() && steps.cuda-core-download.conclusion == 'failure' }}
343
+ id : cuda-core-cache
344
+ uses : actions/cache/restore@v4
345
+ with :
346
+ key : ${{ env.CUDA_CORE_ARTIFACT_NAME }}
347
+ path : ${{ env.CUDA_CORE_ARTIFACTS_BASENAME }}.tar.gz
348
+ restore-keys : ${{ env.CUDA_CORE_ARTIFACT_BASENAME }}
349
+ fail-on-cache-miss : true
350
+
351
+ - name : Report cache restore status (hit)
352
+ if : ${{ steps.cuda-core-cache.conclusion != 'skipped' &&
353
+ steps.cuda-core-cache.outputs.cache-hit == 'true' }}
354
+ run : |
355
+ echo "cache is found"
356
+ CACHE_DIR="${{ env.CUDA_CORE_ARTIFACTS_DIR }}"
357
+ CACHE_ARCHIVE="${{ env.CUDA_CORE_ARTIFACTS_BASENAME }}.tar.gz"
358
+ ls -l $CACHE_ARCHIVE
359
+ mkdir -p $CACHE_DIR
360
+ du -h $CACHE_ARCHIVE &&
361
+ tar -x -f $CACHE_ARCHIVE -C $CACHE_DIR &&
362
+ rm -f $CACHE_ARCHIVE || echo "WARNING: cache could not be retrieved."
363
+
278
364
- name : Display structure of downloaded cuda.core build artifacts
279
- shell : bash --noprofile --norc -xeuo pipefail {0}
280
365
run : |
281
366
pwd
282
367
ls -lahR $CUDA_CORE_ARTIFACTS_DIR
@@ -295,7 +380,6 @@ jobs:
295
380
296
381
- name : Run cuda.bindings tests
297
382
if : ${{ env.SKIP_CUDA_BINDINGS_TEST == '0' }}
298
- shell : bash --noprofile --norc -xeuo pipefail {0}
299
383
run : |
300
384
ls $CUDA_PATH
301
385
@@ -311,7 +395,6 @@ jobs:
311
395
popd
312
396
313
397
- name : Run cuda.core tests
314
- shell : bash --noprofile --norc -xeuo pipefail {0}
315
398
run : |
316
399
if [[ ${{ matrix.python-version }} == "3.13" ]]; then
317
400
# TODO: remove this hack once cuda-python has a cp313 build
@@ -348,3 +431,4 @@ jobs:
348
431
./.github/workflows/build-docs.yml
349
432
with :
350
433
build_ctk_ver : ${{ needs.build.outputs.BUILD_CTK_VER }}
434
+ use_gh_cache : ${{ needs.build.outputs.USE_GH_CACHE }}
0 commit comments