Add Python 3.14 to the CI matrix - #131
Conversation
Windows gains 3.14 alongside 3.10 and 3.13. macOS and Linux gain it alongside 3.13 through the per-platform lists xmsconan 2.21.0 introduced; they need their own lists because 3.10 is Windows-only (the desktop products consume that wheel) and because each Linux entry needs a published conan-gcc13-py<version> container, which exists for 3.13 and 3.14 only. Verified before opting Linux in: ghcr.io/aquaveo/conan-gcc13-py3.14 is public and anonymously pullable -- the generated container: block has no credentials: stanza -- and really is 3.14 (Python 3.14.7, manylinux_2_28 base, gcc-toolset-13). [coverage].python_version is pinned to 3.13 rather than left to default. Coverage follows the highest linux_python_versions entry, so without the pin this change would also have moved the coverage gate 3.13 -> 3.14 as a side effect. Keeping it on a proven ABI means a 3.14 problem shows up in the build legs alone. Worth revisiting once 3.14 is proven across the suite. Workflows regenerated with xmsconan 2.21.0, which also bumps the pin from 2.18.0. Regenerating renames the mac and linux release assets and wheel artifacts to carry -py<version>, since those platforms now produce more than one ABI each and the old names would collide between legs. On a tagged release this publishes seven wheels instead of four: 3.10, 3.13 and 3.14 on Windows, and 3.13 plus 3.14 on both macOS and Linux. This is the first build of anything in the suite against 3.14, so the pybind layer compiling against the 3.14 C API is unproven until this CI run.
|
CI is green — all 15 legs, including every 3.14 leg on all three platforms: That answers the open risk in the description: the hand-written pybind glue compiles and its tests pass against the Python 3.14 C API, on MSVC, Clang and GCC. No C-API fallout. About the warning annotations on the runEvery job emits a Node.js 20 deprecation warning. These are pre-existing and not from this change — master's latest run emits the identical warning; a 15-job matrix just produces 15 copies of it instead of 8. GitHub is force-running the affected actions on Node 24, so nothing is broken. The pins are further behind than the warning suggests, though — That belongs in xmsconan, not here — it owns the templates, so one fix covers all eight repos. Audited and filed as Aquaveo/xmsconan#102, deliberately kept out of this PR: it touches every job in every template, and a bad major bump would break CI in all eight repos at once. |
First consumer of the per-platform Python fan-out from xmsconan #96, released as 2.21.0. xmscore is the pattern repo; the other seven follow once this is green.
The change
build.tomlonly:Workflows regenerated with
xmsconan_ciat 2.21.0. Everything else in the diff is generated output.Three lists rather than one because the constraints differ per platform: 3.10 exists for the desktop products' Windows wheel and nothing else needs it, and every Linux entry requires a published
conan-gcc13-py<version>container — which exists for 3.13 and 3.14 only, with no 3.10/3.11/3.12 image on either registry.Verified before opting Linux in
ghcr.io/aquaveo/conan-gcc13-py3.14is public and anonymously pullable, which matters because the generatedcontainer:block carries nocredentials:stanza. And it really is 3.14, checked by running it rather than reading its metadata:manylinux_2_28 base, gcc-toolset-13, built alongside the 3.13 image.
Two consequences worth knowing before merge
Release asset and wheel-artifact names change on mac and Linux. They now carry
-py<version>—linux-GCC13-Release-py3.13.tar.gzrather thanlinux-GCC13-Release.tar.gz. Unavoidable: those platforms now produce two ABIs each and the old names would have one leg overwrite the other. Windows already worked this way. If anything fetches those assets by exact name, it needs updating.A tagged release publishes seven wheels instead of four — 3.10/3.13/3.14 on Windows, 3.13/3.14 on macOS and Linux. Distinct
cp3XYtags, so they coexist under one devpi release rather than colliding. Wheel upload stays gated onrefs/tags/plusbuild_type == 'Release', so ordinary pushes and PRs still publish nothing.CI time and Conan storage roughly double. If that's not wanted yet, dropping the two
*_python_versionslines makes 3.14 Windows-only and is a one-line follow-up to widen later.Why coverage is pinned
Coverage resolves to the highest
linux_python_versionsentry, so leaving it default would have moved the coverage gate 3.13 → 3.14 as a side effect of a matrix change. Pinning to 3.13 keepsCoverage.yaml's only diff the xmsconan version bump, so a 3.14 problem surfaces in the build legs alone rather than in two places at once. Worth removing once 3.14 is proven across the suite.The actual risk
This is the first time anything in the suite compiles against 3.14. The Conan option permits it and pybind11 is at 3.0.1, which supports 3.14, but no build has happened. Python 3.14 removed C-API entry points, and xmscore has hand-written pybind glue —
python/misc/PyUtils.cpp, theListener/PublicProgressListenershims. If any of it touches a removed API, this CI run is where we find out, which is the point of doing xmscore first.Note the
linuxjob's status-check name changes (GCC-13 (Release, Linux)→GCC-13 (Release, 3.13, Linux)) because the legs now differ by ABI and GitHub uses an explicitname:verbatim.masterhas norequired_status_checksconfigured — only a one-approval review requirement — so nothing is blocked by the rename. Worth re-checking per repo as the rollout proceeds.