CI: add per-PR container-build pipeline - #1863
Conversation
|
👋 Hi Alexey-Rivkin! Thank you for contributing to ai-dynamo/nixl. Your PR reviewers will review your contribution then trigger the CI to test your changes. 🚀 |
036103b to
9285933
Compare
9285933 to
40866d3
Compare
40866d3 to
785e2f9
Compare
785e2f9 to
43152ae
Compare
43152ae to
267c205
Compare
267c205 to
69be039
Compare
69be039 to
9a5cf4e
Compare
9a5cf4e to
27a22a2
Compare
27a22a2 to
e6b2414
Compare
e6b2414 to
5c0b85d
Compare
5c0b85d to
73962ce
Compare
73962ce to
42f97b6
Compare
The container build (contrib/Dockerfile -> build-wheel.sh --build-nixl-ep, plus the nixlbench image) was only exercised by the nightly/manual nixl-ci-build-container job, never on PRs. That is how ai-dynamo#1775 - which made --torch-versions mandatory with --build-nixl-ep - broke every EP container build on main without any PR going red. Add a build-only leaf job (nixl-ci-build-container-pr) to the dispatcher fan-out. It runs the same build-container.sh (nixl, EP + debug) and nixlbench build the nightly job runs, but pushes nothing and touches no Artifactory - it only proves the images still build. To keep per-PR cost down it is x86_64-only and skips the heavy build when a PR touches no build-affecting files (contrib/, benchmark/, .ci/, meson*, pyproject/setup). The job still runs and reports green fast in that case, so it can be a required check without ever hanging a PR that only edits unrelated code.
42f97b6 to
fb29880
Compare
|
/build |
…-gate # Conflicts: # .ci/docs/ci-overview.md
|
/build |
|
🤖 CI Triage Agent — TL;DR: The Full analysisSummary: Docker build of the vLLM sanity image failed at the Root cause: During Implicated commit: No code commit implicated — infra/network failure. (The Dockerfile step originates from b594eb0 / 32f3104, but those are not the fault.) File: contrib/Dockerfile.vllm:22-25 Suggested fix:
Related: PR #1863 (this build); sanity-image pipeline introduced in #1777 and #1664. No matching existing issue found. |
|
🤖 CI Triage Agent — TL;DR: The "Run Python tests" stage died mid-pytest with Full analysisSummary: Jenkins stage 337 "Run Python tests" failed when the container command stream closed abnormally in the middle of Root cause: The Implicated commit: none — infrastructure flake. PR #1863 (525d1e8) is a CI-only change ("add per-PR container-build pipeline") and does not touch File: N/A (Jenkins/Slurm/enroot websocket stream in stage 337; no source file implicated) Suggested fix: Re-run the "Run Python tests" stage — a websocket 1006 mid-stream is a transient Slurm/enroot session drop. If it recurs across builds, investigate the scctl/srun keep-alive and enroot container stability on the GPU test node (check node dmesg/OOM and Slurm step logs for StepId 65353.1 around 13:11:15 UTC), and consider adding stream reconnection/retry to the Related: PR #1863 (#1863); PR #1800 (container export on failure, explains the trailing |
|
🤖 CI Triage Agent — TL;DR: The Full analysisSummary: Jenkins job Root cause: The UCCL nixlbench worker completed its measurement (printed Implicated commit: unknown for the exact regression; the crash lives in the UCCL backend (last significant changes: File: UCCL RDMA teardown path — Suggested fix: This is a known UCCL teardown crash — land/rebase onto PR #1724 ("UCCL crash Fix + GDB trap") which addresses the same segfault. In the meantime, since the crash is unrelated to this PR's changes, re-run the build (the failure is not caused by commit 525d1e8); if UCCL remains unstable in CI, gate the UCCL nixlbench case behind a flag or mark it non-fatal (e.g. don't run it under Related: #1724 (UCCL crash Fix + GDB trap) |
|
🤖 CI Triage Agent — TL;DR: The GPU CI on node Full analysisSummary: Two "Run CPP tests" stages failed: stage 242 (ucx-v1.22.x) had a genuine test failure in Root cause: The test node
Implicated commit: unknown — no evidence the PR #1863 commit 525d1e8 touched UCX context creation or these tests; the errors stem from the runner's missing IB devices. File: stage 203: Suggested fix: Treat as a CI infrastructure issue: repair/re-enable the IB devices on Related: #1909 ("Fail on unexpectedly skipped tests and fix device tests") is the closest related PR touching device-test skip behavior; no existing issue matches the |
|
🤖 CI Triage Agent — TL;DR: The "Run DL CPP tests" stage failed because 8 Full analysisSummary: Stage 313 ( Root cause: UCX's GDAKI (GPUDirect Async KI) transport on node Implicated commit: unknown — evidence points to node/driver state, not commit 525d1e8; git-history lookup returned HTTP 503 so no code change could be tied to this. File: Suggested fix: Treat this as a GPU/RDMA node health issue: drain and check Related: Issue/PR search returned HTTP 503 and could not be completed — none found. Note: Two IB device names appear in the log ( |
|
🤖 CI Triage Agent — TL;DR: The CPP test stages failed because test node Full analysisSummary: Two "Run CPP tests" stages failed — one gtest threw on UCX context creation (exit 42) and Root cause: The environment on node Implicated commit: unknown — no PR #1863 code change is implicated; the failure is environmental (missing IB devices + non-CUDA UCX on File: N/A (infrastructure); the genuine assertion originates in the UCX-context-creation path of the Suggested fix: Repair the test node: bring up/relabel the InfiniBand interfaces Related: #1909 ("Fail on unexpectedly skipped tests and fix device tests") is directly relevant to hardening these device-dependent gtests; #1323/#1294 introduced the warning-based fail-reliably harness that produces the exit-42 false positives. |
|
/build |
## What?
Rename the local `BUILD_TARGET` in `contrib/build-container.sh` to
`DOCKER_BUILD_TARGET`.
## Why?
The container job exports a `BUILD_TARGET` param (nixl/nixlbench), which
leaked into the `docker build` line via `${BUILD_TARGET:-}` as a stray
positional arg. Every nixl-target run has failed since #1870 with
`accepts at most 1 arg(s), received 2`.
## How?
Rename the local var so it no longer collides with the param. The
`--wheel-base-image` path still passes `--target wheel`.
### Note
This highlights the need for the per-PR container check
#1863
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Improved container builds when a wheel base image is configured.
* Prevented build parameters from being unintentionally passed to
Docker, resulting in more reliable build behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
|
🤖 CI Triage Agent — TL;DR: The Full analysisSummary: Jenkins stage "Run Nixlbench tests" (node 337) was ABORTED by a wall-clock kill ( Root cause: A UCCL backend transfer hung. Scanning log timestamps, the largest gap by far is between the last application line — Implicated commit: Not the PR under test. PR #1863 ("CI: add per-PR container-build pipeline", commit 3ca2e6d) only modifies CI plumbing and does not touch UCCL or nixlbench. The hang originates in the UCCL backend ( File: UCCL backend engine setup/teardown path in Suggested fix: Do not raise the stage time limit — this is a deadlock. Investigate the UCCL backend's connection/engine teardown for a missing wakeup or blocking wait (the asymmetric Related: PR #1863 (the CI change under test); PR #1724 "UCCL crash Fix + GDB trap" (#1724); UCCL backend PRs #1428, #1271, #1151, #895. |
- Adds a build-only container gate (`nixl-ci-build-container-pr`) to the PR CI. - Builds the `nixl` (debug, EP on) and `nixlbench` images - one parallel cell each, x86_64 only. - Pushes nothing - it just proves the images still build. - Skips fast when a PR touches no build files, so it can be a required check without slowing unrelated PRs. - Catch changes that break the container builds before they land. - `build-container-pr-matrix.yaml` - path-filter, then build per target, no push. - `proj-jjb.yaml` - new leaf job + dispatcher fan-out entry. - `ci-overview.md` - documents the new job. - Path filter scope: `contrib/`, `benchmark/`, `.ci/`, `meson.build`/`meson.options`, `pyproject.toml`, `setup.py`. - Green on a clean build (nixl EP+debug and nixlbench both built, nothing pushed). - Correctly red on the nvlink `-G` register-count failure - so it blocks the real breakage, not just passes. - After merge: JJB-update `nixl-ci-dispatcher` to turn the gate on for all PRs. - Optional: add `nixl-ci-build-container-pr` to the Required PR Checks ruleset to make it block merges (like `nixl-ci-gpu`/`non-gpu`). <!-- This is an auto-generated comment: release notes by coderabbit.ai --> * **New Features** * Expanded the Jenkins CI dispatcher’s PR fan-out to include a new build-only container verification leaf job (`nixl-ci-build-container-pr`), triggered only after a `/build` comment. * The job runs a gated matrix for targets (`nixl`, `nixlbench`) across architectures (`x86_64`, `aarch64`), skipping when PR changes don’t affect build paths and enforcing per-cell time limits (no image pushes). * **Documentation** * Updated CI overview and Jenkins job documentation: added the new leaf job, refreshed the flow diagram, and updated dispatcher job counts and descriptions. <!-- end of auto-generated comment: release notes by coderabbit.ai --> (cherry picked from commit f581707)
…mo#1956) ## What? Rename the local `BUILD_TARGET` in `contrib/build-container.sh` to `DOCKER_BUILD_TARGET`. ## Why? The container job exports a `BUILD_TARGET` param (nixl/nixlbench), which leaked into the `docker build` line via `${BUILD_TARGET:-}` as a stray positional arg. Every nixl-target run has failed since ai-dynamo#1870 with `accepts at most 1 arg(s), received 2`. ## How? Rename the local var so it no longer collides with the param. The `--wheel-base-image` path still passes `--target wheel`. ### Note This highlights the need for the per-PR container check ai-dynamo#1863 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved container builds when a wheel base image is configured. * Prevented build parameters from being unintentionally passed to Docker, resulting in more reliable build behavior. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
- Adds a build-only container gate (`nixl-ci-build-container-pr`) to the PR CI. - Builds the `nixl` (debug, EP on) and `nixlbench` images - one parallel cell each, x86_64 only. - Pushes nothing - it just proves the images still build. - Skips fast when a PR touches no build files, so it can be a required check without slowing unrelated PRs. - Catch changes that break the container builds before they land. - `build-container-pr-matrix.yaml` - path-filter, then build per target, no push. - `proj-jjb.yaml` - new leaf job + dispatcher fan-out entry. - `ci-overview.md` - documents the new job. - Path filter scope: `contrib/`, `benchmark/`, `.ci/`, `meson.build`/`meson.options`, `pyproject.toml`, `setup.py`. - Green on a clean build (nixl EP+debug and nixlbench both built, nothing pushed). - Correctly red on the nvlink `-G` register-count failure - so it blocks the real breakage, not just passes. - After merge: JJB-update `nixl-ci-dispatcher` to turn the gate on for all PRs. - Optional: add `nixl-ci-build-container-pr` to the Required PR Checks ruleset to make it block merges (like `nixl-ci-gpu`/`non-gpu`). <!-- This is an auto-generated comment: release notes by coderabbit.ai --> * **New Features** * Expanded the Jenkins CI dispatcher’s PR fan-out to include a new build-only container verification leaf job (`nixl-ci-build-container-pr`), triggered only after a `/build` comment. * The job runs a gated matrix for targets (`nixl`, `nixlbench`) across architectures (`x86_64`, `aarch64`), skipping when PR changes don’t affect build paths and enforcing per-cell time limits (no image pushes). * **Documentation** * Updated CI overview and Jenkins job documentation: added the new leaf job, refreshed the flow diagram, and updated dispatcher job counts and descriptions. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
…ing to release/1.4.0 (#1968) ## What Backports the wheel-build and CI infrastructure from `main` to `release/1.4.0` — six commits, cherry-picked in main's chronological order: 1. **#1870** — split `Dockerfile.manylinux` into `wheel_base`/`wheel` stages so CI caches the expensive deps image; adds `--wheel-base-image` to `build-container.sh` 2. **#1933** — auto-derive `CI_IMAGE_TAG` in `cidemo-init.sh` (matrix YAMLs carry a `CI_MANAGED` placeholder patched at CI time; no manual tag bumps) 3. **#1941** — `--build-infinia`: bundle the Infinia DDN plugin (`libplugin_INFINIA.so`) into the wheel (opt-in) 4. **#1918** — `--build-ucx-spcx-plugin`: build and bundle the UCX spcx external plugin (`libuct_ib_mlx5_ext.so`) into the wheel (opt-in) 5. **#1956** — rename `BUILD_TARGET` → `DOCKER_BUILD_TARGET` in `build-container.sh` (Jenkins exports a `BUILD_TARGET` job param that leaked into the docker command line) 6. **#1863** — add the per-PR container-build pipeline (`nixl-ci-build-container-pr`) and dispatcher fan-out After this PR, `Jenkinsfile.dispatcher`, `cidemo-init.sh`, `build-container.sh`, `Dockerfile.manylinux`, and `build-container-pr-matrix.yaml` are byte-identical to `main`. Conflict resolutions (all mechanical): - Matrix YAMLs: release-branch hardcoded `CI_IMAGE_TAG` values replaced by the `CI_MANAGED` placeholder (#1933) - `ci-overview.md`: kept release-accurate wording where main's text references features not backported (vLLM/SGLang sanity #1777, cleanup job #1785) Intentionally **not** backported (not needed for release CI): vLLM/SGLang sanity testing (#1777), Artifactory cleanup job (#1785, #1964), CI timeout right-sizing (#1932), LLM base image pins (#1893), port pool cap (#1685). ## Why Needed for the 1.4.0 release: internal wheels must bundle the UCX spcx and Infinia plugins, and the release-branch CI needs the same wheel-build pipeline as `main` to build them. Both plugin features are opt-in (off by default); default builds are byte-identical to the current release branch. --------- Signed-off-by: Nir Wolfson <nwolfer@nvidia.com> Signed-off-by: NirWolfer <nwolfer@nvidia.com> Co-authored-by: Alexey Rivkin <57558538+Alexey-Rivkin@users.noreply.github.com>
What?
nixl-ci-build-container-pr) to the PR CI.nixl(debug, EP on) andnixlbenchimages - one parallel cell each, x86_64 only.Why?
How?
build-container-pr-matrix.yaml- path-filter, then build per target, no push.proj-jjb.yaml- new leaf job + dispatcher fan-out entry.ci-overview.md- documents the new job.contrib/,benchmark/,.ci/,meson.build/meson.options,pyproject.toml,setup.py.Testing
-Gregister-count failure - so it blocks the real breakage, not just passes.Follow-ups (not in this PR)
nixl-ci-dispatcherto turn the gate on for all PRs.nixl-ci-build-container-prto the Required PR Checks ruleset to make it block merges (likenixl-ci-gpu/non-gpu).Summary by CodeRabbit
nixl-ci-build-container-pr), triggered only after a/buildcomment.nixl,nixlbench) across architectures (x86_64,aarch64), skipping when PR changes don’t affect build paths and enforcing per-cell time limits (no image pushes).