Skip to content

Commit 01d4602

Browse files
committed
Build CUDA 12 and CUDA 13 artifacts from main
Signed-off-by: Ralf W. Grosse-Kunstleve <rgrossekunst@nvidia.com>
1 parent b087aaf commit 01d4602

12 files changed

Lines changed: 1811 additions & 511 deletions

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

Lines changed: 345 additions & 152 deletions
Large diffs are not rendered by default.

‎.github/workflows/ci.yml‎

Lines changed: 138 additions & 117 deletions
Large diffs are not rendered by default.

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

Lines changed: 47 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ on:
88
host-platform:
99
required: true
1010
type: string
11-
cuda-version:
11+
bindings-package:
12+
description: Normalized CUDA bindings package JSON.
1213
required: true
1314
type: string
1415
workplan:
15-
description: JSON workplan. An empty value builds everything.
16-
required: false
17-
default: ""
16+
description: JSON workplan.
17+
required: true
1818
type: string
1919

2020
defaults:
@@ -27,13 +27,17 @@ permissions:
2727

2828
jobs:
2929
test-sdist:
30-
name: Test sdist builds
31-
if: ${{ inputs.workplan == '' || fromJSON(inputs.workplan).jobs.sdist_tests }}
30+
name: Sdist ${{ fromJSON(inputs.workplan).labels.sdist[fromJSON(inputs.bindings-package).package_root] }}
31+
if: ${{ fromJSON(inputs.workplan).jobs.sdist_package_roots[fromJSON(inputs.bindings-package).package_root] }}
3232
env:
33-
BUILD_PATHFINDER: ${{ inputs.workplan == '' || fromJSON(inputs.workplan).modules.pathfinder.needs_build }}
34-
BUILD_BINDINGS: ${{ inputs.workplan == '' || fromJSON(inputs.workplan).modules.bindings.needs_build }}
35-
BUILD_CORE: ${{ inputs.workplan == '' || fromJSON(inputs.workplan).modules.core.needs_build }}
36-
BUILD_PYTHON: ${{ inputs.workplan == '' || fromJSON(inputs.workplan).modules.python.needs_build }}
33+
BINDINGS_ROOT: ${{ fromJSON(inputs.bindings-package).package_root }}
34+
CUDA_BUILD_VERSION: ${{ fromJSON(inputs.bindings-package).toolkit_version }}
35+
CUDA_PYTHON_BUILD_MAJOR: ${{ fromJSON(inputs.bindings-package).cuda_major }}
36+
BUILD_PATHFINDER: ${{ fromJSON(inputs.workplan).modules.pathfinder.needs_build }}
37+
BUILD_BINDINGS: ${{ fromJSON(inputs.workplan).modules.bindings.package_roots[fromJSON(inputs.bindings-package).package_root].needs_build }}
38+
BUILD_CORE: ${{ fromJSON(inputs.workplan).modules.core.cuda_majors[fromJSON(inputs.bindings-package).cuda_variant].needs_build }}
39+
BUILD_CUDA_PYTHON: ${{ fromJSON(inputs.workplan).modules.python.package_roots[fromJSON(inputs.bindings-package).package_root].needs_build }}
40+
PATHFINDER_SOURCE: ${{ fromJSON(inputs.workplan).sources.pathfinder }}
3741
timeout-minutes: 60
3842
runs-on: linux-amd64-cpu8
3943
steps:
@@ -51,8 +55,14 @@ jobs:
5155
with:
5256
python-version: "3.12"
5357

