Skip to content

build/ci: backport wheel-build CI and UCX spcx + Infinia plugin bundling to release/1.4.0 - #1968

Merged
nv-nmailhot merged 6 commits into
ai-dynamo:release/1.4.0from
NirWolfer:nwolfer/release-1.4.0-ucx-spcx-infinia
Jul 22, 2026
Merged

nv-nmailhot merged 6 commits into
ai-dynamo:release/1.4.0from
NirWolfer:nwolfer/release-1.4.0-ucx-spcx-infinia

Conversation

@NirWolfer

@NirWolfer NirWolfer commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

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. ci: split Dockerfile.manylinux into wheel_base/wheel stages to cache deps #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. ci: auto-derive CI_IMAGE_TAG in cidemo-init.sh #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. build: add --build-infinia to bundle the Infinia DDN plugin into the whl #1941--build-infinia: bundle the Infinia DDN plugin (libplugin_INFINIA.so) into the wheel (opt-in)
  4. Build wheels with the UCX spcx external plugin bundled #1918--build-ucx-spcx-plugin: build and bundle the UCX spcx external plugin (libuct_ib_mlx5_ext.so) into the wheel (opt-in)
  5. ci: rename BUILD_TARGET local var to stop Jenkins param leak #1956 — rename BUILD_TARGETDOCKER_BUILD_TARGET in build-container.sh (Jenkins exports a BUILD_TARGET job param that leaked into the docker command line)
  6. CI: add per-PR container-build pipeline #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):

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.

@NirWolfer
NirWolfer requested review from a team as code owners July 20, 2026 13:25
@github-actions

Copy link
Copy Markdown

👋 Hi NirWolfer! Thank you for contributing to ai-dynamo/nixl.

Your PR reviewers will review your contribution then trigger the CI to test your changes.

🚀

@NirWolfer
NirWolfer requested a review from nv-nmailhot July 20, 2026 13:26
@NirWolfer
NirWolfer force-pushed the nwolfer/release-1.4.0-ucx-spcx-infinia branch from f8564c3 to 26de09f Compare July 20, 2026 14:53
@NirWolfer

Copy link
Copy Markdown
Contributor Author

/build

@ai-dynamo ai-dynamo deleted a comment from svc-nixl Jul 21, 2026
@ai-dynamo ai-dynamo deleted a comment from svc-nixl Jul 21, 2026
@ai-dynamo ai-dynamo deleted a comment from svc-nixl Jul 21, 2026
@ai-dynamo ai-dynamo deleted a comment from svc-nixl Jul 21, 2026
@ai-dynamo ai-dynamo deleted a comment from svc-nixl Jul 21, 2026
@ai-dynamo ai-dynamo deleted a comment from svc-nixl Jul 21, 2026
@ai-dynamo ai-dynamo deleted a comment from svc-nixl Jul 21, 2026
dpressle
dpressle previously approved these changes Jul 21, 2026
NPROC: 32
GRPC_NPROC: 10
BASE_IMAGE: "${registry_host}/sw-nbu-swx-nixl-docker-local/base/cuda"
BASE_TAG: '13.0-devel-manylinux--25.09'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see the ubi8 used as base image as discussed

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not part of the changes i made to allow building infinia + ucx plugin, im pretty sure its part of nates work at #1923

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i will fast follow with the ubi8 changes here

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-non-gpu · commit 5eedbe81

TL;DR: The "Checkout source code" stage failed because PR #1968 modified contrib/Dockerfile.manylinux (a CI-tracked file) but only bumped CI_IMAGE_TAG in build-wheel-matrix.yaml, leaving the other five matrix files unchanged; bump CI_IMAGE_TAG in all six matrix YAMLs.

Full analysis

Summary: Jenkins cidemo-init guard hook aborted checkout: a CI file was changed without increasing CI_IMAGE_TAG in all required matrix files.

Root cause: The commit touched contrib/Dockerfile.manylinux, which the CI init hook tracks as a CI file. The guard verifies that every matrix YAML's CI_IMAGE_TAG was increased. Per the log, five of six matrices stayed at 20260707-1 -> 20260707-1 (no change) and only build-wheel-matrix.yaml was updated (-> 20260709-1), so the hook exited non-zero with "You have changed CI files but forgot to increase CI_IMAGE_TAG!", aborting the "Checkout source code" stage. This is a policy gate, not a compile/test failure.

Implicated commit: [REDACTED:Hex High Entropy String] (merge of [REDACTED:Hex High Entropy String]; PR #1968). Recent Dockerfile.manylinux changes by NirWolfer (e.g. b212c12).

File: contrib/Dockerfile.manylinux (changed file); tag not bumped in .ci/jenkins/lib/build-matrix.yaml:46, test-matrix.yaml:53, test-dl-matrix.yaml:52, test-dl-ep-matrix.yaml, test-sanitizer-matrix.yaml.

Suggested fix: Increase CI_IMAGE_TAG to a new value (e.g. 20260709-1) consistently in all six matrix YAML files listed by the hook — currently only build-wheel-matrix.yaml was bumped. Update the remaining five (build, test, test-dl, test-dl-ep, test-sanitizer) to match, then push. (Separately, the repo's cidemo-init.sh auto-patches a CI_MANAGED placeholder and differs from the enforcing hook on the Jenkins agent — worth reconciling so local and CI logic agree.)

Related: PR #1968; prior Dockerfile.manylinux PRs #1918, #1941, #1870.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 3350ae98-984e-4a20-8771-e978b05b669e in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit 5eedbe81

TL;DR: The "Checkout source code" stage failed because PR #1968 modified contrib/Dockerfile.manylinux (a CI-tracked file) but only bumped CI_IMAGE_TAG in build-wheel-matrix.yaml; fix by bumping CI_IMAGE_TAG in the other five matrix YAMLs.

Full analysis

Summary: The .ci/cidemo-init.sh init hook ran during checkout, detected a changed CI file, and aborted the build because CI_IMAGE_TAG was not increased in all required matrix files.

Root cause: PR #1968 changed contrib/Dockerfile.manylinux, which is enumerated as a CI-tracked file. The init hook enforces that any CI-file change must be accompanied by a CI_IMAGE_TAG bump in every matrix YAML. Only build-wheel-matrix.yaml was updated (-> 20260709-1); the other five (build-matrix.yaml, test-matrix.yaml, test-dl-matrix.yaml, test-dl-ep-matrix.yaml, test-sanitizer-matrix.yaml) remained at 20260707-1. The hook exited non-zero → hudson.AbortException: Fail to run cidemo init hook. This is a validation gate, not an infra/timeout failure.

Implicated commit: PR #1968 merge commit [REDACTED:Hex High Entropy String] (merge of [REDACTED:Hex High Entropy String]). The CI-tag gate itself was introduced by [REDACTED:Hex High Entropy String] (NirWolfer, "ci: auto-derive CI_IMAGE_TAG in cidemo-init.sh", #1933).

File: contrib/Dockerfile.manylinux (changed) vs. the tag definitions in .ci/jenkins/lib/build-matrix.yaml:46, test-matrix.yaml:53, test-dl-matrix.yaml:52, test-dl-ep-matrix.yaml, test-sanitizer-matrix.yaml (not bumped).

Suggested fix: In PR #1968, bump CI_IMAGE_TAG from 20260707-1 to a new value (e.g. 20260709-1, matching the value already set in build-wheel-matrix.yaml) in the remaining five matrix files:

  • .ci/jenkins/lib/build-matrix.yaml (line 46)
  • .ci/jenkins/lib/test-matrix.yaml (line 53)
  • .ci/jenkins/lib/test-dl-matrix.yaml (line 52)
  • .ci/jenkins/lib/test-dl-ep-matrix.yaml
  • .ci/jenkins/lib/test-sanitizer-matrix.yaml

Keep all six tags consistent, then re-run the build.

Related: PR #1968 (this build); tag-gate mechanism from PR #1933; the file's recent history includes PRs #1918, #1941, #1870.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id c46c8b0d-a982-4576-8b02-114498214014 in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-build-wheel · commit 5eedbe81

TL;DR: The "Checkout source code" stage failed because PR #1968 modified contrib/Dockerfile.manylinux (a CI-tracked file) but only bumped CI_IMAGE_TAG in build-wheel-matrix.yaml — the CI guard hook requires the tag to be increased in all six matrix YAMLs. Bump CI_IMAGE_TAG consistently in the remaining matrix files (or, per the current placeholder-based hook, restore the "CI_MANAGED" placeholder).

Full analysis

Summary: cidemo-init.sh CI guard aborted the checkout: CI files changed but CI_IMAGE_TAG was not increased across all matrix YAMLs.

Root cause: The build detected a change in contrib/Dockerfile.manylinux (one of the tracked CI_FILES). The guard verifies CI_IMAGE_TAG was bumped in every matrix file, but only build-wheel-matrix.yaml was updated ( -> 20260709-1); the other five matrices remained unchanged at 20260707-1 -> 20260707-1. The hook therefore exited with ❌ ERROR: You have changed CI files but forgot to increase CI_IMAGE_TAG!, causing hudson.AbortException: Fail to run cidemo init hook. (Note: the failing build's hook still uses a manual per-matrix tag comparison; the repo's current .ci/cidemo-init.sh auto-patches a "CI_MANAGED" placeholder — the branch under test predates or diverges from that change.)

Implicated commit: PR #1968 (merge [REDACTED:Hex High Entropy String], merging [REDACTED:Hex High Entropy String] into 4a04143) — the change to contrib/Dockerfile.manylinux without a full tag bump.

File: contrib/Dockerfile.manylinux (changed) + .ci/jenkins/lib/build-matrix.yaml:46, test-matrix.yaml:53, test-dl-matrix.yaml:52, test-dl-ep-matrix.yaml, test-sanitizer-matrix.yaml (missing tag bump).

Suggested fix: Increase CI_IMAGE_TAG to the same new value (e.g. 20260709-1) in all six matrix files listed by the error, not just build-wheel-matrix.yaml. If this branch is intended to use the newer placeholder-based hook, instead set CI_IMAGE_TAG: "CI_MANAGED" in every matrix YAML and let cidemo-init.sh derive/patch the tag automatically — but do not mix the two schemes.

Related: PR #1968 (this build); prior manylinux change PR #1870 (split Dockerfile.manylinux, NirWolfer).

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 9f577d08-74dc-4950-9d83-6f1364f0d101 in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-test-sanitizers · commit 5eedbe81

TL;DR: The Checkout source code stage failed because the CI guard in .ci/cidemo-init.sh detected that contrib/Dockerfile.manylinux was modified in PR #1968 but the CI_IMAGE_TAG was only bumped in build-wheel-matrix.yaml (→ 20260709-1) and not in the other five matrix files (still 20260707-1). Fix: bump CI_IMAGE_TAG to the same new value in all six matrix YAMLs.

Full analysis

Summary: The cidemo-init.sh CI-consistency guard aborted checkout: a CI source file changed but CI_IMAGE_TAG wasn't bumped across all matrix files.

Root cause: The commit modifies contrib/Dockerfile.manylinux (one of the tracked CI_FILES). The init hook requires CI_IMAGE_TAG to be increased in every matrix YAML when a CI file changes. The log shows only build-wheel-matrix.yaml was updated (→ 20260709-1), while the other five stayed at 20260707-1:

  • Build Matrix: 20260707-1 -> 20260707-1 (unchanged)
  • Test Matrix: 20260707-1 -> 20260707-1 (unchanged)
  • Test DL Matrix: 20260707-1 -> 20260707-1 (unchanged)
  • Test DL EP Matrix: 20260707-1 -> 20260707-1 (unchanged)
  • Sanitizer Matrix: 20260707-1 -> 20260707-1 (unchanged)
  • Wheel Build Matrix: -> 20260709-1 ✓ (updated)

Since the tags are inconsistent, the guard raised ❌ ERROR: You have changed CI files but forgot to increase CI_IMAGE_TAG! and aborted (Fail to run cidemo init hook). This is a configuration/consistency error in the PR, not a code, hang, or infrastructure failure. (Note: the deployed hook enforces manual per-matrix tag bumps; the version of .ci/cidemo-init.sh in the repo uses CI_MANAGED placeholder auto-patching — but the log is authoritative for what actually ran.)

Implicated commit: PR #1968 (merge commit [REDACTED:Hex High Entropy String]) — the change to contrib/Dockerfile.manylinux without a full CI_IMAGE_TAG bump.

File: contrib/Dockerfile.manylinux (changed CI file); tags missing in .ci/jenkins/lib/build-matrix.yaml:46, .ci/jenkins/lib/test-matrix.yaml:53, .ci/jenkins/lib/test-dl-matrix.yaml:52, .ci/jenkins/lib/test-dl-ep-matrix.yaml, .ci/jenkins/lib/test-sanitizer-matrix.yaml.

Suggested fix: In PR #1968, update CI_IMAGE_TAG to the same new value (e.g. 20260709-1, matching what was already set in build-wheel-matrix.yaml) in the remaining five matrix files: build-matrix.yaml, test-matrix.yaml, test-dl-matrix.yaml, test-dl-ep-matrix.yaml, and test-sanitizer-matrix.yaml. All six matrix files must carry the identical bumped tag whenever a tracked CI file changes. Then re-run the build.

Related: Recent Dockerfile.manylinux changes: #1918, #1941, #1870 (NirWolfer) — this PR should follow the same tag-bump discipline used there.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id a7843c58-aeda-4648-88f9-324af8ced39e in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu · commit 5eedbe81

TL;DR: The Checkout source code stage failed because the PR edited a tracked CI file (contrib/Dockerfile.manylinux) but only bumped CI_IMAGE_TAG in one of the six required matrix YAMLs; bump the tag in the other five (or rebase onto the auto-derive change) to fix it.

Full analysis

Summary: Jenkins nixl-ci-dl-gpu #1599 aborted in the "Checkout source code" stage — the .ci/cidemo-init.sh guard rejected the checkout: "You have changed CI files but forgot to increase CI_IMAGE_TAG!"

Root cause: PR #1968 (commit 5eedbe8, merge of 26de09f into 4a04143) modified contrib/Dockerfile.manylinux, which is one of the CI-tracked source files. The version of cidemo-init.sh on this branch enforces that when any tracked CI file changes, CI_IMAGE_TAG must be bumped in all six matrix YAMLs. Only build-wheel-matrix.yaml was bumped (→ 20260709-1); the other five (build-matrix.yaml, test-matrix.yaml, test-dl-matrix.yaml, test-dl-ep-matrix.yaml, test-sanitizer-matrix.yaml) stayed at 20260707-1, so the guard aborted. This is a CI policy gate, not a test/runtime failure.

Implicated commit: [REDACTED:Hex High Entropy String] (PR #1968; the tracked-file edit is in the merged commit [REDACTED:Hex High Entropy String]).

File: contrib/Dockerfile.manylinux (the changed CI file); enforced by .ci/cidemo-init.sh; tag placeholders in .ci/jenkins/lib/build-matrix.yaml:46, test-matrix.yaml:53, test-dl-matrix.yaml:52, test-dl-ep-matrix.yaml, test-sanitizer-matrix.yaml.

Suggested fix: In PR #1968, bump CI_IMAGE_TAG from 20260707-1 to a new value (e.g. 20260709-1, matching what you already set in build-wheel-matrix.yaml) in the other five matrix YAMLs so all six are consistent, then re-run. Alternatively — and more robustly — rebase/merge in commit [REDACTED:Hex High Entropy String] ("ci: auto-derive CI_IMAGE_TAG in cidemo-init.sh", #1933), which replaces this manual-bump gate with an auto-derived CI_MANAGED placeholder and eliminates this entire class of failure.

Related: PR #1933 ([REDACTED:Hex High Entropy String], auto-derive CI_IMAGE_TAG); PR #1870 (619f09e71cc6, split of Dockerfile.manylinux).

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 75b20008-16c1-4e1b-bd1b-fc77be502637 in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu-ep · commit 5eedbe81

TL;DR: The Jenkins build failed in the "Checkout source code" stage because .ci/cidemo-init.sh detected that a CI file (contrib/Dockerfile.manylinux) was changed in PR #1968 without bumping CI_IMAGE_TAG in the required matrix YAMLs. Fix: bump CI_IMAGE_TAG in the five matrix files that weren't updated.

Full analysis

Summary: The cidemo-init.sh CI-gate hook aborted checkout: CI files were modified but CI_IMAGE_TAG was not increased across the required matrices.

Root cause: PR #1968 modified the tracked CI file contrib/Dockerfile.manylinux, which requires CI_IMAGE_TAG to be incremented so the base Docker images rebuild. The log shows only build-wheel-matrix.yaml was bumped (-> 20260709-1), while the build / test / test-dl / test-dl-ep / sanitizer matrices remained at 20260707-1 -> 20260707-1. The hook enforces this and exits non-zero, causing hudson.AbortException: Fail to run cidemo init hook. This is a policy gate failure, not a build or test failure.

Implicated commit: [REDACTED:Hex High Entropy String] (merge commit for PR #1968) — the change to contrib/Dockerfile.manylinux without a matching tag bump.

File: .ci/cidemo-init.sh (CI_FILES list, line 13 contrib/Dockerfile.manylinux); tags not bumped in .ci/jenkins/lib/build-matrix.yaml:46, test-matrix.yaml:53, test-dl-matrix.yaml:52, test-dl-ep-matrix.yaml, test-sanitizer-matrix.yaml.

Suggested fix: In PR #1968, increment CI_IMAGE_TAG consistently in the five matrix YAMLs called out by the error (build, test, test-dl, test-dl-ep, sanitizer) to match the new value used in build-wheel-matrix.yaml (e.g. 20260709-1), so the changed Dockerfile.manylinux triggers a base-image rebuild. Note: test-dl-ep-matrix.yaml uses the "CI_MANAGED" placeholder that is auto-patched by the hook — verify whether the gate should treat placeholder-based matrices as already-managed, since mixing hand-edited tags and the placeholder is what makes this check confusing; if all matrices are meant to use CI_MANAGED, migrate the hand-edited ones too.

Related: PR #1968 (the triggering PR). none other found.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id da538059-80a4-492c-b32b-67b140f715d7 in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu · commit 5eedbe81

TL;DR: The "Checkout source code" stage failed because PR #1968 modified the CI file contrib/Dockerfile.manylinux but did not bump CI_IMAGE_TAG in the other matrix YAMLs; only build-wheel-matrix.yaml was updated. Bump CI_IMAGE_TAG in the remaining matrix files (or make all bumps consistent) to pass the cidemo-init.sh guard.

Full analysis

Summary: The cidemo-init.sh CI init hook aborted checkout with "You have changed CI files but forgot to increase CI_IMAGE_TAG" because a CI-tracked file was changed without a corresponding tag bump in all matrix files.

Root cause: PR #1968 edited contrib/Dockerfile.manylinux, which is one of the CI source files monitored by the init hook. The hook requires CI_IMAGE_TAG to be incremented in every matrix YAML when such files change. Per the log, only build-wheel-matrix.yaml was bumped ( → 20260709-1); the build/test/test-dl/test-dl-ep/sanitizer matrices remained at 20260707-1 (unchanged), so the guard failed and aborted the checkout hook.

Implicated commit: [REDACTED:Hex High Entropy String] (PR #1968 merge; author not shown in log). The relevant change is the edit to contrib/Dockerfile.manylinux in that PR.

File: contrib/Dockerfile.manylinux (the changed CI file) — and the tag definitions in .ci/jenkins/lib/build-matrix.yaml:46, test-matrix.yaml:53, test-dl-matrix.yaml:52, test-dl-ep-matrix.yaml, test-sanitizer-matrix.yaml, build-wheel-matrix.yaml (only the last was bumped).

Suggested fix: Increase CI_IMAGE_TAG consistently in all the matrix files listed by the error (e.g., set them all to 20260709-1), not just build-wheel-matrix.yaml, then re-run. Note: HEAD of the repo has since migrated cidemo-init.sh to an auto-derived CI_MANAGED placeholder scheme (commit [REDACTED:Hex High Entropy String], PR #1933), so rebasing PR #1968 onto current main would eliminate the manual-bump requirement entirely and is the cleaner long-term fix.

Related: PR #1933 (ci: auto-derive CI_IMAGE_TAG in cidemo-init.sh, [REDACTED:Hex High Entropy String]) and PR #1870 (ci: split Dockerfile.manylinux into wheel_base/wheel stages, 619f09e).

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 6c7d77b1-68d9-4cb8-90da-251de237c354 in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit 5eedbe81

TL;DR: The "Checkout source code" stage failed because PR #1968 modified contrib/Dockerfile.manylinux but did not bump CI_IMAGE_TAG in the required Jenkins matrix YAMLs; bump the tag in the five matrix files that were not updated.

Full analysis

Summary: Stage 13 "Checkout source code" aborted — the .ci/cidemo-init.sh init hook rejected the build because a CI Docker file was changed without a matching CI_IMAGE_TAG bump.

Root cause: The guard in .ci/cidemo-init.sh detected changes in contrib/Dockerfile.manylinux and verified that CI_IMAGE_TAG was incremented across the matrix files. Only build-wheel-matrix.yaml was updated ( -> 20260709-1); the other five matrices stayed at 20260707-1 -> 20260707-1 (unchanged). Because those tags did not increase, the hook exited non-zero with "You have changed CI files but forgot to increase CI_IMAGE_TAG!", which surfaces as hudson.AbortException: Checkout source code failed with msg: Fail to run cidemo init hook. This is a config/policy failure in the PR, not an infrastructure or test failure.

Implicated commit: The head commit of PR #1968 (merge commit 5eedbe8, merging 26de09f) that edited contrib/Dockerfile.manylinux without bumping all CI_IMAGE_TAG values. Author not shown in the checkout log; the manylinux file's recent history is by NirWolfer.

File: contrib/Dockerfile.manylinux (changed) vs. the un-bumped tags in:

  • .ci/jenkins/lib/build-matrix.yaml (line 46)
  • .ci/jenkins/lib/test-matrix.yaml (line 53)
  • .ci/jenkins/lib/test-dl-matrix.yaml (line 52)
  • .ci/jenkins/lib/test-dl-ep-matrix.yaml
  • .ci/jenkins/lib/test-sanitizer-matrix.yaml

Suggested fix: In PR #1968, increase CI_IMAGE_TAG in the five matrix YAMLs listed above to match the already-bumped value (e.g. 20260709-1, or a fresh incremented tag) so all matrices are consistent, matching what was done for build-wheel-matrix.yaml. Then re-run the build. (Note: the guard logic shown in the running log differs from the placeholder-patching version currently on disk in .ci/cidemo-init.sh; if the intent is auto-derived CI_MANAGED tags rather than manual bumps, the branch may be running an older hook — worth confirming which behavior is intended, but the immediate unblock is to bump the tags.)

Related: PR #1968 (this build); prior manylinux CI changes in #1918, #1941, #1870.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-test-sanitizers · commit 5eedbe81

TL;DR: The Checkout source code stage failed because PR #1968 modified contrib/Dockerfile.manylinux but only bumped CI_IMAGE_TAG in build-wheel-matrix.yaml and not in the other matrix files (including test-sanitizer-matrix.yaml); bump the tag in the remaining matrix YAMLs to fix it.

Full analysis

Summary: The cidemo-init checkout hook aborted the build with "You have changed CI files but forgot to increase CI_IMAGE_TAG!"

Root cause: contrib/Dockerfile.manylinux is a tracked CI file (listed in .ci/cidemo-init.sh CI_FILES). When it changes, the CI guard requires CI_IMAGE_TAG to be incremented in every matrix YAML. PR #1968 changed Dockerfile.manylinux and updated the tag only in build-wheel-matrix.yaml ( -> 20260709-1); the other five matrices — build, test, test-dl, test-dl-ep, and test-sanitizer — remained at 20260707-1, so the guard failed the checkout. This is a policy/config gate, not a build or test regression.

Implicated commit: PR #1968, merge commit [REDACTED:Hex High Entropy String] (the change to contrib/Dockerfile.manylinux without a full tag bump). Prior touching commits: b212c12 (NirWolfer), fe64ff0 (NirWolfer).

File: .ci/jenkins/lib/test-sanitizer-matrix.yaml (CI_IMAGE_TAG), plus build-matrix.yaml:46, test-matrix.yaml:53, test-dl-matrix.yaml:52, and test-dl-ep-matrix.yaml. Guard logic in .ci/cidemo-init.sh:7-13.

Suggested fix: Increment CI_IMAGE_TAG to a consistent new value (e.g. 20260709-1) in all remaining matrix YAMLs so it matches build-wheel-matrix.yaml: .ci/jenkins/lib/build-matrix.yaml (line 46), test-matrix.yaml (line 53), test-dl-matrix.yaml (line 52), test-dl-ep-matrix.yaml, and test-sanitizer-matrix.yaml. Then re-run the job.

Related: PR #1968 (this build); related manylinux changes: PR #1918, PR #1941, PR #1870.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id c62a2e92-df2a-43bf-b7dd-a9db7c996191 in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-build-wheel · commit 5eedbe81

TL;DR: The "Checkout source code" stage failed because PR #1968 modified contrib/Dockerfile.manylinux (a CI source file) but only bumped CI_IMAGE_TAG in build-wheel-matrix.yaml — the guard in .ci/cidemo-init.sh requires the tag be bumped consistently across all matrix files. Fix: bump CI_IMAGE_TAG to 20260709-1 in the other five matrix YAMLs too.

Full analysis

Summary: Jenkins build #1141 aborted in the "Checkout source code" stage when the .ci/cidemo-init.sh init hook rejected the checkout.

Root cause: The commit changed contrib/Dockerfile.manylinux, which is a tracked CI source file. The init hook enforces that when any CI file changes, CI_IMAGE_TAG must be increased in every matrix YAML. Only build-wheel-matrix.yaml was bumped ( -> 20260709-1); the other five matrices remained at 20260707-1 -> 20260707-1, so the guard emitted "You have changed CI files but forgot to increase CI_IMAGE_TAG!" and aborted with hudson.AbortException: Fail to run cidemo init hook.

Implicated commit: [REDACTED:Hex High Entropy String] (PR #1968 merge head). Note the CI-file change to contrib/Dockerfile.manylinux traces to prior work by NirWolfer (e.g. b212c12, 619f09e), but the incomplete tag bump is in this PR.

File: .ci/cidemo-init.sh (guard logic) driving the failure; the fix is in the matrix YAMLs, e.g. .ci/jenkins/lib/build-matrix.yaml:46 (and the other four) and .ci/jenkins/lib/build-wheel-matrix.yaml (already bumped).

Suggested fix: Update CI_IMAGE_TAG to 20260709-1 in the five matrix files that were missed:

  • .ci/jenkins/lib/build-matrix.yaml
  • .ci/jenkins/lib/test-matrix.yaml
  • .ci/jenkins/lib/test-dl-matrix.yaml
  • .ci/jenkins/lib/test-dl-ep-matrix.yaml
  • .ci/jenkins/lib/test-sanitizer-matrix.yaml

so all six match the value already set in build-wheel-matrix.yaml. (Note: the version of .ci/cidemo-init.sh currently in the repo auto-patches a CI_MANAGED placeholder rather than validating manual bumps — the running Jenkins agent used the manual-bump guard, so aligning the tags across all matrices is the correct action for this build.)

Related: PR #1968 (this build); PR #1918 / #1870 (619f09e) — recent Dockerfile.manylinux changes.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 52807c2e-8a3c-4ee8-89b6-40ac9154f04d in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu-ep · commit 5eedbe81

TL;DR: The Checkout source code stage failed because the PR modified contrib/Dockerfile.manylinux — a guarded CI file — without bumping CI_IMAGE_TAG in all required matrix YAMLs; only build-wheel-matrix.yaml was updated. Bump CI_IMAGE_TAG in the other five matrix files (or backport the auto-derive cidemo-init.sh).

Full analysis

Summary: Build #429 aborted in the "Checkout source code" stage when .ci/cidemo-init.sh failed its CI-file guard check ("You have changed CI files but forgot to increase CI_IMAGE_TAG").

Root cause: PR #1968 (a backport to release/1.4.0) changed contrib/Dockerfile.manylinux, which is in the guard's CI_FILES list. The init hook running on this branch requires CI_IMAGE_TAG to be bumped in all six matrix files, but only build-wheel-matrix.yaml was updated ( -> 20260709-1). The other five (build/test/test-dl/test-dl-ep/test-sanitizer) stayed at 20260707-1 -> 20260707-1, so the hook aborted the checkout. Note: main has already replaced this manual gate with an auto-deriving cidemo-init.sh (commit [REDACTED:Hex High Entropy String], #1933), but that change is not present on this release branch.

Implicated commit: PR #1968 base/backport changes to contrib/Dockerfile.manylinux — introduced upstream by 619f09e71cc6 / b212c124b0a0 (NirWolfer). The failing guard predates the auto-derive rewrite [REDACTED:Hex High Entropy String] (NirWolfer).

File: .ci/cidemo-init.sh (guard logic) enforcing CI_IMAGE_TAG in .ci/jenkins/lib/{build-matrix,test-matrix,test-dl-matrix,test-dl-ep-matrix,test-sanitizer-matrix}.yaml

Suggested fix: In PR #1968, bump CI_IMAGE_TAG to 20260709-1 (matching the value already set in build-wheel-matrix.yaml) in the five remaining matrix files: build-matrix.yaml (line 46), test-matrix.yaml (line 53), test-dl-matrix.yaml (line 52), test-dl-ep-matrix.yaml, and test-sanitizer-matrix.yaml. Alternatively, backport the auto-derive cidemo-init.sh from #1933 to release/1.4.0 so the tag is managed automatically.

Related: PR #1968 (#1968); auto-derive rewrite #1933; manylinux split #1870.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id c596a3ab-20c7-46f6-aea3-77be0ca8db07 in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-non-gpu · commit 5eedbe81

TL;DR: The "Checkout source code" stage failed because PR #1968 modified contrib/Dockerfile.manylinux (a CI-tracked file) but only bumped CI_IMAGE_TAG in build-wheel-matrix.yaml, not in the other five matrix YAMLs — bump the tag in all six files.

Full analysis

Summary: The cidemo-init.sh pre-build guard aborted the checkout with ❌ ERROR: You have changed CI files but forgot to increase CI_IMAGE_TAG!, failing stage 13 before any build/test ran.

Root cause: PR #1968 changed contrib/Dockerfile.manylinux, which is a CI-source file that gates the image tag. The guard requires CI_IMAGE_TAG to be bumped consistently across all six matrix files, but the log shows only the Wheel Build matrix was updated (-> 20260709-1, "✓ ... build-wheel-matrix.yaml was updated") while the Build / Test / Test DL / Test DL EP / Sanitizer matrices were left unchanged (20260707-1 -> 20260707-1). The inconsistent bump tripped the guard.

Implicated commit: [REDACTED:Hex High Entropy String] (merge for PR #1968, "build: backport UCX spcx plugin and Infinia DDN plugin wheel support to release/1.4.0"; wheel-related Dockerfile.manylinux changes trace to NirWolfer's #1918/#1941).

File: contrib/Dockerfile.manylinux (changed CI file) + the un-bumped tags in .ci/jenkins/lib/build-matrix.yaml:46, test-matrix.yaml:53, test-dl-matrix.yaml:52, test-dl-ep-matrix.yaml, and test-sanitizer-matrix.yaml.

Suggested fix: Increase CI_IMAGE_TAG to the same new value (e.g. 20260709-1) in all six matrix YAMLs listed by the error, not just build-wheel-matrix.yaml:

  • .ci/jenkins/lib/build-matrix.yaml (line 46)
  • .ci/jenkins/lib/test-matrix.yaml (line 53)
  • .ci/jenkins/lib/test-dl-matrix.yaml (line 52)
  • .ci/jenkins/lib/test-dl-ep-matrix.yaml
  • .ci/jenkins/lib/test-sanitizer-matrix.yaml
  • .ci/jenkins/lib/build-wheel-matrix.yaml (already done)

Then re-run the build. (Note: the checked-in cidemo-init.sh auto-derives the tag from a CI_MANAGED placeholder; on this branch the guard instead requires a manual bump — align the tags to satisfy it.)

Related: PR #1968 (#1968); Dockerfile.manylinux history: #1918, #1941, #1870.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 140dbc50-4781-4364-8bdb-737686a9b8cb in the triage console for the audit trail.

NirWolfer and others added 6 commits July 22, 2026 18:43
…deps (ai-dynamo#1870)

## What?
Add a wheel_base Docker build target covering all dependency compilation
(hwloc, OpenSSL, Abseil, gRPC, AWS/Azure SDKs, Rust, DOCA, libfabric,
UCX, etc.). The wheel stage starts FROM wheel_base and only runs the
NIXL build and wheel creation steps.

In CI the wheel_base image is built and pushed to Artifactory by ci-demo
when Dockerfile.manylinux changes (via the new runs_on_dockers entry).
The build-wheel pipeline then passes --wheel-base-image to
build-container.sh which pulls the cached image and runs --target wheel,
skipping the expensive dep compilation on every PR.

Local docker builds are unaffected: wheel_base ARG defaults to the local
stage name so docker build ./contrib/Dockerfile.manylinux builds the
full image as before.

Also removes the now-redundant manylinux matrix axis (was single-valued
2_28, hardcoded in the image name and wheel-base arg), and wires
cidemo-init.sh to enforce a CI_IMAGE_TAG bump in build-wheel-matrix.yaml
whenever Dockerfile.manylinux changes.

## Why?
Lower nixl-ci-build-wheel pipeline times, and to justify adding ai-dynamo#1777
later on which adds time to this pipeline


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Wheel builds now use a single cached wheel-base (manylinux_2_28) and
support selecting a prebuilt dependencies image, alongside optional
Torch version selection.
* The wheel build matrix is simplified to vary only by Python version
and architecture for more consistent builds.
* **Bug Fixes**
* CI validation now more reliably enforces required image tag updates
for both standard CI changes and wheel Dockerfile changes, with clearer
guidance when updates are missing.
* **Documentation**
* Updated CI docs to reflect the new cached wheel-base flow and how to
refresh it via the wheel cache image tag.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Signed-off-by: Nir Wolfson <nwolfer@nvidia.com>
Signed-off-by: NirWolfer <nwolfer@nvidia.com>
Replace the manual CI_IMAGE_TAG bump requirement with automatic
workspace-level derivation. When CI source files (Dockerfiles, build.sh,
common.sh) change, the tag now updates automatically with no developer
action required.

How it works:
- cidemo-init.sh derives CI_IMAGE_TAG as the short git hash of the most
recent commit touching any CI source file, using: git log -1 --format=%h
-- "${CI_FILES[@]}"
- It then patches all five matrix YAML files in the Jenkins workspace
via sed before the matrix library reads them. No commit or push is made.
- The YAML files now carry CI_IMAGE_TAG: "CI_MANAGED" as a placeholder
that signals the value is managed automatically and must not be
hand-edited.

Caching is preserved: identical CI file history produces the same tag
across PRs, so Artifactory base images are reused when nothing changed.
A PR that modifies a Dockerfile or build script gets a new tag and
triggers a rebuild automatically.

Removes the old validation gate that failed CI when developers forgot to
bump the tag manually.

[HPCINFRA-4578](https://jirasw.nvidia.com/browse/HPCINFRA-4578)

_It is optional, but for complex PRs, please provide information about
the design,
architecture, approach, etc._

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

* **New Features**
* CI Docker image tags are now managed automatically: Jenkins matrix
configs use a `CI_MANAGED` placeholder that’s replaced at the start of
each CI run with a derived tag.
* Improves CI efficiency by keeping the derived tag stable when CI
inputs haven’t changed.
* **Bug Fixes**
* Ensures cached Docker image rebuilds correctly when CI-related
scripts/configs are updated, without requiring manual tag bumps.
* **Documentation**
* Added/updated a “CI_IMAGE_TAG management” section explaining how the
derived tag is computed and how the placeholder is applied across the
Jenkins matrices.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Signed-off-by: NirWolfer <nwolfer@nvidia.com>
…whl (ai-dynamo#1941)

## What?
Add an opt-in --build-infinia flag to contrib/build-container.sh that
pulls the DDN Infinia libs from harbor.mellanox.com (reachable only from
the internal network) on the host, stages them flat into the build
context, and passes BUILD_INFINIA=true to the manylinux wheel build.
Dockerfile.manylinux copies the staged libs to /opt/ddn/red before meson
runs so libplugin_INFINIA.so is built into the wheel;
libred_client/libred_async remain excluded by auditwheel. No harbor
reference exists in the Dockerfile, so external/default builds
(BUILD_INFINIA=false) are byte-for-byte unaffected

## Why?
needed for the release

## How?
_It is optional, but for complex PRs, please provide information about
the design,
architecture, approach, etc._


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Added optional Infinia DDN plugin support to manylinux wheel builds.
* Introduced build flags to enable bundling and to select a custom
Infinia libraries image.
* When enabled, the build workflow automatically stages the required
Infinia libraries for packaging.
* **Chores**
* Updated CI Docker image tags across wheel and test matrices to the
latest version.
* Updated ignore rules to prevent staged Infinia libraries from being
committed.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Signed-off-by: NirWolfer <nwolfer@nvidia.com>
## What

Adds opt-in support for building the internal `ucx-spcx-plugin` (UCX
external plugin, `libuct_ib_mlx5_ext.so`) as part of the NIXL wheel
image build and bundling it into the `nixl-cuXX` wheel.

## How

- **`contrib/Dockerfile.manylinux`**: a dedicated RUN right after the
UCX build (same pattern as the UCX build itself) clones the plugin from
internal GitLab at `UCX_SPCX_PLUGIN_REF` (branch, tag, or full sha;
default `main`), builds it against the just-built UCX (`--with-ucx=/usr
--with-ucx-src=/usr/local/src/ucx`, shared-only like UCX), and
make-installs it directly into `/usr/lib64/ucx` via `--libdir`. Gated by
`BUILD_UCX_SPCX_PLUGIN` (default `false`).
- **Wheel bundling — no changes**: `build-wheel.sh` and
`wheel_add_ucx_plugins.py` are untouched; the plugin sits in the UCX
plugins dir and rides the existing bundling/RPATH-patching like any
other UCX module.
- **`contrib/build-container.sh`**: new `--build-ucx-spcx-plugin` /
`--ucx-spcx-plugin-ref` options; the GitLab token is taken from
`NIXL_GITLAB_TOKEN` and handed to the docker build as a file-based
`--secret` (always supplied, empty when the feature is off, so the
unconditional secret mount works identically on docker and podman).
- **DPA/FlexIO readiness**: the image pre-installs the FlexIO SDK
(`libflexio`) and `dpacc` from the already-configured doca-host repo;
when the plugin's upcoming DPA transport lands and links `libflexio`,
the Dockerfile bundles it next to the plugin automatically so the wheel
ships it — no further changes needed here.

## Token hygiene

The token never appears in image layers, `docker history`, argv, or git
error output: it travels env → 0600 temp file → build secret → env
inside the plugin RUN only, and the clone uses a git credential helper
reading it from the environment (credential-free URL,
`GIT_TERMINAL_PROMPT=0`).

## Behavior when disabled

Flag off ⇒ the wheel build is byte-identical to today; the plugin RUN is
a no-op and the wheel RUN is unchanged from main.

## Testing

- Feature leg built end-to-end locally (x86_64, CUDA 13, Python 3.12):
plugin cloned/built/installed by the inline RUN, wheel contains
`nixl_cu13.libs/ucx/libuct_ib_mlx5_ext.so.0.0.0` (shared-only, no static
archive) alongside `libplugin_UCX.so`; clean-venv `pip install`
verified; `docker history` clean of the token.
- Regression: with the flag off the wheel RUN is byte-identical to main
(verified by diff); default builds don't reach any new code path.
- Build fixes discovered during E2E are baked in: UCX installs to `/usr`
in this image (its configure default), `ACLOCAL_PATH` so the plugin's
autogen finds `pkg.m4` with the image's source-built autotools, and
explicit `-L/usr/lib64/ucx -L/usr/lib64` link dirs (the plugin's
configure assumes a `lib/` layout).

## Why?
[HPCINFRA-4539](https://jirasw.nvidia.com/browse/HPCINFRA-4539)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added an opt-in build flow to include the UCX SPX plugin in manylinux
container builds.
* Introduced build options/flags to enable the plugin and select the
plugin revision.
* Updated build help/output to show plugin status and required
prerequisites when enabled.
* **Chores**
* Prevented the temporary plugin source directory from being committed.
* Ensured the downloaded plugin sources are cleaned up after the build.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Signed-off-by: NirWolfer <nwolfer@nvidia.com>
…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 -->
@NirWolfer
NirWolfer force-pushed the nwolfer/release-1.4.0-ucx-spcx-infinia branch from 26de09f to e1d7996 Compare July 22, 2026 15:52
@copy-pr-bot

copy-pr-bot Bot commented Jul 22, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@NirWolfer

Copy link
Copy Markdown
Contributor Author

/build

@NirWolfer NirWolfer changed the title build: backport UCX spcx plugin and Infinia DDN plugin wheel support to release/1.4.0 build/ci: backport wheel-build CI and UCX spcx + Infinia plugin bundling to release/1.4.0 Jul 22, 2026
@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-test-sanitizers · commit e03a1589

TL;DR: The sanitizer image setup failed because the CI runner couldn't reach the Ubuntu apt mirrors (archive.ubuntu.com/security.ubuntu.com timed out / "Network is unreachable"), so apt-get install in .gitlab/build.sh couldn't locate ~25 build packages and exited 100. This is a transient network/infra failure, not a code defect — retry the build.

Full analysis

Summary: Both "Setup Image" stages (tsan #37 FAILURE, asan #38 ABORTED) failed while building the base Docker image; the apt-get install in build.sh could not download packages.

Root cause: Network connectivity to the Ubuntu package mirrors was down during the build. The tsan stage log shows Err:15 http://security.ubuntu.com/... Connection failed and Failed to fetch http://archive.ubuntu.com/... connect (101: Network is unreachable) ... connection timed out for all mirror IPs, leaving the apt index incomplete. apt-get install then emitted E: Unable to locate package libiberty-dev (and ~24 others) and exited 100. The asan stage was aborted (exit 143) as a sibling in the failed parallel matrix while itself stuck on sudo apt-get -qq update under the same outage. The base image was rebuilt from scratch only because the prebuilt tag 82653e42 wasn't present in Harbor, which forced this network-dependent path.

Implicated commit: None — not caused by commit e03a158 / PR #1968. The apt step in .gitlab/build.sh is unchanged since before this PR.

File: .gitlab/build.sh (the sudo apt-get -qq update && sudo apt-get -qq install -y ... dependency-install step); invoked from .ci/dockerfiles/Dockerfile.base STEP 28.

Suggested fix: Re-run the build — this is a transient mirror outage. To harden against it: (1) ensure the prebuilt base image tag is available in Harbor so the --no-cache rebuild path isn't triggered on every run; (2) point apt at an internal/mirror proxy or add retry/backoff (e.g. APT::Acquire::Retries) around the apt-get update/install in build.sh; (3) fail fast on apt-get update errors instead of proceeding into install with a partial index.

Related: none

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-test-sanitizers · commit e03a1589

TL;DR: Both the ASAN and TSAN "Setup Image" stages failed at the apt-get install step in Dockerfile.base because the build node could not reach archive.ubuntu.com (network unreachable), leaving sudo's dependency libapparmor1 uninstallable. This is a CI infrastructure/network outage, not a code bug — retry the build.

Full analysis

Summary: nixl-ci-test-sanitizers #535 failed in the parallel "Setup Image" stages (ASAN node 38, TSAN node 37) while building .ci/dockerfiles/Dockerfile.base.

Root cause: The prebuilt base image tag 82653e42 was not found in harbor, so the pipeline fell back to building it. During RUN apt-get update && apt-get install -y sudo python3 python3-pip kmod ..., the container could not reach http://archive.ubuntu.com — every IP returned "Network is unreachable" / "connection timed out" (only security.ubuntu.com was reachable). Because the noble main/updates archive indexes never downloaded, apt could not resolve sudo's dependency libapparmor1 (>= 2.7.0~beta1+bzr1772), producing E: Unable to correct problems, you have held broken packages and exit status 100. This is a transient network/registry problem on the build agent, not a defect in the PR or Dockerfile.

Implicated commit: none — not caused by PR #1968 or commit e03a158. The failure is environmental (registry cache miss + archive.ubuntu.com unreachable from the build node).

File: .ci/dockerfiles/Dockerfile.base:40-42 (the apt-get layer where the network failure surfaced)

Suggested fix:

  • Immediate: re-run the build; the archive.ubuntu.com outage/routing failure is transient (security.ubuntu.com worked, so it was partial).
  • Investigate why the base image tag 82653e42 was missing from harbor.mellanox.com — if the cached base image had been present, no apt-get (and thus no external Ubuntu mirror access) would have been needed. Ensure the base-image build/push step ran and published that tag.
  • Hardening: point apt at an internal/mirror of archive.ubuntu.com (or configure a reliable proxy) for build nodes, and/or force IPv4 (Acquire::ForceIPv4 "true";) since many failures were IPv6 "Network is unreachable". Optionally add apt-get update retry logic.

Related: none found.

@nv-nmailhot
nv-nmailhot merged commit 1a026b3 into ai-dynamo:release/1.4.0 Jul 22, 2026
9 of 17 checks passed
@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit e03a1589

TL;DR: The Setup Image stage failed while building Dockerfile.base because the build host could not reach archive.ubuntu.com/security.ubuntu.com, so apt-get install couldn't locate sudo/kmod (exit 100). This is a CI network/infrastructure outage, not a code bug — retry the build (and/or fix mirror connectivity).

Full analysis

Summary: nixl-ci-gpu #2889 failed in the "Setup Image" stage (node 37) during docker build of .ci/dockerfiles/Dockerfile.base at the apt-get update && apt-get install -y sudo python3 python3-pip kmod step.

Root cause: Network connectivity to the Ubuntu package mirrors was down. The log shows repeated Connection failed [IP: 91.189.92.22 80] and Network is unreachable errors for archive.ubuntu.com/security.ubuntu.com, apt spent 21m46s retrying (an ~18 min stall from 16:03:47→16:21:24 confirms it was hanging on unreachable hosts, not doing real work), and then failed with E: Unable to locate package sudo / E: Unable to locate package kmod → STEP exit status 100. This build only ran the full base-image build because the cached base image tag 82653e42 was reported as manifest unknown in the Artifactory registry, forcing a from-scratch build that depends on external apt mirrors.

Implicated commit: none — the failure is environmental (mirror/network outage), unrelated to PR #1968 / commit e03a158.

File: .ci/dockerfiles/Dockerfile.base (the RUN apt-get update && apt-get install -y sudo python3 python3-pip kmod ... layer, ~STEP 17/32)

Suggested fix:

  • Re-run the build once network connectivity to the Ubuntu mirrors is restored; this should pass without code changes.
  • To harden against this recurring: point apt at an internal/artifactory-cached Ubuntu mirror (or set an apt proxy) in the CI environment so base-image builds don't depend on public archive.ubuntu.com.
  • Investigate why the cached base image nixl-ci-gpu-base-pytorch26.06-cuda13.3-ubuntu24.04:82653e42 returned manifest unknown — if the tag were present, the expensive from-scratch build (and this apt dependency) would have been skipped entirely.

Related: none found.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-build-container-pr · commit e03a1589

TL;DR: The two x86_64 container image builds failed at the apt-get install step because the build agent couldn't reach archive.ubuntu.com/security.ubuntu.com (connection timeouts / "Network is unreachable"); this is a transient network/mirror outage, not a code defect — just retry the build.

Full analysis

Summary: Stages container-build/nixl/x86_64 (node 207) and container-build/nixlbench/x86_64 (node 222) failed during docker/podman build when apt-get install could not download packages from the Ubuntu mirrors.

Root cause: Network connectivity failure from the x86_64 build agent to archive.ubuntu.com and security.ubuntu.com. The logs show repeated Connection failed [IP: ...], Cannot initiate the connection ... Network is unreachable (IPv6) and connection timed out (IPv4), with severely throttled throughput (Fetched ... in 8min 27s (94.6 kB/s) / in 5min 33s (12.6 kB/s)). apt then failed with E: Unable to fetch some archives / E: Unable to locate package ...subprocess exited with status 100. The aarch64 equivalents of both builds passed, and later re-runs of the x86_64 stages (nodes 95 and 73) succeeded — confirming a transient mirror/network problem rather than anything in commit e03a158.

Implicated commit: none — not caused by the PR commit (e03a158); infrastructure/network issue.

File: N/A (failure is in apt-get update && apt-get install ... inside the container Dockerfile; e.g. the RUN apt-get ... install layer of the x86_64 build).

Suggested fix: Retry the build — the connectivity issue appears transient (parallel/retry stages already succeeded). To harden against recurrence: (1) point the container builds at a reliable internal apt mirror or caching proxy (e.g. apt-cacher-ng) instead of archive.ubuntu.com directly; (2) add apt retry/timeout options such as -o Acquire::Retries=5 -o Acquire::http::Timeout=30; and (3) consider disabling IPv6 for apt on the agent (Acquire::ForceIPv4 "true";) since many failures were IPv6 "Network is unreachable".

Related: none found.

nv-nmailhot added a commit that referenced this pull request Jul 22, 2026
…C CUDA)

Incorporates the "ubi8" base image discussed on #1968: the wheel_base deps
stage now builds on the public PyPA manylinux_2_28 image and COPYs CUDA from
an el8/ubi8 NGC CUDA devel image (nvcr.io/nvidia/cuda:*-devel-ubi8), instead
of a combined internal manylinux+CUDA base.

- Dockerfile.manylinux: add the Option-B header (cuda donor stage + quay
  manylinux wheel_base + COPY --from=cuda + gcc-toolset-14 + CMake 4.x policy).
  Keeps #1968's two-stage wheel_base/wheel caching split and the opt-in
  --build-infinia / --build-ucx-spcx-plugin blocks untouched. INFINIA stays
  opt-in (host-pull COPY) — not the bundled-default FROM stage.
- build-container.sh: restore --cuda-version (MAJOR.MINOR) so local/release
  full builds drive the torch cuXXX index + cu12/cu13 meta-wheel split.
- build-wheel-matrix.yaml: point BASE_IMAGE/BASE_TAG at the ubi8 CUDA image,
  add CUDA_VERSION + MANYLINUX_VERSION, pass --cuda-version, and forward
  CUDA_VERSION/MANYLINUX_VERSION to the wheel_base cache build.
- Bump CI_IMAGE_TAG in all six matrix YAMLs (cidemo-init.sh requires it when
  a CI file such as Dockerfile.manylinux changes).

Note: only the ci-demo wheel_base cache build pulls nvcr.io/quay.io; per-PR
wheel builds pull the cached wheel_base from Artifactory. If the blossom
runner cannot reach nvcr.io/quay.io, repoint BASE_IMAGE at an Artifactory
ubi8 mirror (same ubi8 tag).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-test-sanitizers · commit e03a1589

TL;DR: The sanitizer image-setup stages failed because the pre-built base image tag 82653e42 was missing from Harbor, forcing an on-the-fly Dockerfile.base build whose apt-get calls couldn't reach archive.ubuntu.com/security.ubuntu.com (network unreachable / timeouts), yielding E: Unable to locate package ... and exit 100. This is a CI infrastructure/network issue, not a code bug — retry once the registry/mirror connectivity is restored.

Full analysis

Summary: "Setup Image" stages (nodes 37 tsan, 38 asan) failed building Dockerfile.base after a registry cache miss; apt could not reach the Ubuntu mirrors.

Root cause: Two compounding infra failures: (1) base image harbor.mellanox.com/nixl/base/x86_64/nixl-base-...-{asan,tsan}:82653e42 not found in Harbor, triggering a full local rebuild; (2) the build node had no route to archive.ubuntu.com/security.ubuntu.com — repeated connect (101: Network is unreachable) and connection timed out. The stale/empty apt index made apt-get install fail with E: Unable to locate package ... → subprocess exit status 100. Timestamps show the apt index fetch crawled at ~21 kB/s for 21 minutes, confirming degraded network, not a slow/hung app process.

Implicated commit: unknown — no application commit is implicated; failure is environmental (missing registry tag + apt mirror unreachable).

File: .ci/dockerfiles/Dockerfile.base (STEP 17: RUN apt-get update && apt-get install -y ...) — the point of failure, though the file itself is not defective.

Suggested fix: This is an infra issue — no code change will fix it. Recommended actions: (1) re-run the build once mirror connectivity is restored; (2) investigate why base tag 82653e42 is absent from Harbor (base-image publish job may have failed) so CI hits the cached image instead of rebuilding; (3) if rebuilds must be resilient, point apt at an internal/reliable mirror in Dockerfile.base and consider disabling IPv6 for apt on build nodes (the IPv6 addresses were all unreachable). Do not raise any time limits.

Related: none found.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu · commit e03a1589

TL;DR: The "Run DL CPP tests" stage failed because three ucx/TestErrorHandling gtests (single-worker UCX engine) crashed with SIGSEGV in the remote-disconnect cleanup path; the threadpool variants pass, pointing to the recent UCX engine-hierarchy refactor (PR #1906) as the root cause — fix the null/lifetime bug it introduced in nixlUcxThreadEngine's error handling.

Full analysis

Summary: Stage Run DL CPP tests (#337) exited 245 because gtest reported 3 failures: ucx/TestErrorHandling.LoadRemoteThenFail/0, .XferThenFail/0, and .XferFailRestore/0, each "killed by signal SIGSEGV".

Root cause: A segfault in the single-worker UCX backend engine's error/disconnect handling. All three crashing tests are the ucx/ instantiation (num_workers=1, num_threads=0nixlUcxThreadEngine), and they crash immediately after logging postXferReq: remote agent 'target' was disconnected after transfer request creation. The identical ucx_threadpool/ instantiation of every one of these tests passes, so the fault is specific to the non-threadpool engine's teardown-on-disconnect path (a dangling/null endpoint or request pointer being dereferenced during destroy()/cleanup), not the test code — test/gtest/error_handling.cpp is unchanged since June.

Implicated commit: 209abbe9b98e — "Refactoring: derive nixlUcxThreadPoolEngine from nixlUcxThreadEngine (#1906)", Ilia Yastrebov, 2026-07-17. It is the newest change to the exact engine class hierarchy that separates the passing (threadpool) from the failing (plain) variant.

File: src/plugins/ucx/ucx_backend.cpp / src/plugins/ucx/ucx_backend.h (the nixlUcxThreadEngine disconnect/cleanup path exercised by nixl_agent.cpp:1216 postXferReq disconnect). Test that reproduces: test/gtest/error_handling.cpp:442 (XferFailRestore), :436, :430.

Suggested fix: Review PR #1906's refactor of the base nixlUcxThreadEngine for lifetime/ownership regressions on the disconnect path — verify endpoint/request handles are still valid (non-null, not double-freed) when a remote agent is invalidated via m_Target.destroy() during/after postXferReq. Reproduce locally with ./bin/gtest --gtest_filter='ucx/TestErrorHandling.*' and run under ASan (the repo already has an ASan build target from PR #1709) to pinpoint the invalid access, then guard the null/freed pointer in the single-worker engine's cleanup.

Related: PR #1906 (implicated); the ASan/UBSan/TSan CI build added in PR #1709 ([REDACTED:Hex High Entropy String]) can localize the crash.

Note: the earlier build_helper_dl/.../ucx-* stage failures (#176/#177) were transient and succeeded on retry (#203/#194), and the Allocate DL Environment failure (#235, salloc ... Socket timed out on send/recv) is an unrelated Slurm scheduler timeout — neither is the root cause of this build's test failure.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id ee0d3e99-d202-49f5-bea3-32b5c3bea735 in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu-ep · commit e03a1589

TL;DR: The Allocate DL EP Environment stage failed because salloc on the GB200 Slurm cluster waited the full --immediate=3600 (60 min) window without getting a node and then died with Socket timed out on send/recv operation. This is a cluster capacity / Slurm-controller infrastructure issue, not a defect in PR #1968 — the NIXL build and Docker image steps all succeeded.

Full analysis

Summary: Jenkins stage "Allocate DL EP Environment" (node 252/235) failed at the SSH salloc step against dlcluster.nvidia.com partition gb200nvl72_cx8.

Root cause: The Slurm allocation could not be satisfied within the 3600s immediate window — job 1632472 was "queued and waiting for resources" and salloc ultimately failed with salloc: error: Job submit/allocate failed: Socket timed out on send/recv operation. The ~61-minute gap between 16:46:33 (salloc issued) and 17:47:26 (timeout error) matches the --immediate=3600 limit exactly, indicating the GB200 partition had no free nodes / the Slurm controller became unresponsive. This is environmental, not caused by the committed code (the earlier compile+install and container push stages completed successfully).

Implicated commit: none — not a code regression; e03a158 built and packaged cleanly.

File: CI pipeline Slurm allocation step (slurm.allocation groovy call: salloc -N 1 -p gb200nvl72_cx8 --immediate=3600 --time=01:30:00 --no-shell --account=blackwell)

Suggested fix: Retry the allocation stage (this is a transient cluster-capacity failure). To make CI more resilient, wrap the salloc call in a retry-with-backoff, and consider treating Socket timed out on send/recv operation / immediate-timeout as a distinct "infra" outcome that reruns rather than marking the PR failed. If GB200 contention is chronic, raise --immediate handling or check Slurm controller (slurmctld) health / partition availability with the cluster admins. Do not change PR #1968.

Related: none found.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-non-gpu · commit e03a1589

TL;DR: The two "Setup Image" stages failed because the Docker base-image build could not reach archive.ubuntu.com/security.ubuntu.com (Connection failed / Network is unreachable), so apt-get install had no package candidates and exited 100 — this is a transient CI network/infra outage, not a code bug.

Full analysis

Summary: Setup Image x86_64/...13.0.1-ubuntu22.04 and .../pytorch26.06-cuda13.3-ubuntu24.04 failed while building .ci/dockerfiles/Dockerfile.base at the apt-get update && apt-get install step (exit status 100).

Root cause: Network failure reaching the Ubuntu APT mirrors from the x86_64 build node. Logs show Err ... http://archive.ubuntu.com/... Connection failed / Cannot initiate the connection ... Network is unreachable / connection timed out, and severely throttled transfers (20.8 MB in 22min 55s (15.2 kB/s), 3097 kB in 6min 42s). With package indexes unavailable, apt reported E: Package 'sudo' has no installation candidate / E: Unable to locate package sudo/kmod, causing the layer build to exit 100. A contributing factor: the pre-built base image tag 82653e42 was absent from the artifactory registry (manifest unknown), which forced a full --no-cache --pull rebuild that then required live mirror access. The aarch64 variants (same commit) succeeded, confirming this is node/network-specific, not commit-specific.

Implicated commit: None — not caused by commit e03a158 / PR #1968. This is an infrastructure/network failure on the build node.

File: .ci/dockerfiles/Dockerfile.base:40 (the apt-get update && apt-get install -y sudo python3 python3-pip kmod layer).

Suggested fix:

  1. Retry the build — the network outage on the x86_64 node was transient (aarch64 with the same commit passed).
  2. Investigate why the cached base image ...:82653e42 was missing from artifactory.nvidia.com/.../ci/x86_64/...; if it had been present, no live apt access would have been needed. Ensure the image-cache/push step for x86_64 is populating that tag.
  3. To harden against mirror flakiness: point the CI base image at an internal/mirrored APT repo (or Artifactory apt remote) instead of archive.ubuntu.com, and/or add apt-get update retry logic (e.g. Acquire::Retries) in Dockerfile.base.

Related: none found.

Note: no time-limit change is warranted — the stages failed with a hard apt error (exit 100), not a wall-clock kill.

nv-nmailhot added a commit that referenced this pull request Jul 29, 2026
…C CUDA)

Incorporates the "ubi8" base image discussed on #1968: the wheel_base
deps stage now builds on the public PyPA manylinux_2_28 image and COPYs
CUDA from an el8/ubi8 NGC CUDA devel image
(nvcr.io/nvidia/cuda:*-devel-ubi8), instead of a combined internal
manylinux+CUDA base.

- Dockerfile.manylinux: add the Option-B header (cuda donor stage + quay
manylinux wheel_base + COPY --from=cuda + gcc-toolset-14 + CMake 4.x
policy). Keeps #1968's two-stage wheel_base/wheel caching split and the
opt-in --build-infinia / --build-ucx-spcx-plugin blocks untouched.
INFINIA stays opt-in (host-pull COPY) — not the bundled-default FROM
stage.
- build-container.sh: restore --cuda-version (MAJOR.MINOR) so
local/release full builds drive the torch cuXXX index + cu12/cu13
meta-wheel split.
- build-wheel-matrix.yaml: point BASE_IMAGE/BASE_TAG at the ubi8 CUDA
image, add CUDA_VERSION + MANYLINUX_VERSION, pass --cuda-version, and
forward CUDA_VERSION/MANYLINUX_VERSION to the wheel_base cache build.
- Bump CI_IMAGE_TAG in all six matrix YAMLs (cidemo-init.sh requires it
when a CI file such as Dockerfile.manylinux changes).

Note: only the ci-demo wheel_base cache build pulls nvcr.io/quay.io;
per-PR wheel builds pull the cached wheel_base from Artifactory. If the
blossom runner cannot reach nvcr.io/quay.io, repoint BASE_IMAGE at an
Artifactory ubi8 mirror (same ubi8 tag).

## What?
_Describe what this PR is doing._

## Why?
_Justification for the PR. If there is an existing issue/bug, please
reference it. For
bug fixes, the 'Why?' and 'What?' can be merged into a single item._

## How?
_It is optional, but for complex PRs, please provide information about
the design,
architecture, approach, etc._


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
* Updated wheel builds to use pinned CUDA and manylinux versions for
more consistent, repeatable packaging.
* Added a selectable CUDA version option for containerized wheel builds
(defaulting to CUDA 13.0).
* Improved build compatibility by aligning the toolchain/CMake behavior
with newer environments.
* Refreshed the wheel build base image approach while preserving CUDA
support for the build.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
nv-nmailhot added a commit that referenced this pull request Jul 29, 2026
…#2009)

…C CUDA)

Incorporates the "ubi8" base image discussed on #1968: the wheel_base
deps stage now builds on the public PyPA manylinux_2_28 image and COPYs
CUDA from an el8/ubi8 NGC CUDA devel image
(nvcr.io/nvidia/cuda:*-devel-ubi8), instead of a combined internal
manylinux+CUDA base.

- Dockerfile.manylinux: add the Option-B header (cuda donor stage + quay
manylinux wheel_base + COPY --from=cuda + gcc-toolset-14 + CMake 4.x
policy). Keeps #1968's two-stage wheel_base/wheel caching split and the
opt-in --build-infinia / --build-ucx-spcx-plugin blocks untouched.
INFINIA stays opt-in (host-pull COPY) — not the bundled-default FROM
stage.
- build-container.sh: restore --cuda-version (MAJOR.MINOR) so
local/release full builds drive the torch cuXXX index + cu12/cu13
meta-wheel split.
- build-wheel-matrix.yaml: point BASE_IMAGE/BASE_TAG at the ubi8 CUDA
image, add CUDA_VERSION + MANYLINUX_VERSION, pass --cuda-version, and
forward CUDA_VERSION/MANYLINUX_VERSION to the wheel_base cache build.
- Bump CI_IMAGE_TAG in all six matrix YAMLs (cidemo-init.sh requires it
when a CI file such as Dockerfile.manylinux changes).

Note: only the ci-demo wheel_base cache build pulls nvcr.io/quay.io;
per-PR wheel builds pull the cached wheel_base from Artifactory. If the
blossom runner cannot reach nvcr.io/quay.io, repoint BASE_IMAGE at an
Artifactory ubi8 mirror (same ubi8 tag).

## What?
_Describe what this PR is doing._

## Why?
_Justification for the PR. If there is an existing issue/bug, please
reference it. For
bug fixes, the 'Why?' and 'What?' can be merged into a single item._

## How?
_It is optional, but for complex PRs, please provide information about
the design,
architecture, approach, etc._


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
* Updated wheel builds to use pinned CUDA and manylinux versions for
more consistent, repeatable packaging.
* Added a selectable CUDA version option for containerized wheel builds
(defaulting to CUDA 13.0).
* Improved build compatibility by aligning the toolchain/CMake behavior
with newer environments.
* Refreshed the wheel build base image approach while preserving CUDA
support for the build.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

## What?
_Describe what this PR is doing._

## Why?
_Justification for the PR. If there is an existing issue/bug, please
reference it. For
bug fixes, the 'Why?' and 'What?' can be merged into a single item._

## How?
_It is optional, but for complex PRs, please provide information about
the design,
architecture, approach, etc._

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants