PLT-1623 ci(maturin): publish python 3.14 wheels and fix release race - #15
Merged
Conversation
PLT-1623 Workforce cannot resolve vrp-cli on Python 3.14. The index only carries cp312 and cp313 wheels, so `uv lock --python 3.14` fails. Workforce resolves from the s3pypi index, which publishes filenames and hashes only and no requires-python, so selection happens purely on the wheel tag. Add a 3.14 interpreter to both build jobs. pyo3 0.25.1 already supports 3.14, so no dependency bump is needed. The manylinux2014 image already ships cp314, which is why the linux job needs no other change. Also fix the release itself. The workflow triggered on both `push` and `release`, so publishing a release started two concurrent runs that uploaded the same asset names. Both v1.25.4 runs failed this way, which is why the gh-pages index is stale at 1.25.3. Restrict `push` to branches, gate publishing on the release event, and add a concurrency group. Manual publishing stays available, but only from a tag, because action-gh-release falls back to github.ref and a branch dispatch would create a release named after the branch. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PLT-1623 Cuts the release that carries the first cp314 wheels. Workforce must move its pin from vrp-cli==1.25.4 to ==1.25.5. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
Motivation
vrp-cliis the hard blocker for the Workforce 3.13 -> 3.14 upgrade (PLT-1623).uv lock --python 3.14fails because the index has no wheel with a matching tag:Worth recording, because it is not obvious: Workforce resolves from the s3pypi index at
pypi.deployments.onuptick.com, which publishes filenames and sha256 only and carries nodata-requires-python. Selection is therefore purely on the wheel tag. Thedata-requires-pythonvalues written into the gh-pages index are on a separate path that nothing consumes.While confirming that, I found the release itself is broken. The workflow triggered on both
pushandrelease, so publishing a release started two concurrent runs that both uploaded the same asset names to the same release. Both v1.25.4 runs failed on that race (Not Found - update-a-release-assetandError creating policy). Thepypi-publishjob is separate and still succeeded, which is why 1.25.4 wheels exist on s3pypi while the GitHub upload failed and the gh-pages index has been stale at 1.25.3 ever since. That would have broken this release too.Changes
Build 3.14 wheels — added a
setup-python3.14 step to the linux and macos jobs and extended both build args to-i 3.12 -i 3.13 -i 3.14. No pyo3 bump is needed: 0.25.1 already supports 3.14, and themanylinux2014image already shipscp314.Fix the release race —
pushis now limited tobranches: ["**"]so a tag push no longer starts a duplicate run, both publish jobs are gated on the release event, and a concurrency group cancels superseded branch builds without ever cancelling a release.Manual publishing — still available via
workflow_dispatch, but only from a tag.action-gh-releasefalls back togithub.ref, so a dispatch frommasterwould otherwise create a release namedmaster.Version — bumped to 1.25.5.
The gh-pages index parser is unchanged. It reads
cp314and writes==3.14, which is correct for per-interpreter wheels.Test plan
Everything below was run locally, not assumed.
vrp_cli-1.25.5-cp312,-cp313and-cp314-cp314-macosx_11_0_arm64wheels.quay.io/pypa/manylinux2014_x86_64container with the same args. maturin reportedFound CPython 3.12, CPython 3.13, CPython 3.14and compiled once per interpreter.cp314wheel on Python 3.14.3 and calledget_routing_locations. It returns correctly.solve_pragmatic(**kwargs). Keyword binding works and a bad payload raisesOSError, which is whatabas/utils/scheduling/vrp_cli/service.pywraps intoVrpException.python-version: "3.14"resolves on the pinnedsetup-pythonv4.9.1, whose manifest lists 3.14.4 through 3.14.7.Pushing this branch runs the build jobs without publishing, so CI is the final check on the 3.14 build before the release is cut.
Follow-up
Workforce must move its pin from
vrp-cli==1.25.4to==1.25.5inpyproject.toml. That belongs on the Workforce side of PLT-1623.This keeps the existing per-interpreter approach, so 3.15 will need the same two-line change again. A single
abi3-py312wheel would end that permanently, and I verified one runs on 3.12, 3.13 and 3.14 with the current pyo3. Deliberately out of scope here.