From e60909409060ba60d75b0af14d3f79432dd54744 Mon Sep 17 00:00:00 2001 From: Gage Larsen Date: Thu, 20 Aug 2026 12:17:55 -0600 Subject: [PATCH] Add Python 3.14 to the CI matrix 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 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, 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. --- .github/workflows/Coverage.yaml | 2 +- .github/workflows/XmsCore-CI.yaml | 27 ++++++++++++++------------- build.toml | 9 ++++++++- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/.github/workflows/Coverage.yaml b/.github/workflows/Coverage.yaml index 48e74338..519a079e 100644 --- a/.github/workflows/Coverage.yaml +++ b/.github/workflows/Coverage.yaml @@ -45,7 +45,7 @@ jobs: - name: Install Python Dependencies run: | pip install conan wheel "gcovr>=7,<9" - pip install --upgrade "xmsconan>=2.18.0" -i https://public.aquapi.aquaveo.com/aquaveo/dev/+simple + pip install --upgrade "xmsconan>=2.21.0" -i https://public.aquapi.aquaveo.com/aquaveo/dev/+simple - name: Setup Conan run: xmsconan_conan_setup --remote-url ${{ env.CONAN_REMOTE_URL }} --login diff --git a/.github/workflows/XmsCore-CI.yaml b/.github/workflows/XmsCore-CI.yaml index fd5a3ed7..c3048c10 100644 --- a/.github/workflows/XmsCore-CI.yaml +++ b/.github/workflows/XmsCore-CI.yaml @@ -42,7 +42,7 @@ jobs: run: | python -m pip install --upgrade pip pip install flake8 flake8-docstrings flake8-bugbear flake8-import-order pep8-naming - pip install --upgrade "xmsconan>=2.18.0" -i https://public.aquapi.aquaveo.com/aquaveo/dev/+simple + pip install --upgrade "xmsconan>=2.21.0" -i https://public.aquapi.aquaveo.com/aquaveo/dev/+simple # Generate .flake8 so CI lints with the same config developers use locally. # Do not inline the flake8 settings here: that duplicates .flake8.jinja and # the two copies drift apart silently. @@ -63,11 +63,11 @@ jobs: fail-fast: false matrix: platform: [macos-15] - python-version: ['3.13'] + python-version: ["3.13", "3.14"] build_type: [Release, Debug] env: - MATRIX_NAME: ${{ matrix.platform }}-Clang${{ matrix.compiler-version }}-${{ matrix.build_type }} + MATRIX_NAME: ${{ matrix.platform }}-Clang${{ matrix.compiler-version }}-${{ matrix.build_type }}-py${{ matrix.python-version }} # Library Variables LIBRARY_NAME: xmscore XMS_VERSION: '0.0.0' @@ -113,7 +113,7 @@ jobs: # package_id computation and silently detach builds from the binaries # already published to the remote. Bump this deliberately. pip install "conan~=2.31.0" devpi-client wheel - python -m pip install --upgrade "xmsconan>=2.18.0" -i https://public.aquapi.aquaveo.com/aquaveo/dev/+simple + python -m pip install --upgrade "xmsconan>=2.21.0" -i https://public.aquapi.aquaveo.com/aquaveo/dev/+simple # Setup Conan - name: Setup Conan run: xmsconan_conan_setup --remote-url ${{ env.CONAN_REMOTE_URL }} --login --remove-conancenter @@ -164,7 +164,7 @@ jobs: - name: Upload wheel artifact uses: actions/upload-artifact@v4 with: - name: wheel-${{ runner.os }} + name: wheel-${{ runner.os }}-py${{ matrix.python-version }} path: wheelhouse/*.whl if: matrix.build_type == 'Release' # Upload wheel to Aquapi @@ -205,19 +205,20 @@ jobs: # LINUX # ---------------------------------------------------------------------------------------------- linux: - name: GCC-13 (${{ matrix.build_type }}, Linux) + name: GCC-13 (${{ matrix.build_type }}, ${{ matrix.python-version }}, Linux) runs-on: ubuntu-latest container: - image: ghcr.io/aquaveo/conan-gcc13-py3.13:latest + image: ghcr.io/aquaveo/conan-gcc13-py${{ matrix.python-version }}:latest strategy: fail-fast: false matrix: build_type: [Release, Debug] + python-version: ["3.13", "3.14"] env: - MATRIX_NAME: linux-GCC13-${{ matrix.build_type }} + MATRIX_NAME: linux-GCC13-${{ matrix.build_type }}-py${{ matrix.python-version }} # Library Variables LIBRARY_NAME: xmscore XMS_VERSION: '0.0.0' @@ -235,7 +236,7 @@ jobs: AQUAPI_PASSWORD: ${{ secrets.AQUAPI_PASSWORD_SECRET }} AQUAPI_URL: ${{ secrets.AQUAPI_URL_DEV }} # Python Variables - PYTHON_TARGET_VERSION: '3.13' + PYTHON_TARGET_VERSION: ${{ matrix.python-version }} RELEASE_PYTHON: 'False' CTEST_PARALLEL_LEVEL: '8' @@ -250,7 +251,7 @@ jobs: # package_id computation and silently detach builds from the binaries # already published to the remote. Bump this deliberately. pip install "conan~=2.31.0" devpi-client wheel - pip install --upgrade "xmsconan>=2.18.0" -i https://public.aquapi.aquaveo.com/aquaveo/dev/+simple + pip install --upgrade "xmsconan>=2.21.0" -i https://public.aquapi.aquaveo.com/aquaveo/dev/+simple # Setup Conan - name: Setup Conan run: xmsconan_conan_setup --remote-url ${{ env.CONAN_REMOTE_URL }} --login @@ -301,7 +302,7 @@ jobs: - name: Upload wheel artifact uses: actions/upload-artifact@v4 with: - name: wheel-${{ runner.os }} + name: wheel-${{ runner.os }}-py${{ matrix.python-version }} path: wheelhouse/*.whl if: matrix.build_type == 'Release' # Upload wheel to Aquapi @@ -349,7 +350,7 @@ jobs: fail-fast: false matrix: platform: [windows-2022] - python-version: ["3.10", "3.13"] + python-version: ["3.10", "3.13", "3.14"] compiler-version: [17] build_type: [Release, Debug] @@ -398,7 +399,7 @@ jobs: # package_id computation and silently detach builds from the binaries # already published to the remote. Bump this deliberately. pip install "conan~=2.31.0" devpi-client wheel - python -m pip install --upgrade "xmsconan>=2.18.0" -i https://public.aquapi.aquaveo.com/aquaveo/dev/+simple + python -m pip install --upgrade "xmsconan>=2.21.0" -i https://public.aquapi.aquaveo.com/aquaveo/dev/+simple # Setup Visual Studio - name: Setup Visual Studio uses: microsoft/setup-msbuild@v2 diff --git a/build.toml b/build.toml index 1ed66725..ac0bd24a 100644 --- a/build.toml +++ b/build.toml @@ -103,9 +103,16 @@ pybind_headers = [ ] [ci] -python_versions = ["3.10", "3.13"] +python_versions = ["3.10", "3.13", "3.14"] +mac_python_versions = ["3.13", "3.14"] +linux_python_versions = ["3.13", "3.14"] coverage = true [coverage] +# Pinned so adding 3.14 to the build matrix does not also move the coverage +# gate. Coverage otherwise follows the highest [ci].linux_python_versions +# entry, which would have shifted it 3.13 -> 3.14 as a side effect of this +# change. Revisit once 3.14 is proven across the suite. +python_version = "3.13" cpp_threshold = 0 python_threshold = 0