[Stack 3/17] Speed up CI: replace pip with uv pip in Dockerfile (~2x faster installs)#2510
Open
jucor wants to merge 1 commit intospr/edge/d39cf65dfrom
Open
[Stack 3/17] Speed up CI: replace pip with uv pip in Dockerfile (~2x faster installs)#2510jucor wants to merge 1 commit intospr/edge/d39cf65dfrom
jucor wants to merge 1 commit intospr/edge/d39cf65dfrom
Conversation
This was referenced Mar 30, 2026
Open
Open
e4353af to
6fd489f
Compare
## Summary Replace `pip install` with `uv pip install` in the delphi Dockerfile for faster dependency installation. `uv pip` is a drop-in replacement — same `requirements.lock`, same `pyproject.toml`, same installed packages in `site-packages`. ### Changes - **`delphi/Dockerfile`**: - Copy `uv` binary from `ghcr.io/astral-sh/uv:0.11.2` (pinned version, single static binary) - Place in `/opt/uv/` in builder to avoid leaking into production image via `COPY --from=builder /usr/local/bin` - Set `UV_SYSTEM_PYTHON=1` (install into system Python, not a venv) - Replace all `pip install` with `uv pip install` in builder and test stages - Update BuildKit cache mount targets from `/root/.cache/pip` to `/root/.cache/uv` - Test stage copies `uv` from builder (single source of truth) ### What's NOT changed - **Makefile** — untouched, `make rebuild-delphi` works as before - **docker-compose.yml / docker-compose.test.yml** — untouched - **pyproject.toml / requirements.lock** — untouched, same format - **pip-compile workflow** — untouched, still used for lock file generation - **Final/production image** — no `uv` added, stays lean ### CI Benchmark (GitHub Actions, `ubuntu-latest`, `--no-cache`) 5 pip runs (Mar 27 stack push) vs 3 uv pip runs (this PR): | Step | pip (n=5) | uv pip (n=3) | Speedup | |------|-----------|--------------|---------| | **Docker build** | **264s** (sd=6) | **169s** (sd=2) | **1.56x (-94s)** | | Pytest run | 223s (sd=4) | 227s (sd=4) | ~same | **~94 seconds saved per CI run** on the Docker build step. Pytest runtime is unchanged (same packages, same tests). Low variance in both groups confirms this is a real improvement, not noise. ### Local Benchmark (Apple M1 Max, 64GB, Docker Desktop, `--no-cache`) | Step | pip | uv pip | Speedup | |------|-----|--------|---------| | **Dependencies install** | **149.3s** | **80.4s** | **1.9x** | | Dev deps install | 10.0s | 2.2s | **4.5x** | ## Test plan - [x] `docker compose -f docker-compose.test.yml build --no-cache delphi` succeeds locally - [x] Built image has all expected packages (`pip show` diagnostic passes in build log) - [x] CI passes (3 successful runs) - [x] `make rebuild-delphi` works (Makefile untouched) ## Squashed commits - Speed up CI by using `uv pip` instead of `pip` commit-id:0c448343
6fd489f to
f00accb
Compare
Delphi Coverage Report
|
Contributor
There was a problem hiding this comment.
Pull request overview
Updates the Delphi Docker build to use uv pip instead of pip install to reduce CI Docker build time while keeping the same lockfile-driven dependency set and leaving the production image lean.
Changes:
- Add
uv(pinned tag) to the builder stage and switch dependency installs touv pip install. - Update BuildKit cache mounts from pip’s cache directory to uv’s cache directory.
- Reuse the builder’s
uvbinary in the test stage to install dev dependencies more quickly.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| @@ -54,8 +61,8 @@ RUN --mount=type=cache,target=/root/.cache/pip \ | |||
|
|
|||
| # Install the project package (without dependencies - they're already installed) | |||
| # This registers entry points and installs the package in development mode | |||
There was a problem hiding this comment.
The comment above this step says the package is installed "in development mode", but uv pip install --no-deps . performs a standard (non-editable) install, same as pip install .. Either update the comment to avoid implying an editable/develop install, or switch to an editable install if that’s actually intended.
Suggested change
| # This registers entry points and installs the package in development mode | |
| # This registers entry points and installs the package without re-installing dependencies |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Replace
pip installwithuv pip installin the delphi Dockerfile for faster dependency installation.uv pipis a drop-in replacement — samerequirements.lock, samepyproject.toml, same installed packages insite-packages.Changes
delphi/Dockerfile:uvbinary fromghcr.io/astral-sh/uv:0.11.2(pinned version, single static binary)/opt/uv/in builder to avoid leaking into production image viaCOPY --from=builder /usr/local/binUV_SYSTEM_PYTHON=1(install into system Python, not a venv)pip installwithuv pip installin builder and test stages/root/.cache/pipto/root/.cache/uvuvfrom builder (single source of truth)What's NOT changed
make rebuild-delphiworks as beforeuvadded, stays leanCI Benchmark (GitHub Actions,
ubuntu-latest,--no-cache)5 pip runs (Mar 27 stack push) vs 3 uv pip runs (this PR):
~94 seconds saved per CI run on the Docker build step. Pytest runtime is unchanged (same packages, same tests). Low variance in both groups confirms this is a real improvement, not noise.
Local Benchmark (Apple M1 Max, 64GB, Docker Desktop,
--no-cache)Test plan
docker compose -f docker-compose.test.yml build --no-cache delphisucceeds locallypip showdiagnostic passes in build log)make rebuild-delphiworks (Makefile untouched)Squashed commits
uv pipinstead ofpipcommit-id:0c448343
Stack: