Skip to content

build: lock jupyterlab images with uv.lock and pin base image digests - #83

Open
galenlynch wants to merge 5 commits into
ci/image-smoke-testsfrom
build/uv-lockfiles
Open

galenlynch wants to merge 5 commits into
ci/image-smoke-testsfrom
build/uv-lockfiles

Conversation

@galenlynch

Copy link
Copy Markdown
Member

Locks the four JupyterLab images so a rebuild reproduces the whole environment, and moves their updates to monthly Dependabot PRs that CI tests. Stacked on #82.

  • pyproject.toml lists each image's direct dependencies as lower bounds. uv.lock pins the full tree with hashes. Conda installs only Python.
  • Every FROM is pinned by digest, and base images come from nvcr.io and quay.io to avoid Docker Hub's anonymous rate limit.
  • Dependabot runs monthly for these images: minor and patch updates are grouped, and each major gets its own PR. CI runs uv lock --check.

Installed packages match the current images, except that overrides and typing-utils are gone, since PyPI's JupyterLab doesn't need them.

Only the frameworks were pinned, so rebuilds picked up new transitive
packages, JupyterLab, and whatever upstream had pushed under the same
base image tags. Each image now lists its direct dependencies in
pyproject.toml as lower bounds and installs the full uv.lock with hashes
into the conda environment, with conda providing only the interpreter;
every FROM pins its digest.

Dependabot updates the locks through the uv ecosystem, raising the lower
bounds as it goes. Minor and patch updates are grouped into one PR and
each major arrives as its own, so routine updates can merge on green CI
while a major gets a separate decision. CI runs uv lock --check so a lock
that no longer matches pyproject.toml fails the PR. apt packages stay
unpinned since Ubuntu drops superseded versions.
Code Ocean images are registered about quarterly, so weekly runs mostly spend CI on updates no capsule sees. Monthly runs still keep each release to a few small tested steps; security updates do not follow the schedule. Entries for other owners' images are unchanged pending their agreement.
Docker Hub rate-limits anonymous pulls, and a PR run that builds several images at once from shared runner IPs hit the limit. NVIDIA and conda-forge publish the same images on their own registries (identical per-platform digests), which CI and Dependabot can pull anonymously without that limit.
@galenlynch
galenlynch requested review from a team and tmchartrand as code owners October 9, 2026 21:44
@galenlynch
galenlynch requested review from jtyoung84 and removed request for a team October 9, 2026 21:44
astral-sh/setup-uv publishes no floating major tag, so @v10 failed to resolve and every test job failed at setup.
@galenlynch
galenlynch changed the base branch from main to ci/image-smoke-tests October 9, 2026 22:33
@galenlynch galenlynch closed this Oct 9, 2026
@galenlynch galenlynch reopened this Oct 9, 2026

@tmchartrand tmchartrand left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

looks good, just not sure on the question of policy raised below

Comment thread CONTRIBUTING.md Outdated
A lock makes a commit-tagged image rebuildable and keeps transitive updates in
their own PRs, but it costs each owner a build stage, an export step and a
refresh workflow. Exact pins on direct dependencies are the minimum.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants