CI and the release gate: uv is installed unpinned, and one Python of the three declared is tested #14
Labels
No labels
bug
documentation
enhancement
performance
security
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo-imap#14
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found on 2026-09-29 in a read-only review of postulo-imap at
cc09c6381, comparing its workflows with the core's.Both workflows install whatever uv is newest on the day they run, which the core stopped doing in postulo/postulo#233, and both run the tests on Python 3.14 only although the package declares
>=3.12. A uv release can therefore turn this repository red, or change whatuv sync --lockedinstalls, with no commit here; and nothing shows the plugin works on the two older Pythons the core supports and tests.Related to postulo/postulo#233 (closed), which pinned uv in the core's workflows, pre-commit configuration and Dockerfile, and did not reach the plugin repositories.
.forgejo/workflows/ci.yml:45-48and.forgejo/workflows/release.yml:38-41:curl -LsSf https://astral.sh/uv/install.sh | sh, the unversioned installer..forgejo/workflows/ci.yml:53and.forgejo/workflows/release.yml:44:uv sync --locked --python 3.14, the only interpreter either workflow uses.pyproject.toml:6:requires-python = ">=3.12"..forgejo/workflows/ci.ymlnamesUV_VERSION: "0.12.17"once, installshttps://astral.sh/uv/${UV_VERSION}/install.sh, and says why: "a lock file read by an unpinned tool is pinned only in name (#233)". Here the comment aboveuv sync --lockedmakes the same argument about the lock ("a resolution nobody reviewed") while the tool reading the lock is not chosen by anybody. When uv changes its lock revision or how it judges a lock stale, the core's CI is unaffected and this repository's CI and release gate pass or fail on a version no commit named. Separately, the core's test job runs a matrix of 3.12, 3.13 and 3.14; a plugin is installed into the core's environment, so a person running Postulo on 3.12 installs a plugin that was never run there.env: UV_VERSIONto both workflows with the version the core names, install the versioned installer, and note that it is bumped together with the core's. Add 3.12 and 3.13 legs to thetestjob (a matrix on--python, as in the core), or raiserequires-pythonto what is tested. The same unversioned line is in the workflows of postulo-apprise, postulo-dav, postulo-helloworld, postulo-mcp and postulo-paperless, and the same single--python 3.14in all of those but postulo-mcp; they are best changed together.Done when
grep -rn "astral.sh/uv/install.sh" .forgejo/finds nothing, and both workflows install the uv version the core'sUV_VERSIONnames.testjob in.forgejo/workflows/ci.ymlruns on every Python thatrequires-pythonadmits, orrequires-pythonadmits only what the job runs.install.shwith no version and no checksum; the core fixed this in #790 #20