Skip to content

Commit 2fe1140

Browse files
authored
Merge branch 'main' into fix/core-test-coverage
2 parents a94c136 + c7e6f09 commit 2fe1140

14 files changed

Lines changed: 1005 additions & 1265 deletions

File tree

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,16 +93,16 @@ jobs:
9393
| sudo tar -C /usr/local/bin -xvzf - --wildcards --strip-components=1 -x '*/sccache'
9494
echo "SCCACHE_PATH=/usr/local/bin/sccache" >> "$GITHUB_ENV"
9595
96+
# The runner only exposes these values to actions, not to `run:` steps or
97+
# the cibuildwheel container, so re-export them for sccache's GHA backend.
9698
# xref: https://github.com/orgs/community/discussions/42856#discussioncomment-7678867
9799
- name: Adding addtional GHA cache-related env vars
98100
if: ${{ env.BUILD_BINDINGS == 'true' || env.BUILD_CORE == 'true' }}
99101
uses: actions/github-script@v9
100102
with:
101103
script: |
102104
core.exportVariable('ACTIONS_CACHE_SERVICE_V2', 'on');
103-
core.exportVariable('ACTIONS_CACHE_URL', process.env['ACTIONS_CACHE_URL'] || '');
104105
core.exportVariable('ACTIONS_RESULTS_URL', process.env['ACTIONS_RESULTS_URL'] || '');
105-
core.exportVariable('ACTIONS_RUNTIME_URL', process.env['ACTIONS_RUNTIME_URL'] || '');
106106
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env['ACTIONS_RUNTIME_TOKEN'] || '');
107107
108108
- name: Setup proxy cache
@@ -254,9 +254,7 @@ jobs:
254254
CXX="/host/${{ env.SCCACHE_PATH }} c++"
255255
SCCACHE_GHA_ENABLED=true
256256
ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }}
257-
ACTIONS_RUNTIME_URL=${{ env.ACTIONS_RUNTIME_URL }}
258257
ACTIONS_RESULTS_URL=${{ env.ACTIONS_RESULTS_URL }}
259-
ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }}
260258
ACTIONS_CACHE_SERVICE_V2=${{ env.ACTIONS_CACHE_SERVICE_V2 }}
261259
CIBW_ENVIRONMENT_WINDOWS: >
262260
CUDA_PATH="$(cygpath -w ${{ env.CUDA_PATH }})"
@@ -353,9 +351,7 @@ jobs:
353351
CXX="/host/${{ env.SCCACHE_PATH }} c++"
354352
SCCACHE_GHA_ENABLED=true
355353
ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }}
356-
ACTIONS_RUNTIME_URL=${{ env.ACTIONS_RUNTIME_URL }}
357354
ACTIONS_RESULTS_URL=${{ env.ACTIONS_RESULTS_URL }}
358-
ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }}
359355
ACTIONS_CACHE_SERVICE_V2=${{ env.ACTIONS_CACHE_SERVICE_V2 }}
360356
CIBW_ENVIRONMENT_WINDOWS: >
361357
CUDA_PATH="$(cygpath -w ${{ env.CUDA_PATH }})"
@@ -639,9 +635,7 @@ jobs:
639635
CXX="/host/${{ env.SCCACHE_PATH }} c++"
640636
SCCACHE_GHA_ENABLED=true
641637
ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }}
642-
ACTIONS_RUNTIME_URL=${{ env.ACTIONS_RUNTIME_URL }}
643638
ACTIONS_RESULTS_URL=${{ env.ACTIONS_RESULTS_URL }}
644-
ACTIONS_CACHE_URL=${{ env.ACTIONS_CACHE_URL }}
645639
ACTIONS_CACHE_SERVICE_V2=${{ env.ACTIONS_CACHE_SERVICE_V2 }}
646640
CIBW_ENVIRONMENT_WINDOWS: >
647641
CUDA_PATH="$(cygpath -w ${{ env.CUDA_PATH }})"

‎.github/workflows/ci-nightly.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ jobs:
4444

4545
- name: Run CI tools unit tests
4646
run: |
47-
python -m pip install pytest
47+
python -m pip install pytest pyyaml==6.0.3
4848
# Standalone CI tool tests; skip repo-root conftest.py (imports cuda.pathfinder).
4949
python -m pytest -v --noconftest ci/tools/tests
5050

‎.github/workflows/ci-pixi-lockfile-freshness-check.yml‎

Lines changed: 10 additions & 276 deletions
Large diffs are not rendered by default.

‎.github/workflows/ci-pixi-lockfile-refresh.yml‎

Lines changed: 10 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,11 @@
22
#
33
# SPDX-License-Identifier: Apache-2.0
44

5-
# Scheduled (and on-demand) pixi lockfile refresh. All workspaces are updated
6-
# in one job and, when anything changes, one PR. See #2298 and #2849.
7-
5+
# Scheduled refreshes are paused. Manual dispatch reports the suspension only.
6+
# Re-enable only after the released Pixi validation described in ci/README.md.
87
name: "CI: pixi lockfile refresh"
98

109
on:
11-
schedule:
12-
# Monday 03:17 Eastern. GitHub handles the DST offset for the IANA zone,
13-
# and a non-zero minute avoids the start-of-hour window where GitHub
14-
# documents scheduled runs being delayed or dropped.
15-
- cron: "17 3 * * 1"
16-
timezone: "America/New_York"
1710
workflow_dispatch: {}
1811

1912
defaults:
@@ -25,163 +18,18 @@ permissions: {}
2518
jobs:
2619
refresh:
2720
name: pixi update (all workspaces)
28-
if: ${{ github.repository_owner == 'nvidia' }}
2921
runs-on: ubuntu-latest
30-
timeout-minutes: 195
31-
permissions:
32-
contents: write
33-
pull-requests: write
34-
concurrency:
35-
group: pixi-lock-refresh
36-
cancel-in-progress: false
22+
timeout-minutes: 5
3723
steps:
38-
- name: Checkout ${{ github.event.repository.name }}
39-
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
40-
with:
41-
# Full history and tags for package metadata, without historical
42-
# file contents. See ci/README.md for the checkout policy.
43-
fetch-depth: 0
44-
filter: blob:none
45-
ref: ${{ github.event.repository.default_branch }}
46-
47-
- name: Setup pixi
48-
id: setup-pixi
49-
uses: ./.github/actions/setup-pixi
50-
51-
# Pixi 0.73.0's update and lock-read paths can serialize the same solve
52-
# differently (#2804). Canonicalize with the same operation used by the
53-
# freshness workflow before opening the PR.
54-
- name: Update and canonicalize all lockfiles
55-
id: update
56-
env:
57-
PIXI_VERSION: ${{ steps.setup-pixi.outputs.pixi-version }}
58-
WORKSPACE_TIMEOUT: 30m
59-
run: |
60-
workspaces="$(python3 ci/tools/list_pixi_workspaces.py)"
61-
workspace_rows="$(
62-
jq -ce '
63-
if type != "array" or length == 0 then
64-
error("workspace inventory must be a non-empty array")
65-
elif any(.[];
66-
type != "object"
67-
or (.manifest | type != "string")
68-
or (.lockfile | type != "string")
69-
or .manifest == ""
70-
or .lockfile == ""
71-
) then
72-
error("each workspace must have non-empty string manifest and lockfile fields")
73-
else
74-
.[]
75-
end
76-
' <<<"${workspaces}"
77-
)"
78-
79-
while IFS= read -r workspace; do
80-
manifest="$(jq -r '.manifest' <<<"${workspace}")"
81-
lockfile="$(jq -r '.lockfile' <<<"${workspace}")"
82-
echo "::group::pixi update (${manifest})"
83-
84-
workspace_status=0
85-
# The single-quoted script expands its variables in the child shell.
86-
# shellcheck disable=SC2016
87-
timeout --kill-after=1m "${WORKSPACE_TIMEOUT}" \
88-
bash --noprofile --norc -xeuo pipefail -c '
89-
manifest="$1"
90-
lockfile="$2"
91-
pixi_version="$3"
92-
93-
pixi update --no-install --manifest-path "${manifest}"
94-
pixi lock --check --manifest-path "${manifest}"
95-
96-
canonical_blob="$(git hash-object "${lockfile}")"
97-
pixi lock --check --manifest-path "${manifest}"
98-
verified_blob="$(git hash-object "${lockfile}")"
99-
if [ "${canonical_blob}" != "${verified_blob}" ]; then
100-
echo "::error::pixi ${pixi_version} rewrote ${lockfile} on a second consecutive pixi lock --check; refusing to open an unstable refresh PR."
101-
exit 1
102-
fi
103-
' bash "${manifest}" "${lockfile}" "${PIXI_VERSION}" \
104-
|| workspace_status=$?
105-
106-
if ((workspace_status == 124 || workspace_status == 137)); then
107-
echo "::error::Timed out after ${WORKSPACE_TIMEOUT} while refreshing '${manifest}'."
108-
elif ((workspace_status != 0)); then
109-
echo "::error::Failed to refresh '${manifest}' (exit ${workspace_status})."
110-
fi
111-
echo "::endgroup::"
112-
if ((workspace_status != 0)); then
113-
exit "${workspace_status}"
114-
fi
115-
done <<<"${workspace_rows}"
116-
117-
{
118-
echo "lockfiles<<EOF"
119-
jq -r '.[].lockfile' <<<"${workspaces}"
120-
echo "EOF"
121-
} >> "${GITHUB_OUTPUT}"
122-
123-
- name: Compose PR body
124-
id: pr-body
125-
env:
126-
PIXI_VERSION: ${{ steps.setup-pixi.outputs.pixi-version }}
24+
- name: Report temporary suspension
12725
run: |
128-
body_path="${RUNNER_TEMP}/pixi-lock-refresh-body.md"
26+
echo "::warning title=Pixi lockfile maintenance suspended::Pixi lockfile freshness enforcement and automated refreshes are temporarily suspended pending a verified released Pixi fix. Freshness was not checked."
12927
{
130-
echo "Automated lockfile refresh for all workspaces using pixi" \
131-
"\`${PIXI_VERSION}\` (\`pixi update --no-install\`, followed by" \
132-
"byte-stable \`pixi lock --check\` canonicalization)."
28+
echo "### Pixi lockfile maintenance temporarily suspended"
13329
echo
134-
echo "Lockfiles included in the refresh:"
135-
python3 ci/tools/list_pixi_workspaces.py \
136-
| jq -r '.[] | "- `\(.lockfile)`"'
30+
echo "Freshness enforcement and automated refreshes are temporarily suspended. This successful job reports the suspension; it does not verify manifest/lock consistency."
13731
echo
138-
echo "See #2298 and #2849."
32+
echo "Source builds and tests continue using the committed lockfiles with \`PIXI_FROZEN=true\`. Dependency changes require manual review and validation."
13933
echo
140-
echo "> [!IMPORTANT]"
141-
echo "> This PR was opened with \`GITHUB_TOKEN\`. A maintainer with write access must:"
142-
echo ">"
143-
echo "> 1. Select **Approve workflows to run** in the merge box."
144-
echo "> 2. Assign themselves to this PR. The human-generated \`assigned\` event"
145-
echo "> creates the required **PR has assignee, labels, and milestone** check"
146-
echo "> and gives the PR a clear owner."
147-
echo
148-
echo "If the diff looks wrong, close this PR and leave the branch deleted; the"
149-
echo "next scheduled run opens a fresh one if an update is still needed."
150-
} > "${body_path}"
151-
echo "path=${body_path}" >> "${GITHUB_OUTPUT}"
152-
153-
- name: Open or update a lockfile-only PR
154-
id: cpr
155-
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
156-
with:
157-
token: ${{ github.token }}
158-
add-paths: ${{ steps.update.outputs.lockfiles }}
159-
commit-message: "chore: refresh pixi lockfiles"
160-
signoff: true
161-
sign-commits: true
162-
branch: ci/pixi-lock-refresh/all
163-
delete-branch: true
164-
title: "chore: refresh pixi lockfiles"
165-
labels: |
166-
CI/CD
167-
dependencies
168-
body-path: ${{ steps.pr-body.outputs.path }}
169-
author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
170-
committer: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
171-
172-
- name: Warn about required maintainer action
173-
if: ${{ steps.cpr.outputs.pull-request-operation == 'created' || steps.cpr.outputs.pull-request-operation == 'updated' }}
174-
run: echo "::warning::The refresh PR requires a maintainer to approve its workflow runs and assign themselves to create the required metadata check."
175-
176-
- name: Summarize
177-
run: |
178-
{
179-
echo "### pixi lock refresh (all workspaces)"
180-
echo ""
181-
echo "- Operation: \`${{ steps.cpr.outputs.pull-request-operation }}\`"
182-
if [ -n "${{ steps.cpr.outputs.pull-request-url }}" ]; then
183-
echo "- PR: ${{ steps.cpr.outputs.pull-request-url }}"
184-
else
185-
echo "- No lockfile diff; PR not opened."
186-
fi
187-
} >> "$GITHUB_STEP_SUMMARY"
34+
echo "See [CI documentation](https://github.com/NVIDIA/cuda-python/blob/main/ci/README.md#temporary-pixi-lockfile-maintenance-pause) for the tradeoff and re-enable criteria."
35+
} >> "${GITHUB_STEP_SUMMARY}"

‎.github/workflows/ci-pixi-source-test.yml‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,13 @@ defaults:
6262
shell: bash --noprofile --norc -xeuo pipefail {0}
6363

6464
env:
65-
# Install from the committed lockfile only. Covers nested `pixi run` calls
66-
# from root pixi.toml tasks; a stale lock must fail rather than being
67-
# refreshed in CI (#2298). Equivalent to `pixi run --locked`.
68-
PIXI_LOCKED: "true"
65+
# Temporarily bypass Pixi's workspace-wide freshness check: the unrelated
66+
# samples environment oscillates because excluded PyPI dependencies are
67+
# still checked. Frozen mode keeps the committed solution and source builds,
68+
# including nested `pixi run` calls. Freshness enforcement and automated
69+
# refreshes are temporarily suspended; dependency changes need manual review.
70+
# Restore PIXI_LOCKED after the released-fix validation in ci/README.md.
71+
PIXI_FROZEN: "true"
6972

7073
jobs:
7174
# ── PR guard: CPU-only build + import + placement smoke ──

‎.github/workflows/test-sdist-linux.yml‎

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,9 @@ jobs:
9090
if: ${{ env.BUILD_BINDINGS == 'true' || env.BUILD_CORE == 'true' }}
9191
uses: mozilla-actions/sccache-action@fc920bf0ec8de6ee65d409111f7ec508035751ba # 0.0.11
9292
with:
93+
version: v0.18.0
9394
disable_annotations: 'true'
9495

95-
# xref: https://github.com/orgs/community/discussions/42856#discussioncomment-7678867
96-
- name: Adding additional GHA cache-related env vars
97-
if: ${{ env.BUILD_BINDINGS == 'true' || env.BUILD_CORE == 'true' }}
98-
uses: actions/github-script@v9
99-
with:
100-
script: |
101-
core.exportVariable('ACTIONS_CACHE_URL', process.env['ACTIONS_CACHE_URL'])
102-
core.exportVariable('ACTIONS_RUNTIME_URL', process.env['ACTIONS_RUNTIME_URL'])
103-
10496
- name: Setup proxy cache
10597
if: ${{ env.BUILD_BINDINGS == 'true' || env.BUILD_CORE == 'true' }}
10698
uses: nv-gha-runners/setup-proxy-cache@main

0 commit comments

Comments
 (0)