Skip to content

Commit 04a2fa7

Browse files
committed
Merge remote-tracking branch 'upstream/main' into release-13.4.2
2 parents 5c3a8e9 + 58c276e commit 04a2fa7

184 files changed

Lines changed: 33419 additions & 31534 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/ISSUE_TEMPLATE/release_checklist.yml‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ body:
2424
- label: "Finalize the doc update, including release notes (\"Note: Touching docstrings/type annotations in code is OK during code freeze, apply your best judgement!\")"
2525
- label: Update the docs for the new version
2626
- label: Create a public release tag
27-
- label: Wait for the tag-triggered CI run to complete, and use that run ID for release workflows
28-
- label: If any code change happens, rebuild the wheels from the new tag
29-
- label: Upload wheels to PyPI
30-
- label: Update the conda recipe & release conda packages
27+
- label: Wait for the tag-triggered CI run to complete, and use that run ID for release workflows (this will upload the release to PyPI)
28+
- label: Publish the release at https://github.com/NVIDIA/cuda-python/releases (this will trigger the conda package update)
29+
- label: Approve the conda-package update PR
3130
- label: Post-release QA
3231
- label: Finalize the announcement update
33-
- label: Send out the announcement internally
32+
- label: Send out the announcement internally (on `#swcuda-python`)
3433
- label: Send out the announcement externally (GitHub Release -> Announcement)
34+
- label: For a `cuda-bindings` release, make sure MAJOR and MAJOR-1 releases are made, as well as releases of `cuda-python` for MAJOR and MAJOR-1
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
name: Setup pinned pixi
6+
description: Install the repository's canonical pixi version without installing an environment
7+
8+
outputs:
9+
pixi-version:
10+
description: The canonical pixi version installed by this action
11+
value: ${{ steps.version.outputs.pixi-version }}
12+
13+
runs:
14+
using: composite
15+
steps:
16+
- name: Read canonical pixi version
17+
id: version
18+
shell: bash --noprofile --norc -euo pipefail {0}
19+
run: |
20+
source "${GITHUB_WORKSPACE}/ci/pixi-version.env"
21+
if [[ ! "${PIXI_VERSION:-}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
22+
echo "::error::ci/pixi-version.env must set PIXI_VERSION in vMAJOR.MINOR.PATCH form"
23+
exit 1
24+
fi
25+
echo "pixi-version=${PIXI_VERSION}" >> "${GITHUB_OUTPUT}"
26+
27+
- name: Setup pixi ${{ steps.version.outputs.pixi-version }}
28+
# Pinned to a commit SHA; install logic lives in the action and is
29+
# auditable/pinned (vs. a curl|bash of an unverified installer).
30+
uses: prefix-dev/setup-pixi@5185adfbffb4bd703da3010310260805d89ebb11 # v0.9.6
31+
with:
32+
pixi-version: ${{ steps.version.outputs.pixi-version }}
33+
run-install: false

‎.github/workflows/build-wheel.yml‎

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -223,19 +223,14 @@ jobs:
223223

224224
- name: Build cuda.bindings wheel
225225
if: ${{ env.BUILD_BINDINGS == 'true' }}
226-
uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
226+
uses: pypa/cibuildwheel@e090b81e30c4d855ea63bf4b6e59204c09a101ae # v4.2.1
227227
with:
228228
package-dir: ./cuda_bindings/
229229
output-dir: ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}
230230
env:
231231
CIBW_BUILD: ${{ env.CIBW_BUILD }}
232232
CIBW_BEFORE_BUILD_LINUX: 'python -m pip install --upgrade "pip>=25.3"'
233233
CIBW_BEFORE_BUILD_WINDOWS: 'python -m pip install --upgrade "pip>=25.3" delvewheel'
234-
# TODO: remove cpython-prerelease once 3.15 is officially supported
235-
# Allow CPython pre-release builds (currently 3.15 / 3.15t). This is a
236-
# no-op for stable Python versions because CIBW_BUILD still filters
237-
# the target version.
238-
CIBW_ENABLE: cpython-prerelease
239234
# CIBW mounts the host filesystem under /host
240235
CIBW_ENVIRONMENT_LINUX: >
241236
CUDA_PATH=/host/${{ env.CUDA_PATH }}
@@ -250,8 +245,6 @@ jobs:
250245
ACTIONS_RESULTS_URL=${{ env.ACTIONS_RESULTS_URL }}
251246
ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }}
252247
ACTIONS_CACHE_SERVICE_V2=${{ env.ACTIONS_CACHE_SERVICE_V2 }}
253-
SCCACHE_DIR=/host/${{ env.SCCACHE_DIR }}
254-
SCCACHE_CACHE_SIZE=${{ env.SCCACHE_CACHE_SIZE }}
255248
CIBW_ENVIRONMENT_WINDOWS: >
256249
CUDA_PATH="$(cygpath -w ${{ env.CUDA_PATH }})"
257250
CUDA_PYTHON_PARALLEL_LEVEL=${{ env.CUDA_PYTHON_PARALLEL_LEVEL }}
@@ -330,19 +323,14 @@ jobs:
330323

331324
- name: Build cuda.core wheel
332325
if: ${{ env.BUILD_CORE == 'true' }}
333-
uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
326+
uses: pypa/cibuildwheel@e090b81e30c4d855ea63bf4b6e59204c09a101ae # v4.2.1
334327
with:
335328
package-dir: ./cuda_core/
336329
output-dir: ${{ env.CUDA_CORE_ARTIFACTS_DIR }}
337330
env:
338331
CIBW_BUILD: ${{ env.CIBW_BUILD }}
339332
CIBW_BEFORE_BUILD_LINUX: 'python -m pip install --upgrade "pip>=25.3"'
340333
CIBW_BEFORE_BUILD_WINDOWS: 'python -m pip install --upgrade "pip>=25.3" delvewheel'
341-
# TODO: remove cpython-prerelease once 3.15 is officially supported
342-
# Allow CPython pre-release builds (currently 3.15 / 3.15t). This is a
343-
# no-op for stable Python versions because CIBW_BUILD still filters
344-
# the target version.
345-
CIBW_ENABLE: cpython-prerelease
346334
# CIBW mounts the host filesystem under /host
347335
CIBW_ENVIRONMENT_LINUX: >
348336
CUDA_PATH=/host/${{ env.CUDA_PATH }}
@@ -358,8 +346,6 @@ jobs:
358346
ACTIONS_RESULTS_URL=${{ env.ACTIONS_RESULTS_URL }}
359347
ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }}
360348
ACTIONS_CACHE_SERVICE_V2=${{ env.ACTIONS_CACHE_SERVICE_V2 }}
361-
SCCACHE_DIR=/host/${{ env.SCCACHE_DIR }}
362-
SCCACHE_CACHE_SIZE=${{ env.SCCACHE_CACHE_SIZE }}
363349
CIBW_ENVIRONMENT_WINDOWS: >
364350
CUDA_PATH="$(cygpath -w ${{ env.CUDA_PATH }})"
365351
CUDA_PYTHON_PARALLEL_LEVEL=${{ env.CUDA_PYTHON_PARALLEL_LEVEL }}
@@ -624,19 +610,14 @@ jobs:
624610
625611
- name: Build cuda.core wheel
626612
if: ${{ !inputs.single-cuda-major && env.BUILD_CORE == 'true' }}
627-
uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
613+
uses: pypa/cibuildwheel@e090b81e30c4d855ea63bf4b6e59204c09a101ae # v4.2.1
628614
with:
629615
package-dir: ./cuda_core/
630616
output-dir: ${{ env.CUDA_CORE_ARTIFACTS_DIR }}
631617
env:
632618
CIBW_BUILD: ${{ env.CIBW_BUILD }}
633619
CIBW_BEFORE_BUILD_LINUX: 'python -m pip install --upgrade "pip>=25.3"'
634620
CIBW_BEFORE_BUILD_WINDOWS: 'python -m pip install --upgrade "pip>=25.3" delvewheel'
635-
# TODO: remove cpython-prerelease once 3.15 is officially supported
636-
# Allow CPython pre-release builds (currently 3.15 / 3.15t). This is a
637-
# no-op for stable Python versions because CIBW_BUILD still filters
638-
# the target version.
639-
CIBW_ENABLE: cpython-prerelease
640621
# CIBW mounts the host filesystem under /host
641622
CIBW_ENVIRONMENT_LINUX: >
642623
CUDA_PATH=/host/${{ env.CUDA_PATH }}
@@ -652,8 +633,6 @@ jobs:
652633
ACTIONS_RESULTS_URL=${{ env.ACTIONS_RESULTS_URL }}
653634
ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }}
654635
ACTIONS_CACHE_SERVICE_V2=${{ env.ACTIONS_CACHE_SERVICE_V2 }}
655-
SCCACHE_DIR=/host/${{ env.SCCACHE_DIR }}
656-
SCCACHE_CACHE_SIZE=${{ env.SCCACHE_CACHE_SIZE }}
657636
CIBW_ENVIRONMENT_WINDOWS: >
658637
CUDA_PATH="$(cygpath -w ${{ env.CUDA_PATH }})"
659638
CUDA_PYTHON_PARALLEL_LEVEL=${{ env.CUDA_PYTHON_PARALLEL_LEVEL }}
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
# Fails when a committed pixi.lock is out of date with its pixi.toml, or when
6+
# its bytes are not what the pinned pixi version generates.
7+
# Remediation for both: regenerate and commit the lockfile with that pixi
8+
# version, e.g.
9+
# pixi lock --manifest-path <path>
10+
# Keep this check advisory during its initial rollout. Before making it
11+
# required, expose a stable aggregate check, account for the path filters, and
12+
# record the decision in #2804 after the workflow has operational history.
13+
# See #2298.
14+
15+
name: "CI: pixi lockfile freshness check"
16+
17+
concurrency:
18+
# Keyed on the event as well as the ref so a manual dispatch and a push to
19+
# the same branch do not cancel each other.
20+
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
21+
cancel-in-progress: true
22+
23+
on:
24+
pull_request:
25+
# `pyproject.toml` is a lockfile input too: the manifests consume sibling
26+
# packages (including cuda_python_test_helpers) as path dependencies, so
27+
# their metadata can stale a lock without any pixi.toml edit. Matched by
28+
# glob rather than by name so the filter cannot drift as packages move.
29+
paths: &lockfile_inputs
30+
- "**/pixi.toml"
31+
- "**/pixi.lock"
32+
- "**/pyproject.toml"
33+
- "ci/tools/list_pixi_workspaces.py"
34+
- "ci/pixi-version.env"
35+
- ".github/actions/setup-pixi/action.yml"
36+
- ".github/workflows/ci-pixi-lockfile-freshness-check.yml"
37+
push:
38+
# `pull_request` already covers PRs, including those from forks: this check
39+
# needs no secrets or GPU runner. Watching copy-pr-bot's `pull-request/N`
40+
# mirror too would run the whole check a second time per PR.
41+
branches:
42+
- "main"
43+
paths: *lockfile_inputs
44+
workflow_dispatch: {}
45+
46+
defaults:
47+
run:
48+
shell: bash --noprofile --norc -xeuo pipefail {0}
49+
50+
env:
51+
REFRESH_WORKFLOW_URL: "https://github.com/NVIDIA/cuda-python/actions/workflows/ci-pixi-lockfile-refresh.yml"
52+
53+
permissions: {}
54+
55+
jobs:
56+
lockfile-fresh:
57+
name: pixi lock --check (all workspaces)
58+
if: ${{ github.repository_owner == 'nvidia' }}
59+
runs-on: ubuntu-latest
60+
timeout-minutes: 135
61+
permissions:
62+
contents: read
63+
steps:
64+
- name: Checkout ${{ github.event.repository.name }}
65+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
66+
with:
67+
fetch-depth: 1
68+
persist-credentials: false
69+
70+
- name: Setup pixi
71+
id: setup-pixi
72+
uses: ./.github/actions/setup-pixi
73+
74+
# `pixi lock --check` exits 0 on a semantically current lock even when it
75+
# rewrites the file into the pinned version's canonical form (lockfile
76+
# format upgrades, platform alias renames). Without this guard that drift
77+
# is invisible: the check prints "Updated lock file" and still passes,
78+
# while every later pixi run keeps rewriting the committed file (#2298).
79+
- name: Check all lockfiles
80+
env:
81+
PIXI_VERSION: ${{ steps.setup-pixi.outputs.pixi-version }}
82+
WORKSPACE_TIMEOUT: 20m
83+
run: |
84+
workspaces="$(python3 ci/tools/list_pixi_workspaces.py)"
85+
workspace_rows="$(
86+
jq -ce '
87+
if type != "array" or length == 0 then
88+
error("workspace inventory must be a non-empty array")
89+
elif any(.[];
90+
type != "object"
91+
or (.manifest | type != "string")
92+
or (.lockfile | type != "string")
93+
or .manifest == ""
94+
or .lockfile == ""
95+
) then
96+
error("each workspace must have non-empty string manifest and lockfile fields")
97+
else
98+
.[]
99+
end
100+
' <<<"${workspaces}"
101+
)"
102+
failed=0
103+
104+
while IFS= read -r workspace; do
105+
manifest="$(jq -r '.manifest' <<<"${workspace}")"
106+
lockfile="$(jq -r '.lockfile' <<<"${workspace}")"
107+
echo "::group::pixi lock --check (${manifest})"
108+
109+
check_status=0
110+
timeout --kill-after=1m "${WORKSPACE_TIMEOUT}" \
111+
pixi lock --check --manifest-path "${manifest}" \
112+
|| check_status=$?
113+
if ((check_status == 124 || check_status == 137)); then
114+
echo "::error::Timed out after ${WORKSPACE_TIMEOUT} while checking '${manifest}'."
115+
failed=1
116+
elif ((check_status != 0)); then
117+
echo "::error::Lockfile is stale for '${manifest}'. Regenerate with: pixi lock --manifest-path ${manifest}. For default-branch dependency drift, maintainers can run ${REFRESH_WORKFLOW_URL}"
118+
failed=1
119+
elif ! git diff --exit-code -- "${lockfile}"; then
120+
echo "::error::pixi ${PIXI_VERSION} rewrote ${lockfile} during the check, so the committed bytes are not what it generates. Regenerate with pixi ${PIXI_VERSION}: pixi lock --manifest-path ${manifest}. For default-branch dependency drift, maintainers can run ${REFRESH_WORKFLOW_URL}"
121+
failed=1
122+
fi
123+
124+
echo "::endgroup::"
125+
done <<<"${workspace_rows}"
126+
127+
exit "${failed}"

0 commit comments

Comments
 (0)