Run the Windows test payloads in a minimal sibling container - #11214
Run the Windows test payloads in a minimal sibling container#11214shwina wants to merge 1 commit into
Conversation
Windows counterpart to the Linux change this builds on: each Windows Python test lane splits into an entry point that provisions the wheel and a payload that runs in a sibling container holding nothing but Python, launched through the host's Docker daemon. Two things differ from Linux because Windows requires it. GPUs are exposed as a whole device class rather than individually, and only under process isolation. And the sibling image must match the host kernel: the Windows devcontainer images report os.version 10.0.20348, so the default is servercore:ltsc2022. Server Core also ships no MSVC runtime, which every C++ Python extension used here links against, so Install-MsvcRuntime fetches the redistributable. That is a Windows prerequisite rather than a packaging gap, and it leaves the comparison the lane exists to make intact: still no compiler, still no CUDA toolkit. The headers lane skips it, since cuda.cccl is pure Python. run_*.ps1 payloads deliberately do not import build_common.psm1: it resolves cl.exe at import time, which by design does not exist in the minimal image. Get-CudaVersion and Get-CudaMajor fall back to CCCL_CUDA_VERSION, since there is no nvcc in there either. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
📝 SummarySummary by CodeRabbit
WalkthroughChangesWindows CI now uses shared PowerShell helpers, minimal sibling containers, dedicated CUDA test runners, and thin entry-point scripts. The CI documentation describes the Windows container workflow and payload scripts. Windows CI execution
Suggested reviewers: Merge Risk: 🟡 Moderate · up to The GPU-free headers lane may fail before tests start on Windows workers without GPU device support. This should be resolved before merge. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 14877277-b5d2-4716-94a8-1f181d1cbec9
📒 Files selected for processing (12)
ci/windows/build_common.psm1ci/windows/build_common_python.psm1ci/windows/run_compute_minimal_tests.ps1ci/windows/run_compute_tests.ps1ci/windows/run_examples_tests.ps1ci/windows/run_headers_tests.ps1ci/windows/run_in_minimal_container.ps1ci/windows/test_cuda_cccl_examples_python.ps1ci/windows/test_cuda_cccl_headers_python.ps1ci/windows/test_cuda_compute_minimal_python.ps1ci/windows/test_cuda_compute_python.ps1docs/infrastructure/ci/references/ci_scripts.rst
Included review availability: Your plan provides up to 12 included reviews per hour; 10 remain after this review.
| $gpuArgs = @( | ||
| '--isolation=process', | ||
| '--device', 'class/5B45201D-F2F2-4F3B-85BB-30FF1F953599' | ||
| ) |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
important: CCCL_MINIMAL_CONTAINER_NO_GPU has a producer but no consumer. The headers lane sets the flag, and the container runner requests the GPU device class unconditionally, so the flag has no effect and the headers lane still fails on a runner without the device class.
ci/windows/run_in_minimal_container.ps1#L58-L61: build$gpuArgsas an empty array when$env:CCCL_MINIMAL_CONTAINER_NO_GPU -eq '1'.ci/windows/test_cuda_cccl_headers_python.ps1#L26-L26: keep the assignment only after the runner reads the flag; otherwise remove it and the comment on lines 24-25.
📍 Affects 2 files
ci/windows/run_in_minimal_container.ps1#L58-L61(this comment)ci/windows/test_cuda_cccl_headers_python.ps1#L26-L26
😬 CI Workflow Results🟥 Finished in 2h 59m: Pass: 99%/501 | Total: 14d 08h | Max: 2h 46m | Hits: 41%/1803328See results here. AI failure analysis1. Windows minimal CTK 12.0 segmented-sort example terminates pytest worker · 1 jobExplanation: The new Windows Server Core minimal-container path reaches pytest, but the process running the segmented-sort object example exits without a Python traceback while the other 69 examples pass. Other MSVC examples lanes, including CTK 12.0 sysctk, succeeded; the log provides no native exit code or stack, so pip-toolkit DLL discovery, prior state in the xdist worker, and the segmented-sort native path remain unconfirmed possibilities. Evidence: Copy this prompt into a coding agentJobs: 2. STF multi-GPU Numba finalize aborts in CUDA resource cleanup · 1 jobExplanation: `test_numba_places` aborts during `ctx.finalize()` when STF destroys task stream/event resources and a CUDA safe-call fails, consistent with a deferred error from the device-1 Numba work. The exact CUDA error is not logged and the PR does not modify STF, so a Numba/STF device-context mismatch is a strong hypothesis rather than a confirmed cause. Evidence: Copy this prompt into a coding agentJobs: |
Follow up to #11018. The changes in this PR are pretty much entirely vibe coded as I don't know any powershell.
Each Windows Python test lane splits into an entry point that provisions the wheel and a payload that runs in a sibling container holding nothing but Python, launched through the host's Docker daemon.
Two things differ from Linux because Windows requires it. GPUs are exposed as a whole device class rather than individually, and only under process isolation. And the sibling image must match the host kernel: the Windows devcontainer images report os.version 10.0.20348, so the default is
servercore:ltsc2022.Server Core also ships no MSVC runtime, which every C++ Python extension used here links against, so
Install-MsvcRuntimefetches the redistributable. That is a Windows prerequisite rather than a packaging gap, and it leaves the comparison the lane exists to make intact: still no compiler, still no CUDA toolkit. The headers lane skips it, sincecuda.ccclis pure Python.run_*.ps1payloads deliberately do not importbuild_common.psm1: it resolvescl.exeat import time, which by design does not exist in the minimal image.Get-CudaVersionandGet-CudaMajorfall back toCCCL_CUDA_VERSION, since there is nonvccin there either.Description
closes
Checklist