Repository navigation
ci: import the Slurm container image before the timed test stages - #2378
Conversation
|
/build |
|
👋 Hi dpressle! Thank you for contributing to ai-dynamo/nixl. Your PR reviewers will review your contribution then trigger the CI to test your changes. 🚀 |
The first srun --container-image of a Slurm pipeline pulls and unpacks the CI image inside that test stage's own timeout, so a slow registry or node kills the stage before any test runs (nixl-ci-gpu-vr build 176: 15 min of pyxis import, exit 143). Add a 'Sync Container Image' step right after the allocation in every Slurm matrix (test, vr, dl, dl-ep, llm-container, build-wheel). It runs a cheap environment check (hostname, nvidia-smi -L, df) in the same --container-name the tests reuse, with its own 30 min budget, so the import is no longer counted against a test stage and a failed import shows up as its own stage. Refs HPCINFRA-4925 Signed-off-by: danielpr <danielpr@nvidia.com>
5e0caa2 to
a29ca52
Compare
|
/build |
|
🤖 CI Triage Agent — TL;DR: Two of the four x86_64 "Build" variants failed at Full analysisSummary: Root cause: This is a build-time dependency-fetch failure, not a code defect and not a hang: the stages died in 5.6 s and 13.4 s with continuous log output. Note every other dependency in the same configure run resolved fine — Implicated commit: File: Suggested fix: Pick one, in order of preference:
Related: PR #2291 "CI: retry git fetches and trim gRPC submodules in dependency builds" — same class of problem (flaky git fetches during dependency builds) and a good place to land the retry/fallback hardening; PR #2378 is the branch under test and is not implicated. |
|
🤖 CI Triage Agent — TL;DR: The container build fails in Full analysisSummary: Two of the four parallel "Build image" branches of Root cause: GitHub refused the anonymous clone, git fell back to asking for credentials, and Implicated commit: File: Suggested fix: Pick one:
Also worth auditing for any other Related: PR #2310 (introduced the auth/prompt change), PR #2121 (
|
`meson setup` clones two `[wrap-git]` subprojects from github.com: `taskflow` (`subprojects/taskflow.wrap`, a `[wrap-git]` since #2121) and `prometheus-cpp`. #2310 mounted the `ghconfig` build secret on every explicit `git clone` `RUN` in the Dockerfiles, but not on the `RUN`s that call `meson setup`, so those two clones stayed anonymous. When github.com answers an anonymous clone with an HTTP 401, the two clones fail in different ways: - `taskflow` is required, so `meson setup` fails. In `nixl-ci-build-container-pr` #1012 (PR #2378), two of the four `Build image` branches failed with `fatal: could not read Username for 'https://github.com': terminal prompts disabled` / `ERROR: Subproject taskflow is buildable: NO`. - `prometheus-cpp` is an optional CMake subproject, so meson continues without it and the Prometheus telemetry exporter is not built. This already happened in CI on 2026-09-23 and 2026-09-28: `libtelemetry_exporter_prometheus.so` was missing and 15 `prometheusTelemetryTest` cases failed. `contrib/Dockerfile.manylinux` has the same unmounted `meson setup`, in the `wheel` stage. The PR wheel build (`build-wheel-matrix.yaml`) bound the github.com token only around the ci-demo build of `wheel_base`, so its `Build Wheel` step, which builds the `wheel` stage, passed no secret at all. Changes: - `contrib/Dockerfile`, `contrib/Dockerfile.manylinux`, `benchmark/nixlbench/contrib/Dockerfile`: mount `ghconfig` on the NIXL `meson setup` `RUN`. The later meson-python builds in the same Dockerfiles reuse the subprojects already downloaded into the source tree, and nixlbench's own subprojects are `[wrap-file]` tarballs, so these are the only `RUN`s that clone. - `.ci/jenkins/lib/build-wheel-matrix.yaml`: the `Build Wheel` step binds `svc-nixl-github-read-only-token`, writes `/tmp/ghconfig` with `write_github_gitconfig` (in a subshell, so sourcing `common.sh` does not change the build step's environment) and passes it as `--secret id=ghconfig,src=/tmp/ghconfig`, as `build-wheel-nightly-matrix.yaml` already does. - `.ci/docs/ci-overview.md`: cover the `meson setup` mounts and the wheel matrix in the authenticated-clones section. Not covered here: `nixl-ci-non-gpu`, `nixl-ci-gpu` and `nixl-ci-test-sanitizers` run `meson setup` directly in their containers rather than in an image build, so their `taskflow` and `prometheus-cpp` clones remain anonymous. Removing the configure-time clone is tracked separately. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Fixed dependency downloads for NIXL builds that require GitHub authentication, including wheel and benchmark image builds. * **Documentation** * Clarified which build jobs pass GitHub credentials and which dependencies are fetched during setup. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Signed-off-by: NirWolfer <nwolfer@nvidia.com>
`meson setup` clones the `taskflow` and `prometheus-cpp` `[wrap-git]` subprojects, plus prometheus-cpp's civetweb and googletest submodules, from github.com. The test pipelines run it through `.gitlab/build.sh` outside the image builds that #2310 and #2391 authenticate, so those clones are anonymous. When github.com answers an anonymous clone with an HTTP 401, `taskflow` fails `meson setup`, as in `nixl-ci-non-gpu` #3426 (PR #2378): ``` Cloning into 'taskflow'... fatal: could not read Username for 'https://github.com': No such device or address meson.build:233:16: ERROR: Git command failed: [... 'clone', '--depth', '1', '--branch', 'v3.10.0', 'https://github.com/taskflow/taskflow.git', 'taskflow'] ``` `prometheus-cpp` is optional, so the same failure on its clone drops the Prometheus telemetry exporter from the build instead. This happened on 2026-09-23 and 2026-09-28, and 15 `prometheusTelemetryTest` cases then failed because `libtelemetry_exporter_prometheus.so` was missing. Since `taskflow.wrap` became a `[wrap-git]` (#2121), the CI triage history shows these failures in `nixl-ci-non-gpu`, `-gpu`, `-dl-gpu-ep` and `-test-sanitizers`. This uses the same read-only token and `write_github_gitconfig` config file as #2310. Changes: - `.ci/jenkins/lib/build-matrix.yaml` (`nixl-ci-non-gpu`) and `test-sanitizer-matrix.yaml`: these run `build.sh` directly in the job container, so there is no image build to mount a secret into. The `Build` step binds `svc-nixl-github-read-only-token`, writes `/tmp/ghconfig` in a subshell, and exports `GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=include.path GIT_CONFIG_VALUE_0=/tmp/ghconfig`. Every git process the step starts inherits these variables, including meson's clones and their submodule fetches. `~/.gitconfig` is not written, and the variables carry only the file path. This needs git 2.31 or later; the CI images have 2.34 and 2.43. - `.ci/jenkins/lib/test-matrix.yaml`, `test-dl-matrix.yaml`, `test-vr-matrix.yaml` and `test-dl-ep-matrix.yaml`: the image-build step binds the token next to the Artifactory one, writes `/tmp/ghconfig` and passes `--secret id=ghconfig,src=/tmp/ghconfig` to `podman build`. - `.ci/dockerfiles/Dockerfile.gpu-test`: the `build.sh` `RUN` mounts the secret at its default `/run/secrets/ghconfig` (`mode=0444`, so the non-root build user can read it) and points `build.sh` at it with the same `GIT_CONFIG_*` variables. No home directory is involved, and the secret exists only for that `RUN`. - `.ci/docs/ci-overview.md`: add a section describing both paths. Without a token, or with an empty config, the clones stay anonymous as before. An invalid token fails them. Both wraps stay `[wrap-git]`. `prometheus-cpp` could later become a `[wrap-file]` using its uploaded `prometheus-cpp-with-submodules.tar.gz` release asset, but authentication already covers its clones. taskflow has no release asset, and its auto-generated GitHub archive changed hash once already, which is why #2121 switched it to `[wrap-git]`. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **CI Improvements** * Build and test pipelines can now authenticate when fetching GitHub-hosted Meson subprojects. When no credentials are configured, fetching continues without authentication. * GitHub access failures, including invalid credentials, are reported during the affected builds. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Signed-off-by: NirWolfer <nwolfer@nvidia.com>
What
The first
srun --container-image=...of a Slurm pipeline makes pyxis pull and unpack the whole CI image inside that test stage's own timeout. A slow registry or node then kills the stage before any test runs (nixl-ci-gpu-vrbuild 176: 15 min of pyxis import, exit 143).Fix
Add a
Sync Container Imagestep right after the allocation in every Slurm matrix:test,vr,dl,dl-ep,llm-containerandbuild-wheel.hostname,nvidia-smi -L,df -h /) with the samedockerImageandcontainerNamethe test steps use, so pyxis creates the named container once and later steps attach to it.no-gpu-visible), so a node withoutnvidia-smidoes not turn the pipeline red.Also documents the step in
.ci/docs/ci-overview.md.Testing
Not testable locally; the
slurmCImodule comes from ci-demo. The YAML parses and the step order was checked in all six matrices. Thenixl-ci-gpu-vrrun on this PR is the real check.Refs HPCINFRA-4925
Summary by CodeRabbit
CI Improvements
Documentation