Skip to content

Commit 98cc331

Browse files
[docs-only] Add release process guide and update release checklist
Add .github/RELEASE.md with step-by-step guidance for each item in the release checklist, based on lessons learned from the cuda.core v0.6.0 release. Remove obsolete checklist items (RC tag, pre-release QA, nvidia conda channel upload). Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 67251a3 commit 98cc331

File tree

2 files changed

+270
-7
lines changed

2 files changed

+270
-7
lines changed

.github/ISSUE_TEMPLATE/release_checklist.yml

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
22
#
33
# SPDX-License-Identifier: Apache-2.0
44

@@ -10,7 +10,7 @@ body:
1010
- type: markdown
1111
attributes:
1212
value: |
13-
This checklist is for cuda-core releases as well as cuda-bindings patches. Please go through this checklist and ensure all tasks are completed.
13+
This checklist is for cuda-core releases as well as cuda-bindings patches. Please go through this checklist and ensure all tasks are completed. See [RELEASE.md](../RELEASE.md) for detailed guidance on each step.
1414
1515
- type: checkboxes
1616
id: subpackage-tasks
@@ -20,17 +20,13 @@ body:
2020
- label: File an internal nvbug to communicate test plan & release schedule with QA
2121
- label: Ensure all pending PRs are reviewed, tested, and merged
2222
- label: Check (or update if needed) the dependency requirements
23-
- label: Create a public rc tag
24-
- label: "Point QA to fetch public artifacts (wheels) from the GHA run ID, example: `gh run download 12323257563 -p \"cuda-core*\" -R NVIDIA/cuda-python`"
25-
- label: Wait for QA reports and fix any issues found
2623
- label: "Finalize the doc update, including release notes (\"Note: Touching docstrings/type annotations in code is OK during code freeze, apply your best judgement!\")"
2724
- label: Update the docs for the new version
2825
- label: Create a public release tag
2926
- label: Wait for the tag-triggered CI run to complete, and use that run ID for release workflows
3027
- label: If any code change happens, rebuild the wheels from the new tag
31-
- label: Update the conda recipe & release conda packages
32-
- label: Upload conda packages to nvidia channel
3328
- label: Upload wheels to PyPI
29+
- label: Update the conda recipe & release conda packages
3430
- label: Post-release QA
3531
- label: Finalize the announcement update
3632
- label: Send out the announcement internally

.github/RELEASE.md

Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
<!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -->
2+
<!-- SPDX-License-Identifier: Apache-2.0 -->
3+
4+
# Release Process
5+
6+
This document provides detailed guidance for each step of the
7+
[Release Checklist](ISSUE_TEMPLATE/release_checklist.yml). To start a
8+
release, create a new issue from that template and work through it item by
9+
item, referring back here as needed.
10+
11+
---
12+
13+
## File an internal nvbug
14+
15+
Create an nvbug from the SWQA template to request pre-release validation.
16+
To find the template, search for a previous release's nvbug (e.g. by
17+
title "Release of cuda.core") and create a new bug from the same template.
18+
19+
Example (from the cuda.core v0.6.0 release,
20+
[nvbug 5910741](https://nvbugspro.nvidia.com/bug/5910741)):
21+
22+
> **Title:** Release of cuda.core v0.6.0
23+
>
24+
> **Description:**
25+
>
26+
> Requesting SWQA validation for the cuda.core v0.6.0 release. Please test
27+
> the following SW combinations on all listed platforms and report any
28+
> issues found.
29+
>
30+
> **SW Combinations**
31+
> - cuda.core 0.6.0 / cuda.bindings 12.9 / CTK 12.9 / CUDA 12.9 driver
32+
> - cuda.core 0.6.0 / cuda.bindings 13.0 / CTK 13.0 / CUDA 13.0 driver
33+
> - cuda.core 0.6.0 / cuda.bindings 13.1 / CTK 13.1 / CUDA 13.1 driver
34+
>
35+
> **Platforms**
36+
> - Linux x86-64
37+
> - Linux arm64
38+
> - Windows x86-64 (TCC and WDDM)
39+
> - WSL
40+
>
41+
> **Test Plan**
42+
>
43+
> Functional tests as described in the cuda.core test plan.
44+
>
45+
> **Release Milestones**
46+
> - Pre-release QA (this request)
47+
> - GitHub release tag and posting
48+
> - PyPI wheel upload
49+
> - Post-release validation
50+
51+
**How to determine the SW combinations:**
52+
53+
- **cuda.core version**: The version being released.
54+
- **cuda.bindings, CTK, and CUDA driver versions**: Check with the release owner.
55+
56+
Update the version, SW combinations, and platforms as appropriate for each
57+
release.
58+
59+
---
60+
61+
## Check (or update if needed) the dependency requirements
62+
63+
Review `cuda_core/pyproject.toml` and verify the following are current:
64+
65+
- `requires-python` — supported Python version range
66+
- `dependencies` — runtime dependencies (e.g. `numpy`)
67+
- `[project.optional-dependencies]``cuda-bindings` version pins for
68+
`cu12` / `cu13` extras
69+
- `[build-system] requires` — Cython and setuptools version pins
70+
- `[dependency-groups]` — test dependencies (`ml-dtypes`, `cupy`,
71+
`cuda-toolkit` version pins)
72+
- Python version classifiers in `[project]`
73+
74+
---
75+
76+
## Finalize the doc update, including release notes
77+
78+
Review every PR included in the release. For each one, check whether new
79+
functions, classes, or features were added and whether they have complete
80+
docstrings. Add or edit docstrings as needed — touching docstrings and
81+
type annotations in code is OK during code freeze.
82+
83+
Write the release notes in `cuda_core/docs/source/release/`. Look at
84+
historical release notes for guidance on format and structure. Balance all
85+
entries for length, specificity, tone, and consistency. Highlight a few
86+
notable items in the highlights section, keeping their full entries in the
87+
appropriate sections below.
88+
89+
---
90+
91+
## Update the docs for the new version
92+
93+
Add the new version to
94+
`cuda_core/docs/nv-versions.json`. This file drives the version
95+
switcher on the documentation site. Add an entry for the new version
96+
after `"latest"`, following the existing pattern. The docs themselves are
97+
built and deployed automatically by the release workflow.
98+
99+
---
100+
101+
## Create a public release tag
102+
103+
**Warning:** Pushing a tag is a potentially irrevocable action. Be absolutely
104+
certain the tag points to the correct commit before pushing.
105+
106+
Tags should be GPG-signed. The tag name format is `cuda-core-v<VERSION>`
107+
(e.g. `cuda-core-v0.6.0`). The tag must point to a commit on `main`.
108+
109+
```bash
110+
git checkout main
111+
git pull origin main
112+
git tag -s cuda-core-v0.6.0 -m "cuda-core v0.6.0"
113+
git push origin cuda-core-v0.6.0
114+
```
115+
116+
---
117+
118+
## Wait for the tag-triggered CI run to complete
119+
120+
Pushing the tag triggers a CI run automatically. Monitor it in the
121+
**Actions** tab on GitHub.
122+
123+
- **The docs build is expected to fail** on tag-triggered runs. This is
124+
normal — docs are built during the release workflow instead.
125+
- **All CI tests should succeed.** If any fail, investigate and rerun as
126+
needed.
127+
- Note the **run ID** of the successful tag-triggered run. The release
128+
workflow can auto-detect it from the tag, but you can also provide it
129+
explicitly.
130+
131+
---
132+
133+
## Upload wheels to PyPI
134+
135+
This is a two-stage process: first publish to TestPyPI, verify, then
136+
publish to PyPI.
137+
138+
### Stage 1: TestPyPI
139+
140+
1. Go to **Actions > CI: Release** and run the workflow with:
141+
- **Component**: `cuda-core`
142+
- **The release git tag**: `cuda-core-v0.6.0`
143+
- **The GHA run ID that generated validated artifacts**: This is the
144+
run ID of the successful tag-triggered CI run from the previous step.
145+
You can find it in the URL when viewing the run in the Actions tab
146+
(e.g. `https://github.com/NVIDIA/cuda-python/actions/runs/123456789`
147+
— the run ID is `123456789`).
148+
- **build-ctk-ver**: the `cuda.build.version` from
149+
[`ci/versions.yml`](../ci/versions.yml) (e.g. `13.1.1`)
150+
- **Which wheel index to publish to**: `testpypi`
151+
152+
2. Wait for the workflow to complete. The docs build step will fail on
153+
forks — this is expected and does not block the wheel upload.
154+
155+
3. Verify the TestPyPI upload by installing and running tests locally:
156+
157+
```bash
158+
pip install -i https://test.pypi.org/simple/ \
159+
--extra-index-url https://pypi.org/simple/ \
160+
cuda-core==0.6.0
161+
cd cuda_core/tests && pytest
162+
```
163+
164+
### Stage 2: PyPI
165+
166+
Once TestPyPI verification passes, rerun the same workflow with:
167+
- **Which wheel index to publish to**: `pypi`
168+
169+
After completion, verify:
170+
171+
```bash
172+
pip install cuda-core==0.6.0
173+
```
174+
175+
---
176+
177+
## Update the conda recipe & release conda packages
178+
179+
The conda-forge feedstock builds from the GitHub Release source archive
180+
(not from PyPI). The bot (`regro-cf-autotick-bot`) does not always pick up
181+
new releases automatically, so you may need to open the PR manually.
182+
183+
### Fork and clone the feedstock
184+
185+
```bash
186+
gh repo fork conda-forge/cuda-core-feedstock --clone
187+
cd cuda-core-feedstock
188+
```
189+
190+
Optional: Set up remotes so your fork is named after your GitHub username:
191+
192+
```bash
193+
git remote rename origin <your-github-username>
194+
git remote add origin https://github.com/conda-forge/cuda-core-feedstock.git
195+
git fetch origin
196+
```
197+
198+
### Update `recipe/meta.yaml`
199+
200+
Create a branch and edit `recipe/meta.yaml`:
201+
202+
```bash
203+
git checkout -b update-v0.6.0 origin/main
204+
```
205+
206+
Update the following fields:
207+
208+
1. **`version`**: Set to the new version (e.g. `0.6.0`).
209+
2. **`number`** (build number): Reset to `0` for a new version.
210+
3. **`sha256`**: The SHA-256 of the source archive from the GitHub
211+
Release. Download it and compute the hash:
212+
213+
```bash
214+
curl -sL https://github.com/NVIDIA/cuda-python/releases/download/cuda-core-v0.6.0/cuda-python-cuda-core-v0.6.0.tar.gz \
215+
| sha256sum
216+
```
217+
218+
4. **Host dependencies**: Ensure all headers needed at build time are
219+
listed. For example, v0.6.0 added a Cython C++ dependency on
220+
`nvrtc.h`, requiring `cuda-nvrtc-dev` to be added to both `host`
221+
requirements and `ignore_run_exports_from`.
222+
223+
5. **Test commands and descriptions**: Update any import paths or
224+
descriptions that changed (e.g. `cuda.core.experimental` ->
225+
`cuda.core`).
226+
227+
### Open a PR
228+
229+
```bash
230+
git add recipe/meta.yaml
231+
git commit -m "Update cuda-core to 0.6.0"
232+
git push <your-github-username> update-v0.6.0
233+
234+
gh pr create \
235+
--repo conda-forge/cuda-core-feedstock \
236+
--head <your-github-username>:update-v0.6.0 \
237+
--title "Update cuda-core to 0.6.0" \
238+
--body "Update cuda-core to version 0.6.0."
239+
```
240+
241+
The feedstock CI (Azure Pipelines) triggers automatically on the PR.
242+
Monitor it for build failures — common issues include missing
243+
build-time header dependencies (see host dependencies above).
244+
245+
---
246+
247+
## Post-release QA
248+
249+
*TBD*
250+
251+
---
252+
253+
## Finalize the announcement update
254+
255+
*TBD*
256+
257+
---
258+
259+
## Send out the announcement internally
260+
261+
*TBD*
262+
263+
---
264+
265+
## Send out the announcement externally (GitHub Release -> Announcement)
266+
267+
*TBD*

0 commit comments

Comments
 (0)