From 3f11d65738ca1903cb6d7086312dcc8d5d8c2334 Mon Sep 17 00:00:00 2001 From: Vlada Dusek Date: Tue, 13 Oct 2026 10:19:11 +0200 Subject: [PATCH 1/2] feat: add support for Python 3.15 --- .github/actions/version-matrix/src/shared/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/version-matrix/src/shared/constants.ts b/.github/actions/version-matrix/src/shared/constants.ts index 06c8f4f49..e4c08c951 100644 --- a/.github/actions/version-matrix/src/shared/constants.ts +++ b/.github/actions/version-matrix/src/shared/constants.ts @@ -1,6 +1,6 @@ import { appendFile } from 'node:fs/promises'; -export const supportedPythonVersions = ['3.10', '3.11', '3.12', '3.13', '3.14']; +export const supportedPythonVersions = ['3.10', '3.11', '3.12', '3.13', '3.14', '3.15']; export const supportedNodeVersions = ['22', '24', '26']; From 45072e5d5c2d63b8de6c8fb8b9edc6d8be9278cd Mon Sep 17 00:00:00 2001 From: Vlada Dusek Date: Tue, 13 Oct 2026 10:53:45 +0200 Subject: [PATCH 2/2] fix: skip the camoufox image on Python 3.15 --- .../version-matrix/src/matrices/python/playwright.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/actions/version-matrix/src/matrices/python/playwright.ts b/.github/actions/version-matrix/src/matrices/python/playwright.ts index 4b1b7b8a3..67a75f54f 100644 --- a/.github/actions/version-matrix/src/matrices/python/playwright.ts +++ b/.github/actions/version-matrix/src/matrices/python/playwright.ts @@ -93,6 +93,10 @@ const imageNames = [ // Images that require Chrome/Chromium cannot be built for arm64 on Linux const arm64UnsupportedImages: ReadonlySet = new Set(['python-playwright', 'python-playwright-chrome']); +// Python versions the camoufox image is not built for. Camoufox depends on `zstandard` and `pyyaml`, which publish no +// wheels for these versions, and the slim base image has no compiler to build them from source. +const camoufoxUnsupportedPythonVersions: ReadonlySet = new Set(['3.15']); + const matrix = { include: [] as { 'image-name': (typeof imageNames)[number]; @@ -113,6 +117,10 @@ for (const pythonVersion of supportedPythonVersions) { for (const imageName of imageNames) { const isCamoufoxImage = imageName === 'python-playwright-camoufox'; + if (isCamoufoxImage && camoufoxUnsupportedPythonVersions.has(pythonVersion)) { + continue; + } + // The camoufox image only supports a subset of the Playwright versions, so it gets its own version list, along // with its own "latest" version - otherwise it would never receive the moving tags (e.g. `:3.14`, `:latest`). const imagePlaywrightVersions = isCamoufoxImage ? camoufoxPlaywrightVersions : latestFivePlaywrightVersions;