Skip to content

Migrate from pip to uv across all workflows - #60

Merged
JarbasAl merged 10 commits into
devfrom
migrate-to-uv
Jun 28, 2026
Merged

Migrate from pip to uv across all workflows#60
JarbasAl merged 10 commits into
devfrom
migrate-to-uv

Conversation

@JarbasAl

Copy link
Copy Markdown
Member

Replaces all pip install / python -m pip install / python -m build / pip freeze calls with the equivalent uv pip install / uv build / uv pip freeze commands, which resolve dependencies 10-100x faster.

Each workflow gets a pip install uv bootstrap step after Setup Python so the caller repos don't need any changes on their side.

Closes #!

- Add  bootstrap step after Setup Python in every workflow
- Replace  /  with
- Replace  with
- Replace  with pip @ file:///build/pip-26.1.2-py3-none-any.whl
- Remove  (uv manages itself)
- Update docs references (maintenance.md, release-flow.md, workflow-reference.md)

uv resolves dependencies 10-100x faster than pip, reducing CI cycle time.
@coderabbitai

coderabbitai Bot commented Jun 28, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@JarbasAl, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 1 minute and 47 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more credits in the billing tab to continue.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: cf1f77e3-2777-4180-82dc-10deabb74807

📥 Commits

Reviewing files that changed from the base of the PR and between 0c0499a and 4a1dbd5.

📒 Files selected for processing (28)
  • .github/workflows/_selftest-uv.yml
  • .github/workflows/build-tests.yml
  • .github/workflows/coverage-pages.yml
  • .github/workflows/coverage.yml
  • .github/workflows/docs-check.yml
  • .github/workflows/downstream-check.yml
  • .github/workflows/intent-case-tests.yml
  • .github/workflows/license-check.yml
  • .github/workflows/lint.yml
  • .github/workflows/locale-check.yml
  • .github/workflows/opm-check.yml
  • .github/workflows/ovoscope.yml
  • .github/workflows/pip-audit.yml
  • .github/workflows/publish-alpha.yml
  • .github/workflows/publish-stable.yml
  • .github/workflows/python-support.yml
  • .github/workflows/spec-lint.yml
  • .github/workflows/test.yml
  • .github/workflows/tts-intelligibility.yml
  • .github/workflows/type-check.yml
  • docs/maintenance.md
  • docs/release-flow.md
  • docs/workflow-reference.md
  • pyproject.toml
  • selftest_pkg/__init__.py
  • selftest_pkg/core.py
  • selftest_pkg/tests/__init__.py
  • selftest_pkg/tests/test_dummy.py
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch migrate-to-uv

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@JarbasAl
JarbasAl marked this pull request as ready for review June 28, 2026 16:02
JarbasAl and others added 9 commits June 28, 2026 17:12
…reter

uv pip refuses to install into a non-venv interpreter without --system /
UV_SYSTEM_PYTHON. actions/setup-python provides no active venv, so every
'uv pip install' step would fail on the runner. Declare UV_SYSTEM_PYTHON=1
at workflow level in each uv workflow.

Also correct locale-check's 'uv build' flags: --no-isolation/--outdir are
python-build flags; uv uses --no-build-isolation/--out-dir (silently masked
by continue-on-error, leaving SOURCES.txt ungenerated).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Validates the pip->uv migration inside this PR with no downstream consumers:
a runtime matrix (3.10-3.14) exercising every uv verb the migration uses
against a throwaway package, plus a static guard that every uv workflow
declares UV_SYSTEM_PYTHON. Delete before merging to dev.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds a throwaway root package (pyproject.toml + selftest_pkg/) so the uv
self-test invokes the actual build-tests/coverage/type-check/license-check/
pip-audit reusable workflows against an installable target, exercising
uv build + uv pip install/-e/freeze end to end across 3.10-3.14. All calls
use pr_comment:false and run on push to this branch only, so nothing posts
to PR #60. Remove with _selftest-uv.yml before merging to dev.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The called workflows' jobs declare pull-requests/contents/security-events
write; a caller granting only contents:read startup-fails at compile time.
Grant the union so the reusable calls compile (features stay disabled).
Both steps declared 'continue-on-error: true' twice. PyYAML keeps the last,
but GitHub Actions rejects duplicate mapping keys, so type-check.yml and
docs-check.yml fail to compile ('workflow file issue') on dev — breaking
every downstream caller of these reusable workflows. Pre-existing, unrelated
to the uv migration. Semantics unchanged (continue-on-error stays true).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@JarbasAl
JarbasAl merged commit ec6a29c into dev Jun 28, 2026
12 checks passed
@JarbasAl
JarbasAl deleted the migrate-to-uv branch June 28, 2026 16:39
JarbasAl added a commit that referenced this pull request Jun 28, 2026
* Replace pip with uv across all workflows and docs