54-
- name: Install build tools
55-
run: python -m pip install "pip>=25.3" build
58+
- name: Install build and CI tools
59+
run: python -m pip install "pip>=25.3" build -e ./ci
60+
61+
- name: Prepare local maintenance SCM milestone
62+
if: ${{ fromJSON(inputs.bindings-package).release_status == 'maintenance' }}
63+
run: |
64+
python -m ci.tools.bindings_scm_version \
65+
--package-root "${BINDINGS_ROOT}" --sha "${{ github.sha }}"
5666
5767
# Pure Python packages -- no CTK needed.
5868
- name: Build cuda.pathfinder sdist and wheel-from-sdist
@@ -62,13 +72,14 @@ jobs:
6272
pip wheel --no-deps --wheel-dir cuda_pathfinder/dist cuda_pathfinder/dist/*.tar.gz
6373
6474
- name: Build cuda-python sdist and wheel-from-sdist
65-
if: ${{ env.BUILD_PYTHON == 'true' }}
75+
if: ${{ env.BUILD_CUDA_PYTHON == 'true' }}
6676
run: |
6777
python -m build --sdist cuda_python/
6878
pip wheel --no-deps --wheel-dir cuda_python/dist cuda_python/dist/*.tar.gz
6979
7080
- name: Download cuda.pathfinder wheel
71-
if: ${{ env.BUILD_PATHFINDER != 'true' && (env.BUILD_BINDINGS == 'true' || env.BUILD_CORE == 'true') }}
81+
if: ${{ env.BUILD_PATHFINDER != 'true' && (env.BUILD_BINDINGS == 'true' || env.BUILD_CORE == 'true') &&
82+
env.PATHFINDER_SOURCE == 'artifact' }}
7283
uses: ./.github/actions/download-artifact-retry
7384
with:
7485
name: cuda-pathfinder-wheel
@@ -78,11 +89,21 @@ jobs:
7889
if: ${{ env.BUILD_BINDINGS == 'true' }}
7990
run: |
8091
pathfinder_wheels=(cuda_pathfinder/dist/cuda_pathfinder-*.whl)
81-
test "${#pathfinder_wheels[@]}" -eq 1
82-
test -f "${pathfinder_wheels[0]}"
8392
mkdir -p wheel-constraints
84-
pathfinder_uri="file://$(realpath "${pathfinder_wheels[0]}")"
85-
printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" | tee wheel-constraints/cuda-bindings.txt
93+
if [[ "${PATHFINDER_SOURCE}" == "artifact" ]]; then
94+
if [[ "${#pathfinder_wheels[@]}" -ne 1 || ! -f "${pathfinder_wheels[0]}" ]]; then
95+
echo "Expected exactly one cuda-pathfinder wheel in cuda_pathfinder/dist" >&2
96+
exit 1
97+
fi
98+
pathfinder_uri="file://$(realpath "${pathfinder_wheels[0]}")"
99+
printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" > wheel-constraints/cuda-bindings.txt
100+
elif [[ "${PATHFINDER_SOURCE}" == "published" ]]; then
101+
: > wheel-constraints/cuda-bindings.txt
102+
else
103+
echo "Error: PATHFINDER_SOURCE must be artifact or published, got ${PATHFINDER_SOURCE}" >&2
104+
exit 1
105+
fi
106+
cat wheel-constraints/cuda-bindings.txt
86107
87108
# Cython packages need CTK + sccache.
88109
# The env vars ACTIONS_CACHE_SERVICE_V2, ACTIONS_RESULTS_URL, and ACTIONS_RUNTIME_TOKEN
@@ -107,7 +128,7 @@ jobs:
107128
continue-on-error: false
108129
with:
109130
host-platform: ${{ inputs.host-platform }}
110-
cuda-version: ${{ inputs.cuda-version }}
131+
cuda-version: ${{ fromJSON(inputs.bindings-package).toolkit_version }}
111132

112133
# cuda_bindings_13/setup.py parses CUDA headers at import time, so CUDA_PATH
113134
# (set by fetch_ctk) must be available for both sdist and wheel builds.
@@ -119,22 +140,22 @@ jobs:
119140
export CXX="sccache c++"
120141
export PIP_BUILD_CONSTRAINT="$(pwd)/wheel-constraints/cuda-bindings.txt"
121142
export PIP_CONSTRAINT="${PIP_BUILD_CONSTRAINT}"
122-
python -m build --sdist cuda_bindings_13/
123-
pip wheel --no-deps --wheel-dir cuda_bindings_13/dist cuda_bindings_13/dist/*.tar.gz
143+
python -m build --sdist "${BINDINGS_ROOT}/"
144+
pip wheel --no-deps --wheel-dir "${BINDINGS_ROOT}/dist" "${BINDINGS_ROOT}"/dist/*.tar.gz
124145
125146
- name: Download cuda.bindings wheel
126147
if: ${{ env.BUILD_BINDINGS != 'true' && env.BUILD_CORE == 'true' }}
127148
uses: ./.github/actions/download-artifact-retry
128149
with:
129-
name: cuda-bindings-python312-cuda${{ inputs.cuda-version }}-${{ inputs.host-platform }}-${{ github.sha }}
130-
path: cuda_bindings_13/dist
150+
name: cuda-bindings-python312-cuda${{ fromJSON(inputs.bindings-package).toolkit_version }}-${{ inputs.host-platform }}-${{ github.sha }}
151+
path: ${{ env.BINDINGS_ROOT }}/dist
131152

132153
- name: Constrain cuda.core to the local cuda.bindings wheel
133154
if: ${{ env.BUILD_CORE == 'true' }}
134155
run: |
135-
CUDA_MAJOR="$(echo '${{ inputs.cuda-version }}' | cut -d. -f1)"
156+
CUDA_MAJOR='${{ fromJSON(inputs.bindings-package).cuda_major }}'
136157
pathfinder_wheels=(cuda_pathfinder/dist/cuda_pathfinder-*.whl)
137-
bindings_wheels=(cuda_bindings_13/dist/cuda_bindings-"${CUDA_MAJOR}".*.whl)
158+
bindings_wheels=("${BINDINGS_ROOT}"/dist/cuda_bindings-"${CUDA_MAJOR}".*.whl)
138159
test "${#pathfinder_wheels[@]}" -eq 1
139160
test "${#bindings_wheels[@]}" -eq 1
140161
test -f "${pathfinder_wheels[0]}"
@@ -154,7 +175,7 @@ jobs:
154175
if: ${{ env.BUILD_CORE == 'true' }}
155176
run: |
156177
export CUDA_PYTHON_PARALLEL_LEVEL=$(nproc)
157-
export CUDA_CORE_BUILD_MAJOR="$(echo '${{ inputs.cuda-version }}' | cut -d. -f1)"
178+
export CUDA_CORE_BUILD_MAJOR='${{ fromJSON(inputs.bindings-package).cuda_major }}'
158179
export CC="sccache cc"
159180
export CXX="sccache c++"
160181
export PIP_BUILD_CONSTRAINT="$(pwd)/wheel-constraints/cuda-core.txt"

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

Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ on:
1414
host-platform:
1515
required: true
1616
type: string
17-
cuda-version:
17+
bindings-package:
18+
description: Normalized CUDA bindings package JSON.
1819
required: true
1920
type: string
2021
workplan:
21-
description: JSON workplan. An empty value builds everything.
22-
required: false
23-
default: ""
22+
description: JSON workplan.
23+
required: true
2424
type: string
2525

2626
defaults:
@@ -33,13 +33,17 @@ permissions:
3333

3434
jobs:
3535
test-sdist:
36-
name: Test sdist builds
37-
if: ${{ inputs.workplan == '' || fromJSON(inputs.workplan).jobs.sdist_tests }}
36+
name: Sdist ${{ fromJSON(inputs.workplan).labels.sdist[fromJSON(inputs.bindings-package).package_root] }}
37+
if: ${{ fromJSON(inputs.workplan).jobs.sdist_package_roots[fromJSON(inputs.bindings-package).package_root] }}
3838
env:
39-
BUILD_PATHFINDER: ${{ inputs.workplan == '' || fromJSON(inputs.workplan).modules.pathfinder.needs_build }}
40-
BUILD_BINDINGS: ${{ inputs.workplan == '' || fromJSON(inputs.workplan).modules.bindings.needs_build }}
41-
BUILD_CORE: ${{ inputs.workplan == '' || fromJSON(inputs.workplan).modules.core.needs_build }}
42-
BUILD_PYTHON: ${{ inputs.workplan == '' || fromJSON(inputs.workplan).modules.python.needs_build }}
39+
BINDINGS_ROOT: ${{ fromJSON(inputs.bindings-package).package_root }}
40+
CUDA_BUILD_VERSION: ${{ fromJSON(inputs.bindings-package).toolkit_version }}
41+
CUDA_PYTHON_BUILD_MAJOR: ${{ fromJSON(inputs.bindings-package).cuda_major }}
42+
BUILD_PATHFINDER: ${{ fromJSON(inputs.workplan).modules.pathfinder.needs_build }}
43+
BUILD_BINDINGS: ${{ fromJSON(inputs.workplan).modules.bindings.package_roots[fromJSON(inputs.bindings-package).package_root].needs_build }}
44+
BUILD_CORE: ${{ fromJSON(inputs.workplan).modules.core.cuda_majors[fromJSON(inputs.bindings-package).cuda_variant].needs_build }}
45+
BUILD_CUDA_PYTHON: ${{ fromJSON(inputs.workplan).modules.python.package_roots[fromJSON(inputs.bindings-package).package_root].needs_build }}
46+
PATHFINDER_SOURCE: ${{ fromJSON(inputs.workplan).sources.pathfinder }}
4347
timeout-minutes: 60
4448
runs-on: windows-2022
4549
steps:
@@ -64,8 +68,15 @@ jobs:
6468
if: ${{ env.BUILD_BINDINGS == 'true' || env.BUILD_CORE == 'true' }}
6569
uses: step-security/msvc-dev-cmd@22c98154b708dbd743e6f27a933cf6ceba3305c4 # v1.13.1
6670

67-
- name: Install build tools
68-
run: python -m pip install "pip>=25.3" build
71+
- name: Install build and CI tools
72+
run: python -m pip install "pip>=25.3" build -e ./ci
73+
74+
- name: Prepare local maintenance SCM milestone
75+
if: ${{ fromJSON(inputs.bindings-package).release_status == 'maintenance' }}
76+
shell: bash --noprofile --norc -xeuo pipefail {0}
77+
run: |
78+
python -m ci.tools.bindings_scm_version \
79+
--package-root "${BINDINGS_ROOT}" --sha "${{ github.sha }}"
6980
7081
# Pure Python packages -- no CTK needed.
7182
- name: Build cuda.pathfinder sdist and wheel-from-sdist
@@ -75,13 +86,14 @@ jobs:
7586
pip wheel --no-deps --wheel-dir cuda_pathfinder/dist cuda_pathfinder/dist/*.tar.gz
7687
7788
- name: Build cuda-python sdist and wheel-from-sdist
78-
if: ${{ env.BUILD_PYTHON == 'true' }}
89+
if: ${{ env.BUILD_CUDA_PYTHON == 'true' }}
7990
run: |
8091
python -m build --sdist cuda_python/
8192
pip wheel --no-deps --wheel-dir cuda_python/dist cuda_python/dist/*.tar.gz
8293
8394
- name: Download cuda.pathfinder wheel
84-
if: ${{ env.BUILD_PATHFINDER != 'true' && (env.BUILD_BINDINGS == 'true' || env.BUILD_CORE == 'true') }}
95+
if: ${{ env.BUILD_PATHFINDER != 'true' && (env.BUILD_BINDINGS == 'true' || env.BUILD_CORE == 'true') &&
96+
env.PATHFINDER_SOURCE == 'artifact' }}
8597
uses: ./.github/actions/download-artifact-retry
8698
with:
8799
name: cuda-pathfinder-wheel
@@ -91,11 +103,21 @@ jobs:
91103
if: ${{ env.BUILD_BINDINGS == 'true' }}
92104
run: |
93105
pathfinder_wheels=(cuda_pathfinder/dist/cuda_pathfinder-*.whl)
94-
test "${#pathfinder_wheels[@]}" -eq 1
95-
test -f "${pathfinder_wheels[0]}"
96106
mkdir -p wheel-constraints
97-
pathfinder_uri="file:///$(cygpath -am "${pathfinder_wheels[0]}")"
98-
printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" | tee wheel-constraints/cuda-bindings.txt
107+
if [[ "${PATHFINDER_SOURCE}" == "artifact" ]]; then
108+
if [[ "${#pathfinder_wheels[@]}" -ne 1 || ! -f "${pathfinder_wheels[0]}" ]]; then
109+
echo "Expected exactly one cuda-pathfinder wheel in cuda_pathfinder/dist" >&2
110+
exit 1
111+
fi
112+
pathfinder_uri="file:///$(cygpath -am "${pathfinder_wheels[0]}")"
113+
printf 'cuda-pathfinder @ %s\n' "${pathfinder_uri}" > wheel-constraints/cuda-bindings.txt
114+
elif [[ "${PATHFINDER_SOURCE}" == "published" ]]; then
115+
: > wheel-constraints/cuda-bindings.txt
116+
else
117+
echo "Error: PATHFINDER_SOURCE must be artifact or published, got ${PATHFINDER_SOURCE}" >&2
118+
exit 1
119+
fi
120+
cat wheel-constraints/cuda-bindings.txt
99121
100122
# Cython packages need CTK. No sccache on Windows (this is a correctness
101123
# smoke test, not a production build; see build-wheel.yml which also
@@ -106,7 +128,7 @@ jobs:
106128
continue-on-error: false
107129
with:
108130
host-platform: ${{ inputs.host-platform }}
109-
cuda-version: ${{ inputs.cuda-version }}
131+
cuda-version: ${{ fromJSON(inputs.bindings-package).toolkit_version }}
110132

111133
# cuda_bindings_13/setup.py parses CUDA headers at import time, so CUDA_PATH
112134
# (set by fetch_ctk) must be available for both sdist and wheel builds.
@@ -118,22 +140,22 @@ jobs:
118140
export CUDA_PYTHON_PARALLEL_LEVEL=$(nproc)
119141
export PIP_BUILD_CONSTRAINT="$(cygpath -w "$(pwd)/wheel-constraints/cuda-bindings.txt")"
120142
export PIP_CONSTRAINT="${PIP_BUILD_CONSTRAINT}"
121-
python -m build --sdist cuda_bindings_13/
122-
pip wheel --no-deps --wheel-dir cuda_bindings_13/dist cuda_bindings_13/dist/*.tar.gz
143+
python -m build --sdist "${BINDINGS_ROOT}/"
144+
pip wheel --no-deps --wheel-dir "${BINDINGS_ROOT}/dist" "${BINDINGS_ROOT}"/dist/*.tar.gz
123145
124146
- name: Download cuda.bindings wheel
125147
if: ${{ env.BUILD_BINDINGS != 'true' && env.BUILD_CORE == 'true' }}
126148
uses: ./.github/actions/download-artifact-retry
127149
with:
128-
name: cuda-bindings-python312-cuda${{ inputs.cuda-version }}-${{ inputs.host-platform }}-${{ github.sha }}
129-
path: cuda_bindings_13/dist
150+
name: cuda-bindings-python312-cuda${{ fromJSON(inputs.bindings-package).toolkit_version }}-${{ inputs.host-platform }}-${{ github.sha }}
151+
path: ${{ env.BINDINGS_ROOT }}/dist
130152

131153
- name: Constrain cuda.core to the local cuda.bindings wheel
132154
if: ${{ env.BUILD_CORE == 'true' }}
133155
run: |
134-
CUDA_MAJOR="$(echo '${{ inputs.cuda-version }}' | cut -d. -f1)"
156+
CUDA_MAJOR='${{ fromJSON(inputs.bindings-package).cuda_major }}'
135157
pathfinder_wheels=(cuda_pathfinder/dist/cuda_pathfinder-*.whl)
136-
bindings_wheels=(cuda_bindings_13/dist/cuda_bindings-"${CUDA_MAJOR}".*.whl)
158+
bindings_wheels=("${BINDINGS_ROOT}"/dist/cuda_bindings-"${CUDA_MAJOR}".*.whl)
137159
test "${#pathfinder_wheels[@]}" -eq 1
138160
test "${#bindings_wheels[@]}" -eq 1
139161
test -f "${pathfinder_wheels[0]}"
@@ -153,7 +175,7 @@ jobs:
153175
if: ${{ env.BUILD_CORE == 'true' }}
154176
run: |
155177
export CUDA_PYTHON_PARALLEL_LEVEL=$(nproc)
156-
export CUDA_CORE_BUILD_MAJOR="$(echo '${{ inputs.cuda-version }}' | cut -d. -f1)"
178+
export CUDA_CORE_BUILD_MAJOR='${{ fromJSON(inputs.bindings-package).cuda_major }}'
157179
export PIP_BUILD_CONSTRAINT="$(cygpath -w "$(pwd)/wheel-constraints/cuda-core.txt")"
158180
export PIP_CONSTRAINT="${PIP_BUILD_CONSTRAINT}"
159181
python -m build --sdist cuda_core/

‎ci/ci-pipeline.mmd‎

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,18 @@ config:
2525
flowchart TB
2626
subgraph TRIGGER["TRIGGER EVENTS"]
2727
direction LR
28-
T1["Push to main branch"] ~~~ T2["Pull request"] ~~~ T3["Manual workflow dispatch"]
28+
T1["Main or approved pull request"] ~~~ T2["Immutable package tag"] ~~~ T3["Manual workflow dispatch"]
2929
end
3030

31+
PLAN["Select affected packages and dependencies<br/>A package tag selects its release line<br/>Registry: ci/versions.yml"]
32+
3133
subgraph BUILD["BUILD STAGE"]
3234
direction TB
3335
subgraph BUILD_PLATFORMS["Parallel Platform Builds"]
3436
direction LR
35-
B1["linux-64<br/>(Self-hosted)"] ~~~ B2["linux-aarch64<br/>(Self-hosted)"] ~~~ B3["win-64<br/>(GitHub-hosted)"]
37+
B1["Linux x86_64<br/>(Self-hosted)"] ~~~ B2["Linux ARM64<br/>(Self-hosted)"] ~~~ B3["Windows x86_64 / ARM64<br/>(GitHub-hosted)"]
3638
end
37-
BUILD_DETAILS["Python versions: 3.11, 3.12, 3.13, 3.14, 3.15<br/>CUDA version: 13.0.0 (build-time)<br/>Components: cuda-core, cuda-bindings,<br/>cuda-pathfinder, cuda-python"]
39+
BUILD_DETAILS["Python and platform matrices: ci.yml<br/>Bindings toolkits and roots: registry<br/>Build selected bindings, Core,<br/>Pathfinder and metapackage artifacts"]
3840
end
3941

4042
subgraph ARTIFACTS["ARTIFACT STORAGE"]
@@ -51,22 +53,22 @@ flowchart TB
5153
direction TB
5254
subgraph TEST_PLATFORMS["Parallel Platform Tests"]
5355
direction LR
54-
TS1["linux-64<br/>(Self-hosted)"] ~~~ TS2["linux-aarch64<br/>(Self-hosted)"] ~~~ TS3["win-64<br/>(GitHub-hosted)"]
56+
TS1["linux-64<br/>(Self-hosted)"] ~~~ TS2["linux-aarch64<br/>(Self-hosted)"] ~~~ TS3["win-64<br/>(Self-hosted GPU)"]
5557
end
56-
TEST_DETAILS["Download wheels from artifacts<br/>Test against multiple CUDA runtime versions<br/>Run Python unit tests, Cython tests, and examples"]
57-
ARTIFACT_FLOWS["Artifact Flows:<br/>cuda-pathfinder: main to backport<br/>cuda-bindings: backport to main"]
58+
TEST_DETAILS["Test sources match wheel build revision<br/>Test against multiple CUDA runtime versions<br/>Run Python unit tests, Cython tests, and examples"]
59+
ARTIFACT_FLOWS["Both bindings roots build from this source tree<br/>Reuse validated baseline for unaffected packages<br/>Bindings tag: selected line and published Pathfinder<br/>Core older-toolkit tests: published bindings floor"]
5860
end
5961

6062
subgraph RELEASE["RELEASE PIPELINE"]
6163
direction TB
6264
subgraph RELEASE_STAGES["Sequential Release Steps"]
6365
direction LR
64-
R1["Validation<br/>Artifact integrity<br/>Git tag verification"] --> R2["Publishing<br/>PyPI/TestPyPI<br/>Component or all releases"] --> R3["Documentation<br/>GitHub Pages<br/>Release notes"]
66+
R1["Validation<br/>Artifact integrity<br/>Git tag verification"] --> R2["Publishing<br/>PyPI/TestPyPI<br/>Selected component"] --> R3["Documentation<br/>GitHub Pages<br/>Release notes"]
6567
end
66-
RELEASE_DETAILS["Manual workflow dispatch with run ID<br/>Supports individual component or full releases"]
68+
RELEASE_DETAILS["Manual dry run for exact tag and successful CI run<br/>Explicit publication for selected component<br/>Bindings release does not require a Core release"]
6769
end
6870

69-
TRIGGER --> BUILD
71+
TRIGGER --> PLAN --> BUILD
7072
BUILD -. "wheel upload" .-> ARTIFACTS
7173
ARTIFACTS --> TEST
7274
TEST --> RELEASE
@@ -90,7 +92,7 @@ flowchart TB
9092
class TRIGGER triggerStyle
9193
class T1,T2,T3 triggerNodeStyle
9294
class BUILD,BUILD_PLATFORMS buildStyle
93-
class B1,B2,B3,BUILD_DETAILS buildNodeStyle
95+
class PLAN,B1,B2,B3,BUILD_DETAILS buildNodeStyle
9496
class ARTIFACTS,GITHUB_ARTIFACTS,GITHUB_CACHE artifactStyle
9597
class GA1,GC1 artifactNodeStyle
9698
class TEST,TEST_PLATFORMS testStyle

0 commit comments

Comments
 (0)