From db77bd4f97306a2c4a5a68a52551a447d6ae767a Mon Sep 17 00:00:00 2001 From: Roland Date: Thu, 30 Jul 2026 18:04:09 -0600 Subject: [PATCH] ci: test on Python 3.13, the version every deployment actually runs CI has been testing 3.11 while nothing ships it. docker/api/Dockerfile and docker/help/Dockerfile are python:3.13-trixie, docker/controller is python:3.13-slim-trixie, Trixie's system interpreter is 3.13, and Debian 12 -- the last place 3.11 was current -- is pinned to the debian12-final tag and takes no new code. So every Python job here exercised an interpreter no user has. All four CircleCI Python jobs and the GitHub Actions controller job move to 3.13. The cache key goes with them: it stores the whole venv, so restoring a deps-3.11 venv into a 3.13 container would hand it an interpreter that no longer exists. The disabled api-tests-3-12 job is deleted rather than repointed. It was switched off with the note "Sanic does not yet support 3.12", which 3.13 disproves, and carrying a second version around is what let this drift open in the first place. Verified on 3.13.12 / pytest 9.0.3 before changing anything: the backend suite passes (1709 passed, 5 skipped), alembic upgrade runs and `db check` reports no new operations, and the controller suite passes bar two docker-mode dashboard tests that fail identically on 3.11 here -- pre-existing and environment-dependent, not a 3.13 regression. `sanic-api-start` is the one job I could not verify locally: wrolpi/api_utils.py sets `Sanic.start_method = "fork"` and macOS has defaulted to spawn since 3.8, so that job fails here on any Python version. Linux CI is unaffected -- fork is still the default there on 3.13 -- and the test suite already runs the Sanic app in-process, which is the substantive check. Worth knowing that 3.14 changes the Linux default away from fork, so that line has a deadline on it. Co-Authored-By: Claude Opus 5 (1M context) --- .circleci/config.yml | 47 +++++++------------------- .github/workflows/controller-tests.yml | 3 +- 2 files changed, 14 insertions(+), 36 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f90f9aa6..33b210a2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,9 +5,9 @@ version: 2.1 # Define a job to be invoked later in a workflow. # See: https://circleci.com/docs/2.0/configuration-reference/#jobs jobs: - api-tests-3-11: + api-tests-3-13: docker: - - image: cimg/python:3.11 + - image: cimg/python:3.13 # `large` (4 vCPU, 8 GB) so pytest-xdist's `-nauto` has room to scale. resource_class: large steps: @@ -15,7 +15,7 @@ jobs: - run: sudo apt-get update - run: sudo apt-get install -y ffmpeg catdoc - restore_cache: - key: deps-3.11-{{ checksum "requirements.txt" }}-5 + key: deps-3.13-{{ checksum "requirements.txt" }}-5 - run: name: Install Requirements command: | @@ -23,7 +23,7 @@ jobs: . venv/bin/activate pip install -r requirements.txt - save_cache: - key: deps-3.11-{{ checksum "requirements.txt" }}-5 + key: deps-3.13-{{ checksum "requirements.txt" }}-5 paths: - "venv" # `-nauto` parallelizes across all available cores via pytest-xdist. @@ -35,7 +35,7 @@ jobs: path: test-results.xml # Do the API and the frontend's test fixtures still agree? # - # `api-tests-3-11` runs these too, as part of the whole suite. This job exists for the + # `api-tests-3-13` runs these too, as part of the whole suite. This job exists for the # signal: fixture drift is silent by nature -- the frontend suite passes against a body the # API stopped sending -- so it is worth a check whose name says what broke, failing in under a # minute rather than somewhere inside seventeen hundred results. @@ -44,12 +44,12 @@ jobs: # Python jobs, so it costs a venv restore and one test file. api-contract-tests: docker: - - image: cimg/python:3.11 + - image: cimg/python:3.13 resource_class: medium steps: - checkout - restore_cache: - key: deps-3.11-{{ checksum "requirements.txt" }}-5 + key: deps-3.13-{{ checksum "requirements.txt" }}-5 - run: name: Install Requirements command: | @@ -62,12 +62,12 @@ jobs: api-alembic-migrations: docker: - - image: cimg/python:3.11 + - image: cimg/python:3.13 resource_class: medium steps: - checkout - restore_cache: - key: deps-3.11-{{ checksum "requirements.txt" }}-5 + key: deps-3.13-{{ checksum "requirements.txt" }}-5 - run: name: Install Requirements command: | @@ -83,35 +83,13 @@ jobs: - run: name: Check for Missing Migrations command: MEDIA_DIRECTORY=/tmp/wrolpi-media ./venv/bin/python ./main.py db check - api-tests-3-12: - docker: - - image: cimg/python:3.12 - resource_class: large - steps: - - checkout - - run: sudo apt-get update - - run: sudo apt-get install -y ffmpeg catdoc - - restore_cache: - key: deps-3.12-{{ checksum "requirements.txt" }}-5 - - run: - name: Install Requirements - command: | - python3 -m venv venv - . venv/bin/activate - pip install -r requirements.txt - - save_cache: - key: deps-3.12-{{ checksum "requirements.txt" }}-5 - paths: - - "venv" - - run: - command: './venv/bin/pytest -nauto' sanic-api-start: docker: - - image: cimg/python:3.11 + - image: cimg/python:3.13 steps: - checkout - restore_cache: - key: deps-3.11-{{ checksum "requirements.txt" }}-5 + key: deps-3.13-{{ checksum "requirements.txt" }}-5 - run: name: Install dependencies command: | @@ -206,10 +184,9 @@ workflows: wrolpi-api-tests: jobs: - sanic-api-start - - api-tests-3-11 + - api-tests-3-13 - api-contract-tests - api-alembic-migrations - # - api-tests-3-12 Sanic does not yet support 3.12. wrolpi-app-test: jobs: - react-app-start diff --git a/.github/workflows/controller-tests.yml b/.github/workflows/controller-tests.yml index d4dfa60d..21739c62 100644 --- a/.github/workflows/controller-tests.yml +++ b/.github/workflows/controller-tests.yml @@ -21,7 +21,8 @@ jobs: - name: Setup Python uses: actions/setup-python@v5 with: - python-version: '3.11' + # Trixie ships 3.13, and docker/controller/Dockerfile is python:3.13-slim-trixie. + python-version: '3.13' cache: 'pip' cache-dependency-path: controller/requirements.txt