Repository navigation
test(e2e): define GPU validation image artifacts #1476
Description
Description
Define the driver-agnostic GPU validation image artifacts needed by GPU e2e tests.
Issue #1472 will add sandbox-side GPU execution validation. Those tests should consume prebuilt sandbox images rather than building validation images during the test run. This task defines the image contract, repository layout, and initial image artifacts that can validate the execution flow before a CUDA-specific reference image is enforced in GPU CI.
Context
Parent roadmap: #1444
Related GPU validation test issue: #1472
The validation image contract should stay independent of the compute driver. Docker is the first driver integration for #1472, but the same image contract should be usable later by Podman, Kubernetes, and VM-backed sandboxes.
The image base is not part of the contract. The important properties are that the image is usable directly as an OpenShell sandbox image, runs without network access inside the sandbox, and emits stable output that the e2e harness can assert.
Proposed Scope
Add GPU validation image specifications under a driver-neutral location:
e2e/gpu/
images/
smoke-pass/
README.md
Dockerfile
smoke-fail/
README.md
Dockerfile
cuda-basic/
README.md
Dockerfile
Start with simple fixture images to validate the basic sandbox execution flow:
smoke-pass: default command printsOPENSHELL_GPU_WORKLOAD_SUCCESSand exits0.smoke-fail: default command prints a stable diagnostic marker and exits non-zero.
These fixtures do not prove GPU functionality. They exist to validate image publishing, sandbox-image compatibility, and e2e assertion plumbing.
Define the first CUDA validation image contract separately in cuda-basic/. The CUDA image should eventually run a deterministic CUDA workload, emit OPENSHELL_GPU_WORKLOAD_SUCCESS on success, and return non-zero with useful diagnostics on failure.
Definition of Done
- Document the GPU validation image contract: default command, success marker, failure behavior, and stdout/stderr expectations.
- Add the driver-neutral
e2e/gpu/images/layout for validation image specs. - Add a simple always-pass fixture image that can run directly as an OpenShell sandbox image.
- Add a simple always-fail fixture image, or document why the pass fixture is sufficient for the initial flow validation.
- Define the initial
cuda-basicvalidation image requirements. - Document how validation images are built and published.
- Document how tests should reference published images by immutable tag or digest.
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsDone
Activity
elezar commentedon May 20, 2026
elezar commentedon May 20, 2026
Implementation Plan
Issue type:
featComplexity: Medium
Confidence: High — design agreed locally; CUDA static-link validation remains the main implementation detail
Summary
Define GPU workload image artifacts in this repository first so #1472 has concrete images to consume, while preserving an immediate follow-up migration path to
NVIDIA/OpenShell-Community. The PR will add smoke pass/fail images, a workingcuda-basicimage using CUDA 12.8 samples, a local Docker/Podman build task, an env manifest for built image refs, and documentation for local validation and future publishing.Scope
e2e/gpu/README.md: document the workload image contract, success/failure markers,/usr/local/bin/openshell-gpu-workload, direct container-engine validation,latest.env, and the planned OpenShell-Community migration.e2e/gpu/images/smoke-pass/: add a source directory forgpu-workload-smoke-pass, based onghcr.io/nvidia/openshell-community/sandboxes/base:latest, whose workload printsOPENSHELL_GPU_WORKLOAD_SUCCESSand exits0.e2e/gpu/images/smoke-fail/: add a source directory forgpu-workload-smoke-fail, based on the same community base image, whose workload printsOPENSHELL_GPU_WORKLOAD_FAILURE, emits a stable diagnostic, and exits non-zero.e2e/gpu/images/cuda-basic/: add a source directory forgpu-workload-cuda-basic. It builds CUDA 12.8deviceQueryandvectorAddsamples fromNVIDIA/cuda-samplestagv12.8, copies the binaries into the community base final image, and runs both through/usr/local/bin/openshell-gpu-workload.tasks/test.tomland a helper script undertasks/scripts/: addmise run e2e:gpu:images:build. Build all image directories containing aDockerfileby default. UseOPENSHELL_GPU_WORKLOAD_IMAGES=smoke-pass,smoke-failto select source directories.e2e/gpu/images/.build/latest.env: generate a shell-safe env file with the image refs that were just built. Do not addlatest.jsonin this first implementation.Implementation Decisions
smoke-pass,smoke-fail, andcuda-basic.gpu-workload-smoke-pass,gpu-workload-smoke-fail, andgpu-workload-cuda-basic.localhost/openshell/<image>:<tag>. The default tag is the source commit short SHA, with-dirtyappended for dirty local-tree builds.OPENSHELL_GPU_WORKLOAD_IMAGE_TAG=<tag>can override this for manual workflows.tasks/scripts/container-engine.shhelper and does not introduce another engine selector. Callers may set existingCONTAINER_ENGINE=docker|podman; unset follows the helper's current auto-detection. Consistency with the Rust e2e helper is tracked separately in fix(e2e): align container engine selection across helpers #1481.e2e/gpu/imagesonly. Add Git-ref source support when the image definitions migrate to OpenShell-Community.cuda-basicuses a CUDA 12.8basebuilder image plus explicit minimal build dependencies such asbuild-essential,cmake,curl,g++, andcuda-nvcc-12-8. Do not use a CUDAdevelimage by default.libcuda.so.1; those must come from host GPU runtime/CDI injection. CUDA compat libraries are the only acceptable future exception and should not be needed for CUDA 12.8.Implementation Steps
e2e/gpu/images/layout with SPDX headers, per-image READMEs, workload scripts, and Dockerfiles.smoke-passandsmoke-failon top ofghcr.io/nvidia/openshell-community/sandboxes/base:latest.cuda-basicas a multi-stage image: CUDA 12.8 base builder, pinned CUDA samplesv12.8, final OpenShell community base image, wrapper script that runsdeviceQuerythenvectorAdd.localhost/openshell/<image>:<short-sha>orlocalhost/openshell/<image>:<short-sha>-dirty, unlessOPENSHELL_GPU_WORKLOAD_IMAGE_TAGis set.e2e/gpu/images/.build/latest.envwithOPENSHELL_E2E_GPU_SMOKE_PASS_IMAGE,OPENSHELL_E2E_GPU_SMOKE_FAIL_IMAGE,OPENSHELL_E2E_GPU_CUDA_WORKLOAD_IMAGE, tag/source metadata, and the selected container engine.cuda-basic.Test Plan
mise run e2e:gpu:images:buildand verify that all selected images build andlatest.envidentifies the resulting image refs.cuda-basicdirectly with--device nvidia.com/gpu=alland verifydeviceQuery,vectorAdd, andOPENSHELL_GPU_WORKLOAD_SUCCESS.mise run pre-commit.Risks & Open Questions
cuda-basicfinal stage uses the OpenShell community base image, not a CUDA runtime image. The implementation must verify that the copied sample binaries run with static CUDA runtime linkage.sandbox createdoes not run OCI imageCMD; the contract must expose/usr/local/bin/openshell-gpu-workloadfor OpenShell e2e tests while still settingCMDfor direct container-engine validation./proc/<pid>/exe, or cross-label process inspection.Documentation Impact
e2e/gpu/.docs/are expected for this internal e2e artifact contract.Revision 2 — recorded implementation decisions from local design review
Revision 1 — initial plan
[-]test(e2e): define GPU workload image artifacts[/-][+]test(e2e): define GPU validation image artifacts[/+]elezar commentedon May 20, 2026
Implementation Complete
PR: #1484
What was built
Added local GPU workload image artifacts for smoke-pass, smoke-fail, and cuda-basic validation, plus a
mise run e2e:gpu:images:buildtask that discovers image directories, supports Docker or Podman, tags images with the source revision, and writes latest local refs.Tests
Docs updated
e2e/gpu/README.mde2e/gpu/images/*/README.mdThe issue will auto-close when the PR is merged.
test(e2e): add GPU workload image artifacts
test(e2e): add GPU workload image artifacts
github-actions commentedon Jun 14, 2026
This issue has had no activity for 14 days and is now marked stale. It may be closed in 7 days if there is no further activity. Comment or remove the state:stale label to keep it open.
test(e2e): add GPU workload image artifacts (#1484)