@@ -14,16 +14,60 @@ jobs:
1414 steps :
1515 - uses : actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
1616
17- - name : Set up Python
18- uses : actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
19- with :
20- python-version : " 3.13"
21-
22- - name : Install dependencies
17+ - name : Verify runner-provided CUDA environment
2318 run : |
24- python -m pip install --upgrade pip
25- pip install -e ".[dev]"
19+ set -euo pipefail
20+ : "${CPPMEGA_CUDA_PYTHON:?self-hosted CUDA runner must export CPPMEGA_CUDA_PYTHON}"
21+ test -x "$CPPMEGA_CUDA_PYTHON"
22+ cuda_info="$(env -u PYTHONPATH -u PYTHONHOME -u VIRTUAL_ENV \
23+ "$CPPMEGA_CUDA_PYTHON" -c \
24+ 'import os,sys; print(os.path.realpath(sys.prefix)); print(os.path.realpath(sys.base_prefix))')"
25+ cuda_prefix="${cuda_info%%$'\n'*}"
26+ cuda_base_prefix="${cuda_info#*$'\n'}"
27+ test -n "$cuda_prefix"
28+ test -n "$cuda_base_prefix"
29+ test "$cuda_prefix" != "$cuda_base_prefix"
30+ test -f "$cuda_prefix/pyvenv.cfg"
31+ python_abs="$(python3 -c 'import os,sys; print(os.path.abspath(sys.argv[1]))' "$CPPMEGA_CUDA_PYTHON")"
32+ case "$python_abs" in
33+ "$cuda_prefix/bin/"*) ;;
34+ *) echo "selected CUDA Python is outside its venv prefix" >&2; exit 2 ;;
35+ esac
36+ workspace_real="$(cd "$GITHUB_WORKSPACE" && pwd -P)"
37+ case "$cuda_prefix" in
38+ "$workspace_real"|"$workspace_real"/*)
39+ echo "refusing CUDA environment inside GITHUB_WORKSPACE" >&2
40+ exit 2
41+ ;;
42+ esac
43+ if git -C "$cuda_prefix" rev-parse --show-toplevel >/dev/null 2>&1; then
44+ echo "refusing CUDA environment inside a Git checkout" >&2
45+ exit 2
46+ fi
47+ uv lock --check --no-sources --project .
48+ UV_PROJECT_ENVIRONMENT="$cuda_prefix" uv sync --project . --locked \
49+ --no-sources --python "$CPPMEGA_CUDA_PYTHON" --group dev \
50+ --extra path-c
51+ "$CPPMEGA_CUDA_PYTHON" scripts/check_cuda_environment.py --json \
52+ | tee "$RUNNER_TEMP/cppmega-cuda-environment.json"
53+ uv pip check --python "$CPPMEGA_CUDA_PYTHON"
54+
55+ - name : Upload CUDA environment receipt
56+ if : always()
57+ uses : actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
58+ with :
59+ name : cppmega-mlx-cuda-environment-${{ github.run_id }}-${{ github.run_attempt }}
60+ path : ${{ runner.temp }}/cppmega-cuda-environment.json
61+ if-no-files-found : warn
62+ retention-days : 14
2663
2764 - name : Run CUDA tests
2865 run : |
29- python -m pytest -m "cuda_hardware or cuda_required" -v --tb=short
66+ set -euo pipefail
67+ : "${CPPMEGA_CUDA_PYTHON:?self-hosted CUDA runner must export CPPMEGA_CUDA_PYTHON}"
68+ selected="$RUNNER_TEMP/cppmega-cuda-selected.txt"
69+ CPPMEGA_RUN_CUDA_TESTS=1 "$CPPMEGA_CUDA_PYTHON" -m pytest \
70+ --collect-only -q -m "cuda_hardware or cuda_required" > "$selected"
71+ grep -q '::' "$selected"
72+ CPPMEGA_RUN_CUDA_TESTS=1 "$CPPMEGA_CUDA_PYTHON" -m pytest \
73+ -m "cuda_hardware or cuda_required" -v --tb=short
0 commit comments