Skip to content

Commit c785fbb

Browse files
authored
draft the 0.15.2 release (#686)
* draft a 0.15.2 release * fix dockerr * fix docker build
1 parent 828d696 commit c785fbb

6 files changed

Lines changed: 79 additions & 32 deletions

File tree

.github/workflows/docker.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ jobs:
9898
shell: bash
9999

100100
- name: Check out the repo
101-
uses: actions/checkout@v4
101+
uses: actions/checkout@v5
102102
with:
103103
ref: ${{ github.event_name == 'issue_comment' && format('refs/pull/{0}/head', github.event.issue.number) || '' }}
104104

@@ -114,15 +114,15 @@ jobs:
114114
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
115115

116116
- name: Log in to the Container registry
117-
uses: docker/login-action@v3
117+
uses: docker/login-action@v4
118118
with:
119119
registry: ghcr.io
120120
username: ${{ github.actor }}
121121
password: ${{ secrets.GITHUB_TOKEN }}
122122

123123
- name: Extract metadata (tags, labels) for Docker base image
124124
id: meta-base
125-
uses: docker/metadata-action@v5
125+
uses: docker/metadata-action@v6
126126
with:
127127
images: |
128128
ghcr.io/scverse/rapids-singlecell-deps-${{ matrix.CUDA_SUFFIX.pkg }}
@@ -134,7 +134,7 @@ jobs:
134134

135135
- name: Build and push Docker base images
136136
id: push-base
137-
uses: docker/build-push-action@v5
137+
uses: docker/build-push-action@v7
138138
with:
139139
context: ./docker/
140140
file: ./docker/Dockerfile.deps
@@ -148,22 +148,22 @@ jobs:
148148

149149
- name: Generate artifact attestation for base image
150150
if: github.event_name == 'release'
151-
uses: actions/attest-build-provenance@v1
151+
uses: actions/attest-build-provenance@v4
152152
with:
153153
subject-name: ghcr.io/scverse/rapids-singlecell-deps-${{ matrix.CUDA_SUFFIX.pkg }}
154154
subject-digest: ${{ steps.push-base.outputs.digest }}
155155
push-to-registry: true
156156

157157
- name: Extract metadata (tags, labels) for main Docker image
158158
id: meta
159-
uses: docker/metadata-action@v5
159+
uses: docker/metadata-action@v6
160160
with:
161161
images: |
162162
ghcr.io/scverse/rapids-singlecell-${{ matrix.CUDA_SUFFIX.pkg }}
163163
164164
- name: Build and push main Docker images
165165
id: push
166-
uses: docker/build-push-action@v5
166+
uses: docker/build-push-action@v7
167167
with:
168168
context: ./docker/
169169
file: ./docker/Dockerfile
@@ -179,7 +179,7 @@ jobs:
179179
180180
- name: Generate artifact attestation for main image
181181
if: github.event_name == 'release'
182-
uses: actions/attest-build-provenance@v1
182+
uses: actions/attest-build-provenance@v4
183183
with:
184184
subject-name: ghcr.io/scverse/rapids-singlecell-${{ matrix.CUDA_SUFFIX.pkg }}
185185
subject-digest: ${{ steps.push.outputs.digest }}

.github/workflows/publish.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ jobs:
103103
docker build -t "${{ matrix.cibw_image }}" -f "${{ matrix.dockerfile }}" docker
104104
105105
- name: Build wheels
106-
uses: pypa/cibuildwheel@v3.1.4
106+
uses: pypa/cibuildwheel@v3.4.1
107107
env:
108108
SETUPTOOLS_SCM_PRETEND_VERSION: ${{ steps.version.outputs.version }}
109109
CIBW_BUILD: 'cp312-*'
@@ -123,7 +123,7 @@ jobs:
123123
CIBW_REPAIR_WHEEL_COMMAND: "auditwheel repair --exclude libcublas.so.${{ matrix.cuda_major }} --exclude libcublasLt.so.${{ matrix.cuda_major }} --exclude libcudart.so.${{ matrix.cuda_major }} -w {dest_dir} {wheel}"
124124
CIBW_BUILD_VERBOSITY: "1"
125125

126-
- uses: actions/upload-artifact@v4
126+
- uses: actions/upload-artifact@v7
127127
with:
128128
name: cibw-wheels-${{ matrix.os }}-cu${{ matrix.cuda_major }}-${{ strategy.job-index }}
129129
path: ./wheelhouse/*.whl
@@ -135,7 +135,7 @@ jobs:
135135
- uses: actions/checkout@v5
136136
- name: Build sdist
137137
run: pipx run build --sdist
138-
- uses: actions/upload-artifact@v4
138+
- uses: actions/upload-artifact@v7
139139
with:
140140
name: cibw-sdist
141141
path: dist/*.tar.gz
@@ -151,7 +151,7 @@ jobs:
151151
matrix:
152152
cuda_major: ["12", "13"]
153153
steps:
154-
- uses: actions/download-artifact@v5
154+
- uses: actions/download-artifact@v8
155155
with:
156156
pattern: cibw-wheels-*-cu${{ matrix.cuda_major }}-*
157157
path: dist
@@ -167,7 +167,7 @@ jobs:
167167
id-token: write
168168
if: github.event_name == 'release' && github.event.action == 'published'
169169
steps:
170-
- uses: actions/download-artifact@v5
170+
- uses: actions/download-artifact@v8
171171
with:
172172
name: cibw-sdist
173173
path: dist

.github/workflows/test-gpu.yml

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ jobs:
1717
check:
1818
runs-on: ubuntu-latest
1919
steps:
20-
- uses: flying-sheep/check@v1
21-
with:
22-
success: ${{ github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'run-gpu-ci') }}
20+
- name: Require push to main or 'run-gpu-ci' label
21+
if: ${{ !(github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'run-gpu-ci')) }}
22+
run: |
23+
echo "::error::GPU CI requires a push to main or the 'run-gpu-ci' label on the PR."
24+
exit 1
2325
2426
get-envs:
2527
runs-on: ubuntu-latest
@@ -32,7 +34,7 @@ jobs:
3234
with:
3335
filter: blob:none
3436
fetch-depth: 0
35-
- uses: astral-sh/setup-uv@v6
37+
- uses: astral-sh/setup-uv@v8.1.0
3638
with:
3739
enable-cache: false
3840
- id: get-envs
@@ -80,7 +82,7 @@ jobs:
8082
fetch-depth: 0
8183
filter: blob:none
8284

83-
- uses: astral-sh/setup-uv@v6
85+
- uses: astral-sh/setup-uv@v8.1.0
8486
with:
8587
python-version: ${{ matrix.env.python }}
8688

@@ -143,7 +145,7 @@ jobs:
143145
fetch-depth: 0
144146
filter: blob:none
145147

146-
- uses: astral-sh/setup-uv@v6
148+
- uses: astral-sh/setup-uv@v8.1.0
147149
with:
148150
python-version: ${{ matrix.env.python }}
149151

@@ -168,11 +170,13 @@ jobs:
168170
name: Remove 'run-gpu-ci' Label
169171
runs-on: ubuntu-latest
170172
if: ${{ always() && github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'run-gpu-ci') }}
173+
permissions:
174+
pull-requests: write
171175
steps:
172-
- uses: actions-ecosystem/action-remove-labels@v1
173-
with:
174-
labels: 'run-gpu-ci'
175-
github_token: ${{ secrets.GITHUB_TOKEN }}
176+
- name: Remove 'run-gpu-ci' label
177+
run: gh api -X DELETE "repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels/run-gpu-ci" || true
178+
env:
179+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
176180

177181
stable-dev-green:
178182
name: CI-Pass
@@ -182,9 +186,12 @@ jobs:
182186
- test-stable-dev
183187
runs-on: ubuntu-latest
184188
steps:
185-
- uses: re-actors/alls-green@release/v1
186-
with:
187-
jobs: ${{ toJSON(needs) }}
189+
- name: Check required jobs succeeded
190+
run: |
191+
if [[ "${{ needs.get-envs.result }}" != "success" || "${{ needs.test-stable-dev.result }}" != "success" ]]; then
192+
echo "::error::Required jobs did not succeed (get-envs=${{ needs.get-envs.result }}, test-stable-dev=${{ needs.test-stable-dev.result }})."
193+
exit 1
194+
fi
188195
189196
all-green:
190197
name: All Tests Green
@@ -195,7 +202,9 @@ jobs:
195202
- test-prerelease
196203
runs-on: ubuntu-latest
197204
steps:
198-
- uses: re-actors/alls-green@release/v1
199-
with:
200-
allowed-failures: test-prerelease
201-
jobs: ${{ toJSON(needs) }}
205+
- name: Check required jobs succeeded (test-prerelease allowed to fail)
206+
run: |
207+
if [[ "${{ needs.get-envs.result }}" != "success" || "${{ needs.test-stable-dev.result }}" != "success" ]]; then
208+
echo "::error::Required jobs did not succeed (get-envs=${{ needs.get-envs.result }}, test-stable-dev=${{ needs.test-stable-dev.result }})."
209+
exit 1
210+
fi

conda/rsc_rapids_26.04_cuda12.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ channels:
77
dependencies:
88
- rapids=26.04
99
- python=3.14
10-
- cuda-version=12.9
10+
- cuda-version=12.8
1111
- cudnn
1212
- cutensor
1313
- cusparselt

docker/Dockerfile.deps

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ FROM nvidia/cuda:${CUDA_VER}-devel-${LINUX_VER}
66
SHELL ["/bin/bash", "-euo", "pipefail", "-c"]
77

88
ARG PYTHON_VER=3.13
9+
# Re-declare after FROM so it is available to RUN steps (passed by docker.yml build-args)
10+
ARG CUDA_VER=13.0.2
911

1012
ENV PATH=/opt/conda/bin:$PATH
1113
ENV PYTHON_VERSION=${PYTHON_VER}
@@ -35,6 +37,41 @@ mamba install -y -n base pytest -c conda-forge
3537
mamba clean --all -y
3638
EOF
3739

40+
RUN <<EOF
41+
# Guard against cu12/cu13 package mixing (see issue #677): fail the build if any
42+
# installed CUDA Python package's major version does not match the image's CUDA major.
43+
set -x
44+
CUDA_MAJOR="${CUDA_VER%%.*}"
45+
echo "Verifying all CUDA packages match CUDA major ${CUDA_MAJOR}"
46+
/opt/conda/bin/python - "${CUDA_MAJOR}" <<'PY'
47+
import sys
48+
import importlib.metadata as md
49+
50+
target = sys.argv[1]
51+
bad = []
52+
# cuda-bindings and cuda-python track the CUDA major in their version.
53+
# (cuda-core is intentionally excluded: it uses its own 0.x versioning.)
54+
for name in ("cuda-bindings", "cuda-python"):
55+
try:
56+
version = md.version(name)
57+
except md.PackageNotFoundError:
58+
continue
59+
if version.split(".")[0] != target:
60+
bad.append(f"{name}=={version} (expected CUDA {target}.x)")
61+
# cupy wheels encode the CUDA major in the project name
62+
for name in ("cupy-cuda12x", "cupy-cuda13x"):
63+
try:
64+
md.version(name)
65+
except md.PackageNotFoundError:
66+
continue
67+
if name != f"cupy-cuda{target}x":
68+
bad.append(f"{name} installed (expected cupy-cuda{target}x)")
69+
if bad:
70+
sys.exit("ERROR: CUDA major mismatch in cu%s image:\n - %s" % (target, "\n - ".join(bad)))
71+
print(f"OK: all CUDA packages match CUDA {target}.x")
72+
PY
73+
EOF
74+
3875
RUN <<EOF
3976
# install rapids_singlecell pip dependencies (without building the package)
4077
set -x

docs/release-notes/0.15.2.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
### 0.15.2 {small}`the-future`
1+
### 0.15.2 {small}`2026-06-03`
22

33
```{rubric} Features
44
```
@@ -16,3 +16,4 @@
1616
```
1717
* Fixes per-batch clip threshold in `pp.highly_variable_genes(flavor="pearson_residuals", batch_key=...)`: each batch now uses its own `sqrt(n_cells_in_batch)` instead of silently reusing the first batch's value {pr}`674` {smaller}`A Mikaeili`
1818
* {class}`~rapids_singlecell.ptg.Distance` drops unused (zero-cell) ``groupby`` categories for all metrics; ``edistance`` previously returned ``NaN`` for empty categories {pr}`683` {smaller}`S Dicks`
19+
* The ``rapids-singlecell-cu12`` Docker image is pinned back to ``cuda-version=12.8`` so it no longer pulls CUDA 13 RAPIDS binaries (``cuda-bindings`` 13.x) and works on driver 535+ again; the image build now fails fast if CUDA 12/13 packages are mixed {pr}`686` {smaller}`S Dicks`

0 commit comments

Comments
 (0)