- Add  bootstrap step after Setup Python in every workflow
- Replace  /  with
- Replace  with
- Replace  with pip @ file:///build/pip-26.1.2-py3-none-any.whl
- Remove  (uv manages itself)
- Update docs references (maintenance.md, release-flow.md, workflow-reference.md)

uv resolves dependencies 10-100x faster than pip, reducing CI cycle time.

* fix: set UV_SYSTEM_PYTHON so uv installs into the setup-python interpreter

uv pip refuses to install into a non-venv interpreter without --system /
UV_SYSTEM_PYTHON. actions/setup-python provides no active venv, so every
'uv pip install' step would fail on the runner. Declare UV_SYSTEM_PYTHON=1
at workflow level in each uv workflow.

Also correct locale-check's 'uv build' flags: --no-isolation/--outdir are
python-build flags; uv uses --no-build-isolation/--out-dir (silently masked
by continue-on-error, leaving SOURCES.txt ungenerated).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: add temporary uv-migration self-test harness

Validates the pip->uv migration inside this PR with no downstream consumers:
a runtime matrix (3.10-3.14) exercising every uv verb the migration uses
against a throwaway package, plus a static guard that every uv workflow
declares UV_SYSTEM_PYTHON. Delete before merging to dev.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: drive real reusable workflows with an in-repo dummy package

Adds a throwaway root package (pyproject.toml + selftest_pkg/) so the uv
self-test invokes the actual build-tests/coverage/type-check/license-check/
pip-audit reusable workflows against an installable target, exercising
uv build + uv pip install/-e/freeze end to end across 3.10-3.14. All calls
use pr_comment:false and run on push to this branch only, so nothing posts
to PR #60. Remove with _selftest-uv.yml before merging to dev.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: grant caller the union of reusable-workflow permissions

The called workflows' jobs declare pull-requests/contents/security-events
write; a caller granting only contents:read startup-fails at compile time.
Grant the union so the reusable calls compile (features stay disabled).

* test: bisect — call only build-tests to isolate startup failure

* test: bisect step 2 — add type-check + license-check

* test: bisect — type-check only (drop license-check)

* fix: remove duplicate continue-on-error key in type-check/docs-check

Both steps declared 'continue-on-error: true' twice. PyYAML keeps the last,
but GitHub Actions rejects duplicate mapping keys, so type-check.yml and
docs-check.yml fail to compile ('workflow file issue') on dev — breaking
every downstream caller of these reusable workflows. Pre-existing, unrelated
to the uv migration. Semantics unchanged (continue-on-error stays true).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: restore full self-test (all 5 reusable calls) after dup-key fix

* fix(uv): allow prereleases so OVOS alpha floor-pins resolve

The shared workflows moved to uv. uv's default prerelease mode only accepts a
prerelease when ALL of a package's versions are prereleases — so a TRANSITIVE
prerelease floor-pin against a package that also has a stable release fails, e.g.
ovos-PHAL[extras]'s ovos-phal-plugin-ipgeo>=0.1.9a1 (stable 0.1.7 coexists):

    Because only ovos-phal-plugin-ipgeo<0.1.9a1 is available and
    ovos-phal[extras]==0.2.16a1 depends on ovos-phal-plugin-ipgeo>=0.1.9a1,
    we can conclude that ovos-phal[extras]==0.2.16a1 cannot be used.

pip honoured these floor-pins implicitly; the OVOS ecosystem is built entirely on
pre-1.0 alphas and relies on that. Set UV_PRERELEASE=allow on every uv-based
reusable workflow to restore pip-parity. Version caps (<X.0.0) still bound
resolution, so this does not pull in unintended majors.

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

* feat(uv): make prerelease mode a workflow_call input (uv_prerelease)

Each reusable workflow now exposes a 'uv_prerelease' input (default 'allow') wired
to UV_PRERELEASE, so a caller can override it (e.g. 'disallow' to assert a repo
resolves on stables only, or 'if-necessary'). The all-alpha default keeps pip
parity out of the box. test.yml is gh-automations' own self-test (not workflow_call)
so it keeps the literal.

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

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
JarbasAl added a commit that referenced this pull request Aug 1, 2026
_selftest-uv.yml, the root pyproject.toml and selftest_pkg/ were the
pip->uv migration's validation harness (PR #60). Its own header says to
delete all three before merging to dev; they landed anyway and are the
only source of the repo's lingering red run history (Docs Check /
Type Check on the migrate-to-uv branch, 2026-06-27). No downstream
consumers.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
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.

1 participant