Skip to content

fix: support Python 3.15 in the slim Docker image - #557

Merged
zkoppert merged 2 commits into
mainfrom
dependabot/docker/dependencies-ad7ad3a871
Nov 2, 2026
Merged

zkoppert merged 2 commits into
mainfrom
dependabot/docker/dependencies-ad7ad3a871

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Intent

Fix the failing CI on github-community-projects/contributors PR #557, which upgrades the Docker base image to Python 3.15. Preserve the slim runtime image while making dependencies without Python 3.15 wheels build successfully. Once CI passes, approve and merge the existing Dependabot pull request.

What Changed

  • I upgraded the digest-pinned slim base image from Python 3.14.8 to 3.15.0.
  • I moved dependency installation into a builder stage with pinned gcc, libc6-dev, and libffi-dev packages for dependencies without Python 3.15 wheels.
  • I copied the built virtual environment into the slim runtime image, keeping the compiler and development headers out of the runtime.

Risk Assessment

✅ Low: The well-bounded multi-stage Docker change installs the required C build toolchain before dependency synchronization while retaining a Python slim final image without build dependencies.

Testing

After resolving local builder setup, reproduced the pre-fix compiler failure, rebuilt the target using archive and normal Docker contexts, verified offline native-library operation without compiler tooling, and exercised PAT/App report generation against an isolated API; retained build logs, runtime checks, API traces, and generated reports demonstrate that all targeted scenarios passed.

  • Live validation: ✅ go - 4 of 4 scenarios driven live against the product
Scenario Result Live Evidence
Build the Python 3.15 image when a dependency has no compatible wheel ✅ pass live Pre-fix compiler-failure reproduction; Python 3.15 image build
Start the slim runtime offline and use native dependencies without compiler tools ✅ pass live Offline native-runtime and compiler-exclusion checks; Final runtime image metadata
Run the action with a PAT and receive correct contributor reports ✅ pass live PAT and GitHub App end-to-end transcript; PAT-generated contributor report; Isolated API authentication trace
Run the action with GitHub App credentials and receive correct contributor reports ✅ pass live PAT and GitHub App end-to-end transcript; GitHub App-generated contributor data; GitHub App-generated job summary; Isolated API authentication trace
Evidence: Pre-fix compiler-failure reproduction
#0 building with "default" instance using docker driver

#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 1.86kB 0.0s done
#1 DONE 0.0s

#2 [internal] load metadata for ghcr.io/astral-sh/uv:0.10.9@sha256:10902f58a1606787602f303954cea099626a4adb02acbac4c69920fe9d278f82
#2 DONE 0.0s

#3 [internal] load metadata for docker.io/library/python:3.15.0-slim@sha256:f5b92f2a669a4c347044f29367f31983280b648250ca94dea66f98c53bc87e58
#3 DONE 0.9s

#4 [internal] load .dockerignore
#4 transferring context: 356B 0.0s done
#4 DONE 0.1s

#5 [stage-0 1/5] FROM docker.io/library/python:3.15.0-slim@sha256:f5b92f2a669a4c347044f29367f31983280b648250ca94dea66f98c53bc87e58
#5 DONE 0.0s

#6 FROM ghcr.io/astral-sh/uv:0.10.9@sha256:10902f58a1606787602f303954cea099626a4adb02acbac4c69920fe9d278f82
#6 CACHED

#7 [stage-0 2/5] WORKDIR /action/workspace
#7 CACHED

#8 [internal] load build context
#8 transferring context: 257.71kB 0.0s done
#8 DONE 0.0s

#9 [stage-0 3/5] COPY pyproject.toml uv.lock *.py /action/workspace/
#9 DONE 0.0s

#10 [stage-0 4/5] COPY --from=ghcr.io/astral-sh/uv:0.10.9@sha256:10902f58a1606787602f303954cea099626a4adb02acbac4c69920fe9d278f82 /uv /uvx /bin/
#10 DONE 0.1s

#11 [stage-0 5/5] RUN uv sync --frozen --no-dev --no-editable     && apt-get -y update     && apt-get -y install --no-install-recommends git=1:2.47.3-0+deb13u1     && rm -rf /var/lib/apt/lists/*
#11 0.748 Using CPython 3.15.0 interpreter at: /usr/local/bin/python3
#11 0.751 Creating virtual environment at: .venv
#11 1.036 Downloading cryptography (4.5MiB)
#11 1.036 Downloading pynacl (1.3MiB)
#11 1.198  Downloaded pynacl
#11 1.222  Downloaded cryptography
#11 1.238    Building cffi==2.0.0
#11 3.615   × Failed to build `cffi==2.0.0`
#11 3.615   ├─▶ The build backend returned an error
#11 3.616   ╰─▶ Call to `setuptools.build_meta.build_wheel` failed (exit status: 1)
#11 3.616 
#11 3.616       [stdout]
#11 3.616       running bdist_wheel
#11 3.616       running build
#11 3.616       running build_py
#11 3.616       creating build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/setuptools_ext.py ->
#11 3.616       build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/vengine_gen.py ->
#11 3.616       build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/ffiplatform.py ->
#11 3.616       build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/pkgconfig.py -> build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/cparser.py -> build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/cffi_opcode.py ->
#11 3.616       build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/lock.py -> build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/_shimmed_dist_utils.py ->
#11 3.616       build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/error.py -> build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/api.py -> build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/backend_ctypes.py ->
#11 3.616       build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/recompiler.py -> build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/__init__.py -> build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/model.py -> build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/commontypes.py ->
#11 3.616       build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/_imp_emulation.py ->
#11 3.616       build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/verifier.py -> build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/vengine_cpy.py ->
#11 3.616       build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       running egg_info
#11 3.616       writing src/cffi.egg-info/PKG-INFO
#11 3.616       writing dependency_links to src/cffi.egg-info/dependency_links.txt
#11 3.616       writing entry points to src/cffi.egg-info/entry_points.txt
#11 3.616       writing requirements to src/cffi.egg-info/requires.txt
#11 3.616       writing top-level names to src/cffi.egg-info/top_level.txt
#11 3.616       reading manifest file 'src/cffi.egg-info/SOURCES.txt'
#11 3.616       reading manifest template 'MANIFEST.in'
#11 3.616       adding license file 'LICENSE'
#11 3.616       adding license file 'AUTHORS'
#11 3.616       writing manifest file 'src/cffi.egg-info/SOURCES.txt'
#11 3.616       copying src/cffi/_cffi_errors.h ->
#11 3.616       build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/_cffi_include.h ->
#11 3.616       build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/_embedding.h -> build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       copying src/cffi/parse_c_type.h ->
#11 3.616       build/lib.linux-x86_64-cpython-315/cffi
#11 3.616       running build_ext
#11 3.616       building '_cffi_backend' extension
#11 3.616       gcc -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
#11 3.616       -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall
#11 3.616       -fPIC -DFFI_BUILDING=1 -I/usr/include/ffi -I/usr/include/libffi
#11 3.616       -I/root/.cache/uv/builds-v0/.tmpMWwvrz/include
#11 3.616       -I/usr/local/include/python3.15 -c src/c/_cffi_backend.c -o
#11 3.616       build/temp.linux-x86_64-cpython-315/src/c/_cffi_backend.o
#11 3.616 
#11 3.616       [stderr]
#11 3.616 
#11 3.616           No working compiler found, or bogus compiler options passed to
#11 3.616           the compiler from Python's standard "distutils" module.  See
#11 3.616           the error messages above.  Likely, the problem is not related
#11 3.616           to CFFI but generic to the setup.py of any Python package that
#11 3.616           tries to compile C code.  (Hints: on OS/X 10.8, for errors about
#11 3.616           -mno-fused-madd see http://stackoverflow.com/questions/22313407/
#11 3.616           Otherwise, see https://wiki.python.org/moin/CompLangPython or
#11 3.616           the IRC channel #python on irc.libera.chat.)
#11 3.616 
#11 3.616           Trying to continue anyway.  If you are trying to install CFFI from
#11 3.616           a build done in a different context, you can ignore this warning.
#11 3.616       
#11 3.616       error: [Errno 2] No such file or directory: 'gcc'
#11 3.616 
#11 3.616       hint: This usually indicates a problem with the package or the build
#11 3.616       environment.
#11 3.617   help: `cffi` (v2.0.0) was included because `contributors` (v2.0.0) depends
#11 3.617         on `pygithub` (v2.9.1) which depends on `pynacl` (v1.6.2) which
#11 3.617         depends on `cffi`
#11 ERROR: process "/bin/sh -c uv sync --frozen --no-dev --no-editable     && apt-get -y update     && apt-get -y install --no-install-recommends git=1:2.47.3-0+deb13u1     && rm -rf /var/lib/apt/lists/*" did not complete successfully: exit code: 1
------
 > [stage-0 5/5] RUN uv sync --frozen --no-dev --no-editable     && apt-get -y update     && apt-get -y install --no-install-recommends git=1:2.47.3-0+deb13u1     && rm -rf /var/lib/apt/lists/*:
3.616           Trying to continue anyway.  If you are trying to install CFFI from
3.616           a build done in a different context, you can ignore this warning.
3.616       
3.616       error: [Errno 2] No such file or directory: 'gcc'
3.616 
3.616       hint: This usually indicates a problem with the package or the build
3.616       environment.
3.617   help: `cffi` (v2.0.0) was included because `contributors` (v2.0.0) depends
3.617         on `pygithub` (v2.9.1) which depends on `pynacl` (v1.6.2) which
3.617         depends on `cffi`
------
Dockerfile:21
--------------------
  20 |     
  21 | >>> RUN uv sync --frozen --no-dev --no-editable \
  22 | >>>     && apt-get -y update \
  23 | >>>     && apt-get -y install --no-install-recommends git=1:2.47.3-0+deb13u1 \
  24 | >>>     && rm -rf /var/lib/apt/lists/*
  25 |     
--------------------
ERROR: failed to build: failed to solve: process "/bin/sh -c uv sync --frozen --no-dev --no-editable     && apt-get -y update     && apt-get -y install --no-install-recommends git=1:2.47.3-0+deb13u1     && rm -rf /var/lib/apt/lists/*" did not complete successfully: exit code: 1

Original Dependabot directory-context build exit code: 1
Evidence: Python 3.15 image build
#0 building with "default" instance using docker driver

#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 2.41kB 0.0s done
#1 DONE 0.0s

#2 [internal] load metadata for ghcr.io/astral-sh/uv:0.10.9@sha256:10902f58a1606787602f303954cea099626a4adb02acbac4c69920fe9d278f82
#2 DONE 0.0s

#3 [internal] load metadata for docker.io/library/python:3.15.0-slim@sha256:f5b92f2a669a4c347044f29367f31983280b648250ca94dea66f98c53bc87e58
#3 DONE 0.9s

#4 [internal] load .dockerignore
#4 transferring context: 356B 0.1s done
#4 DONE 0.1s

#5 [stage-0 1/5] FROM docker.io/library/python:3.15.0-slim@sha256:f5b92f2a669a4c347044f29367f31983280b648250ca94dea66f98c53bc87e58
#5 DONE 0.0s

#6 FROM ghcr.io/astral-sh/uv:0.10.9@sha256:10902f58a1606787602f303954cea099626a4adb02acbac4c69920fe9d278f82
#6 CACHED

#7 [stage-0 2/5] WORKDIR /action/workspace
#7 CACHED

#8 [internal] load build context
#8 transferring context: 257.71kB 0.1s done
#8 DONE 0.1s

#9 [stage-0 3/5] COPY pyproject.toml uv.lock *.py /action/workspace/
#9 DONE 0.0s

#10 [stage-0 4/5] COPY --from=ghcr.io/astral-sh/uv:0.10.9@sha256:10902f58a1606787602f303954cea099626a4adb02acbac4c69920fe9d278f82 /uv /uvx /bin/
#10 DONE 0.1s

#11 [builder 3/5] COPY pyproject.toml uv.lock *.py /action/workspace/
#11 CACHED

#12 [builder 4/5] COPY --from=ghcr.io/astral-sh/uv:0.10.9@sha256:10902f58a1606787602f303954cea099626a4adb02acbac4c69920fe9d278f82 /uv /uvx /bin/
#12 CACHED

#13 [builder 5/5] RUN apt-get -y update     && apt-get -y install --no-install-recommends gcc=4:14.2.0-1 libc6-dev=2.41-12+deb13u4 libffi-dev=3.4.8-2     && uv sync --frozen --no-dev --no-editable     && rm -rf /var/lib/apt/lists/*
#13 0.425 Hit:1 http://deb.debian.org/debian trixie InRelease
#13 0.427 Get:2 http://deb.debian.org/debian trixie-updates InRelease [47.3 kB]
#13 0.445 Get:3 http://deb.debian.org/debian-security trixie-security InRelease [43.4 kB]
#13 0.547 Get:4 http://deb.debian.org/debian trixie/main amd64 Packages [9678 kB]
#13 3.765 Get:5 http://deb.debian.org/debian trixie-updates/main amd64 Packages [1108 B]
#13 3.765 Get:6 http://deb.debian.org/debian-security trixie-security/main amd64 Packages [297 kB]
#13 4.676 Fetched 10.1 MB in 4s (2287 kB/s)
#13 4.676 Reading package lists...
#13 5.394 Reading package lists...
#13 6.077 Building dependency tree...
#13 6.246 Reading state information...
#13 6.464 The following additional packages will be installed:
#13 6.464   binutils binutils-common binutils-x86-64-linux-gnu cpp cpp-14
#13 6.464   cpp-14-x86-64-linux-gnu cpp-x86-64-linux-gnu gcc-14 gcc-14-x86-64-linux-gnu
#13 6.464   gcc-x86-64-linux-gnu libasan8 libatomic1 libbinutils libc-dev-bin libcc1-0
#13 6.464   libcrypt-dev libctf-nobfd0 libctf0 libgcc-14-dev libgomp1 libgprofng0
#13 6.464   libhwasan0 libisl23 libitm1 libjansson4 liblsan0 libmpc3 libmpfr6
#13 6.465   libquadmath0 libsframe1 libtsan2 libubsan1 linux-libc-dev rpcsvc-proto
#13 6.467 Suggested packages:
#13 6.467   binutils-doc gprofng-gui binutils-gold cpp-doc gcc-14-locales cpp-14-doc
#13 6.467   gcc-multilib make manpages-dev autoconf automake libtool flex bison gdb
#13 6.467   gcc-doc gcc-14-multilib gcc-14-doc gdb-x86-64-linux-gnu libc-devtools
#13 6.467   glibc-doc
#13 6.467 Recommended packages:
#13 6.467   manpages manpages-dev
#13 6.599 The following NEW packages will be installed:
#13 6.599   binutils binutils-common binutils-x86-64-linux-gnu cpp cpp-14
#13 6.599   cpp-14-x86-64-linux-gnu cpp-x86-64-linux-gnu gcc gcc-14
#13 6.599   gcc-14-x86-64-linux-gnu gcc-x86-64-linux-gnu libasan8 libatomic1 libbinutils
#13 6.599   libc-dev-bin libc6-dev libcc1-0 libcrypt-dev libctf-nobfd0 libctf0
#13 6.599   libffi-dev libgcc-14-dev libgomp1 libgprofng0 libhwasan0 libisl23 libitm1
#13 6.600   libjansson4 liblsan0 libmpc3 libmpfr6 libquadmath0 libsframe1 libtsan2
#13 6.600   libubsan1 linux-libc-dev rpcsvc-proto
#13 6.731 0 upgraded, 37 newly installed, 0 to remove and 1 not upgraded.
#13 6.731 Need to get 57.3 MB of archives.
#13 6.731 After this operation, 217 MB of additional disk space will be used.
#13 6.731 Get:1 http://deb.debian.org/debian trixie/main amd64 libsframe1 amd64 2.44-3 [78.4 kB]
#13 6.767 Get:2 http://deb.debian.org/debian trixie/main amd64 binutils-common amd64 2.44-3 [2509 kB]
#13 7.196 Get:3 http://deb.debian.org/debian trixie/main amd64 libbinutils amd64 2.44-3 [534 kB]
#13 7.308 Get:4 http://deb.debian.org/debian trixie/main amd64 libgprofng0 amd64 2.44-3 [808 kB]
#13 7.475 Get:5 http://deb.debian.org/debian trixie/main amd64 libctf-nobfd0 amd64 2.44-3 [156 kB]
#13 7.503 Get:6 http://deb.debian.org/debian trixie/main amd64 libctf0 amd64 2.44-3 [88.6 kB]
#13 7.520 Get:7 http://deb.debian.org/debian trixie/main amd64 libjansson4 amd64 2.14-2+b3 [39.8 kB]
#13 7.536 Get:8 http://deb.debian.org/debian trixie/main amd64 binutils-x86-64-linux-gnu amd64 2.44-3 [1014 kB]
#13 7.740 Get:9 http://deb.debian.org/debian trixie/main amd64 binutils amd64 2.44-3 [265 kB]
#13 7.773 Get:10 http://deb.debian.org/debian trixie/main amd64 libisl23 amd64 0.27-1 [659 kB]
#13 7.924 Get:11 http://deb.debian.org/debian trixie/main amd64 libmpfr6 amd64 4.2.2-1 [729 kB]
#13 8.058 Get:12 http://deb.debian.org/debian trixie/main amd64 libmpc3 amd64 1.3.1-1+b3 [52.2 kB]
#13 8.076 Get:13 http://deb.debian.org/debian trixie/main amd64 cpp-14-x86-64-linux-gnu amd64 14.2.0-19 [11.0 MB]
#13 10.64 Get:14 http://deb.debian.org/debian trixie/main amd64 cpp-14 amd64 14.2.0-19 [1280 B]
#13 10.64 Get:15 http://deb.debian.org/debian trixie/main amd64 cpp-x86-64-linux-gnu amd64 4:14.2.0-1 [4840 B]
#13 10.64 Get:16 http://deb.debian.org/debian trixie/main amd64 cpp amd64 4:14.2.0-1 [1568 B]
#13 10.64 Get:17 http://deb.debian.org/debian trixie/main amd64 libcc1-0 amd64 14.2.0-19 [42.8 kB]
#13 10.64 Get:18 http://deb.debian.org/debian trixie/main amd64 libgomp1 amd64 14.2.0-19 [137 kB]
#13 10.65 Get:19 http://deb.debian.org/debian trixie/main amd64 libitm1 amd64 14.2.0-19 [26.0 kB]
#13 10.65 Get:20 http://deb.debian.org/debian trixie/main amd64 libatomic1 amd64 14.2.0-19 [9308 B]
#13 10.65 Get:21 http://deb.debian.org/debian trixie/main amd64 libasan8 amd64 14.2.0-19 [2725 kB]
#13 10.67 Get:22 http://deb.debian.org/debian trixie/main amd64 liblsan0 amd64 14.2.0-19 [1204 kB]
#13 10.69 Get:23 http://deb.debian.org/debian trixie/main amd64 libtsan2 amd64 14.2.0-19 [2460 kB]
#13 10.71 Get:24 http://deb.debian.org/debian trixie/main amd64 libubsan1 amd64 14.2.0-19 [1074 kB]
#13 10.72 Get:25 http://deb.debian.org/debian trixie/main amd64 libhwasan0 amd64 14.2.0-19 [1488 kB]
#13 10.73 Get:26 http://deb.debian.org/debian trixie/main amd64 libquadmath0 amd64 14.2.0-19 [145 kB]
#13 10.73 Get:27 http://deb.debian.org/debian trixie/main amd64 libgcc-14-dev amd64 14.2.0-19 [2672 kB]
#13 10.76 Get:28 http://deb.debian.org/debian trixie/main amd64 gcc-14-x86-64-linux-gnu amd64 14.2.0-19 [21.4 MB]
#13 10.97 Get:29 http://deb.debian.org/debian trixie/main amd64 gcc-14 amd64 14.2.0-19 [540 kB]
#13 10.97 Get:30 http://deb.debian.org/debian trixie/main amd64 gcc-x86-64-linux-gnu amd64 4:14.2.0-1 [1436 B]
#13 10.97 Get:31 http://deb.debian.org/debian trixie/main amd64 gcc amd64 4:14.2.0-1 [5136 B]
#13 10.97 Get:32 http://deb.debian.org/debian trixie/main amd64 libc-dev-bin amd64 2.41-12+deb13u4 [60.0 kB]
#13 10.97 Get:33 http://deb.debian.org/debian-security trixie-security/main amd64 linux-libc-dev all 6.12.115-2 [3050 kB]
#13 11.00 Get:34 http://deb.debian.org/debian trixie/main amd64 libcrypt-dev amd64 1:4.4.38-1 [119 kB]
#13 11.00 Get:35 http://deb.debian.org/debian trixie/main amd64 rpcsvc-proto amd64 1.4.3-1 [63.3 kB]
#13 11.00 Get:36 http://deb.debian.org/debian trixie/main amd64 libc6-dev amd64 2.41-12+deb13u4 [1995 kB]
#13 11.02 Get:37 http://deb.debian.org/debian trixie/main amd64 libffi-dev amd64 3.4.8-2 [61.1 kB]
#13 11.37 debconf: unable to initialize frontend: Dialog
#13 11.37 debconf: (TERM is not set, so the dialog frontend is not usable.)
#13 11.37 debconf: falling back to frontend: Readline
#13 11.37 debconf: unable to initialize frontend: Readline
#13 11.37 debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC en

... [19485 bytes truncated] ...

at4t64_1.24-2_amd64.deb ...
#15 11.21 Unpacking libgdbm-compat4t64:amd64 (1.24-2) ...
#15 11.34 Selecting previously unselected package libperl5.40:amd64.
#15 11.34 Preparing to unpack .../03-libperl5.40_5.40.1-6+deb13u1_amd64.deb ...
#15 11.34 Unpacking libperl5.40:amd64 (5.40.1-6+deb13u1) ...
#15 11.64 Selecting previously unselected package perl.
#15 11.64 Preparing to unpack .../04-perl_5.40.1-6+deb13u1_amd64.deb ...
#15 11.65 Unpacking perl (5.40.1-6+deb13u1) ...
#15 11.78 Selecting previously unselected package libbrotli1:amd64.
#15 11.78 Preparing to unpack .../05-libbrotli1_1.1.0-2+deb13u1_amd64.deb ...
#15 11.78 Unpacking libbrotli1:amd64 (1.1.0-2+deb13u1) ...
#15 11.92 Selecting previously unselected package libunistring5:amd64.
#15 11.92 Preparing to unpack .../06-libunistring5_1.3-2_amd64.deb ...
#15 11.92 Unpacking libunistring5:amd64 (1.3-2) ...
#15 12.06 Selecting previously unselected package libidn2-0:amd64.
#15 12.06 Preparing to unpack .../07-libidn2-0_2.3.8-2_amd64.deb ...
#15 12.06 Unpacking libidn2-0:amd64 (2.3.8-2) ...
#15 12.17 Selecting previously unselected package libp11-kit0:amd64.
#15 12.17 Preparing to unpack .../08-libp11-kit0_0.25.5-3_amd64.deb ...
#15 12.18 Unpacking libp11-kit0:amd64 (0.25.5-3) ...
#15 12.31 Selecting previously unselected package libtasn1-6:amd64.
#15 12.31 Preparing to unpack .../09-libtasn1-6_4.20.0-2+deb13u1_amd64.deb ...
#15 12.31 Unpacking libtasn1-6:amd64 (4.20.0-2+deb13u1) ...
#15 12.42 Selecting previously unselected package libgnutls30t64:amd64.
#15 12.42 Preparing to unpack .../10-libgnutls30t64_3.8.9-3+deb13u4_amd64.deb ...
#15 12.42 Unpacking libgnutls30t64:amd64 (3.8.9-3+deb13u4) ...
#15 12.57 Selecting previously unselected package libkrb5support0:amd64.
#15 12.57 Preparing to unpack .../11-libkrb5support0_1.21.3-5+deb13u1_amd64.deb ...
#15 12.57 Unpacking libkrb5support0:amd64 (1.21.3-5+deb13u1) ...
#15 12.69 Selecting previously unselected package libcom-err2:amd64.
#15 12.69 Preparing to unpack .../12-libcom-err2_1.47.2-3+b12_amd64.deb ...
#15 12.69 Unpacking libcom-err2:amd64 (1.47.2-3+b12) ...
#15 12.80 Selecting previously unselected package libk5crypto3:amd64.
#15 12.80 Preparing to unpack .../13-libk5crypto3_1.21.3-5+deb13u1_amd64.deb ...
#15 12.80 Unpacking libk5crypto3:amd64 (1.21.3-5+deb13u1) ...
#15 12.91 Selecting previously unselected package libkeyutils1:amd64.
#15 12.91 Preparing to unpack .../14-libkeyutils1_1.6.3-6_amd64.deb ...
#15 12.92 Unpacking libkeyutils1:amd64 (1.6.3-6) ...
#15 13.04 Selecting previously unselected package libkrb5-3:amd64.
#15 13.04 Preparing to unpack .../15-libkrb5-3_1.21.3-5+deb13u1_amd64.deb ...
#15 13.04 Unpacking libkrb5-3:amd64 (1.21.3-5+deb13u1) ...
#15 13.17 Selecting previously unselected package libgssapi-krb5-2:amd64.
#15 13.17 Preparing to unpack .../16-libgssapi-krb5-2_1.21.3-5+deb13u1_amd64.deb ...
#15 13.17 Unpacking libgssapi-krb5-2:amd64 (1.21.3-5+deb13u1) ...
#15 13.28 Selecting previously unselected package libsasl2-modules-db:amd64.
#15 13.29 Preparing to unpack .../17-libsasl2-modules-db_2.1.28+dfsg1-9_amd64.deb ...
#15 13.29 Unpacking libsasl2-modules-db:amd64 (2.1.28+dfsg1-9) ...
#15 13.40 Selecting previously unselected package libsasl2-2:amd64.
#15 13.40 Preparing to unpack .../18-libsasl2-2_2.1.28+dfsg1-9_amd64.deb ...
#15 13.40 Unpacking libsasl2-2:amd64 (2.1.28+dfsg1-9) ...
#15 13.51 Selecting previously unselected package libldap2:amd64.
#15 13.51 Preparing to unpack .../19-libldap2_2.6.10+dfsg-1_amd64.deb ...
#15 13.51 Unpacking libldap2:amd64 (2.6.10+dfsg-1) ...
#15 13.63 Selecting previously unselected package libnghttp2-14:amd64.
#15 13.63 Preparing to unpack .../20-libnghttp2-14_1.64.0-1.1+deb13u1_amd64.deb ...
#15 13.63 Unpacking libnghttp2-14:amd64 (1.64.0-1.1+deb13u1) ...
#15 13.74 Selecting previously unselected package libnghttp3-9:amd64.
#15 13.75 Preparing to unpack .../21-libnghttp3-9_1.8.0-1_amd64.deb ...
#15 13.75 Unpacking libnghttp3-9:amd64 (1.8.0-1) ...
#15 13.87 Selecting previously unselected package libngtcp2-16:amd64.
#15 13.87 Preparing to unpack .../22-libngtcp2-16_1.11.0-1+deb13u1_amd64.deb ...
#15 13.87 Unpacking libngtcp2-16:amd64 (1.11.0-1+deb13u1) ...
#15 13.99 Selecting previously unselected package libngtcp2-crypto-gnutls8:amd64.
#15 13.99 Preparing to unpack .../23-libngtcp2-crypto-gnutls8_1.11.0-1+deb13u1_amd64.deb ...
#15 13.99 Unpacking libngtcp2-crypto-gnutls8:amd64 (1.11.0-1+deb13u1) ...
#15 14.10 Selecting previously unselected package libpsl5t64:amd64.
#15 14.11 Preparing to unpack .../24-libpsl5t64_0.21.2-1.1+b1_amd64.deb ...
#15 14.11 Unpacking libpsl5t64:amd64 (0.21.2-1.1+b1) ...
#15 14.22 Selecting previously unselected package librtmp1:amd64.
#15 14.22 Preparing to unpack .../25-librtmp1_2.4+20151223.gitfa8646d.1-2+b5_amd64.deb ...
#15 14.22 Unpacking librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b5) ...
#15 14.34 Selecting previously unselected package libssh2-1t64:amd64.
#15 14.34 Preparing to unpack .../26-libssh2-1t64_1.11.1-1+deb13u2_amd64.deb ...
#15 14.34 Unpacking libssh2-1t64:amd64 (1.11.1-1+deb13u2) ...
#15 14.47 Selecting previously unselected package libcurl3t64-gnutls:amd64.
#15 14.47 Preparing to unpack .../27-libcurl3t64-gnutls_8.14.1-2+deb13u7_amd64.deb ...
#15 14.47 Unpacking libcurl3t64-gnutls:amd64 (8.14.1-2+deb13u7) ...
#15 14.59 Selecting previously unselected package liberror-perl.
#15 14.59 Preparing to unpack .../28-liberror-perl_0.17030-1_all.deb ...
#15 14.60 Unpacking liberror-perl (0.17030-1) ...
#15 14.70 Selecting previously unselected package git-man.
#15 14.70 Preparing to unpack .../29-git-man_1%3a2.47.3-0+deb13u1_all.deb ...
#15 14.71 Unpacking git-man (1:2.47.3-0+deb13u1) ...
#15 14.87 Selecting previously unselected package git.
#15 14.87 Preparing to unpack .../30-git_1%3a2.47.3-0+deb13u1_amd64.deb ...
#15 14.96 Unpacking git (1:2.47.3-0+deb13u1) ...
#15 15.27 Setting up libexpat1:amd64 (2.9.0-1~deb13u1) ...
#15 15.28 Setting up libkeyutils1:amd64 (1.6.3-6) ...
#15 15.28 Setting up libgdbm-compat4t64:amd64 (1.24-2) ...
#15 15.28 Setting up libbrotli1:amd64 (1.1.0-2+deb13u1) ...
#15 15.29 Setting up libnghttp2-14:amd64 (1.64.0-1.1+deb13u1) ...
#15 15.29 Setting up libcom-err2:amd64 (1.47.2-3+b12) ...
#15 15.29 Setting up libkrb5support0:amd64 (1.21.3-5+deb13u1) ...
#15 15.30 Setting up libsasl2-modules-db:amd64 (2.1.28+dfsg1-9) ...
#15 15.30 Setting up libp11-kit0:amd64 (0.25.5-3) ...
#15 15.30 Setting up libunistring5:amd64 (1.3-2) ...
#15 15.31 Setting up libk5crypto3:amd64 (1.21.3-5+deb13u1) ...
#15 15.31 Setting up libsasl2-2:amd64 (2.1.28+dfsg1-9) ...
#15 15.32 Setting up libnghttp3-9:amd64 (1.8.0-1) ...
#15 15.32 Setting up perl-modules-5.40 (5.40.1-6+deb13u1) ...
#15 15.32 Setting up libtasn1-6:amd64 (4.20.0-2+deb13u1) ...
#15 15.32 Setting up git-man (1:2.47.3-0+deb13u1) ...
#15 15.33 Setting up libngtcp2-16:amd64 (1.11.0-1+deb13u1) ...
#15 15.33 Setting up libkrb5-3:amd64 (1.21.3-5+deb13u1) ...
#15 15.33 Setting up libssh2-1t64:amd64 (1.11.1-1+deb13u2) ...
#15 15.34 Setting up libldap2:amd64 (2.6.10+dfsg-1) ...
#15 15.34 Setting up libidn2-0:amd64 (2.3.8-2) ...
#15 15.34 Setting up libperl5.40:amd64 (5.40.1-6+deb13u1) ...
#15 15.35 Setting up perl (5.40.1-6+deb13u1) ...
#15 15.41 Setting up libgssapi-krb5-2:amd64 (1.21.3-5+deb13u1) ...
#15 15.43 Setting up libgnutls30t64:amd64 (3.8.9-3+deb13u4) ...
#15 15.43 Setting up libpsl5t64:amd64 (0.21.2-1.1+b1) ...
#15 15.43 Setting up liberror-perl (0.17030-1) ...
#15 15.44 Setting up librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b5) ...
#15 15.44 Setting up libngtcp2-crypto-gnutls8:amd64 (1.11.0-1+deb13u1) ...
#15 15.44 Setting up libcurl3t64-gnutls:amd64 (8.14.1-2+deb13u7) ...
#15 15.44 Setting up git (1:2.47.3-0+deb13u1) ...
#15 15.52 Processing triggers for libc-bin (2.41-12+deb13u4) ...
#15 DONE 15.7s

#16 exporting to image
#16 exporting layers
#16 exporting layers 0.3s done
#16 writing image sha256:1c2b26e9b81d5ff4761d449f1bdfb3f7f2ad4ec43d087e47638d183047929d30 done
#16 naming to docker.io/library/contributors-live-01m6eqm1:directory done
#16 DONE 0.3s
Evidence: Offline native-runtime and compiler-exclusion checks
Python: 3.15.0 (main, Oct 21 2026, 01:04:31) [GCC 14.2.0]
Executable: /action/workspace/.venv/bin/python3
cffi native extension: /action/workspace/.venv/lib/python3.15/site-packages/_cffi_backend.cpython-315-x86_64-linux-gnu.so
Compiled cffi: libc abs(-557) = 557
Native runtime linkage:
	libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007fffff77f000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fffff58b000)
	/lib64/ld-linux-x86-64.so.2 (0x00007ffffffc8000)

PyNaCl: valid Ed25519 signature accepted; tampered signature rejected
PyGithub AppAuth: RS256 JWT generated and verified, issuer=557
Runtime package boundary: gcc, libc6-dev, libffi-dev, binutils and make absent
Runtime tools: git version 2.47.3
Runtime libffi: 3.4.8-2
APT indexes: empty
Installed locked runtime packages: {"certifi": "2026.10.19", "cffi": "2.0.0", "charset-normalizer": "3.4.5", "cryptography": "50.0.1", "idna": "3.15", "pycparser": "3.0", "pygithub": "2.9.1", "pyjwt": "2.15.0", "pynacl": "1.6.2", "python-dotenv": "1.2.4", "requests": "2.34.2", "typing-extensions": "4.15.0", "urllib3": "2.8.0"}
Startup was offline with a fresh /tmp/uv-cache and the shipped uv entrypoint.
Evidence: Final runtime image metadata
Id=sha256:1c2b26e9b81d5ff4761d449f1bdfb3f7f2ad4ec43d087e47638d183047929d30 Platform=linux/amd64 Size=299821760 Entrypoint=["uv","run","--no-dev","--project","/action/workspace"] Cmd=["/action/workspace/contributors.py"]
  • Evidence: PAT and GitHub App end-to-end transcript (local file: ~/.no-mistakes/evidence/01M6EQM1THH138ATWGVEXHHDQE/directory-context/action-reports-live.log)
Evidence: PAT-generated contributor report
# Contributors

- Repository: ['fixture/widgets']

| Total Contributors | Total Contributions |
| --- | --- |
| 2  | 7  |

| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
| ada-fixture | 5 | http://fixture:8000/fixture/widgets/commits?author=ada-fixture |
| grace-fixture | 2 | http://fixture:8000/fixture/widgets/commits?author=grace-fixture |

 _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
Evidence: GitHub App-generated contributor data
{
    "start_date": "",
    "end_date": "",
    "organization": null,
    "repository_list": [
        "fixture/widgets"
    ],
    "sponsor_info": false,
    "link_to_profile": false,
    "contributors": [
        {
            "username": "ada-fixture",
            "avatar_url": "http://fixture:8000/avatars/101.png",
            "contribution_count": 5,
            "commit_url": "http://fixture:8000/fixture/widgets/commits?author=ada-fixture",
            "sponsor_info": "",
            "new_contributor": false
        },
        {
            "username": "grace-fixture",
            "avatar_url": "http://fixture:8000/avatars/102.png",
            "contribution_count": 2,
            "commit_url": "http://fixture:8000/fixture/widgets/commits?author=grace-fixture",
            "sponsor_info": "",
            "new_contributor": false
        }
    ]
}
Evidence: GitHub App-generated job summary
# Contributors

- Repository: ['fixture/widgets']

| Total Contributors | Total Contributions |
| --- | --- |
| 2  | 7  |

| Username | All Time Contribution Count | All Commits |
| --- | --- | --- |
| ada-fixture | 5 | http://fixture:8000/fixture/widgets/commits?author=ada-fixture |
| grace-fixture | 2 | http://fixture:8000/fixture/widgets/commits?author=grace-fixture |

 _this file was generated by the [Contributors GitHub Action](https://github.com/github-community-projects/contributors)_
Evidence: Isolated API authentication trace
[
  {
    "method": "GET",
    "path": "/api/v3/repos/fixture/widgets",
    "status": 200,
    "authentication": "pat"
  },
  {
    "method": "GET",
    "path": "/api/v3/repos/fixture/widgets/contributors",
    "status": 200,
    "authentication": "pat"
  },
  {
    "method": "POST",
    "path": "/api/v3/app/installations/99/access_tokens",
    "status": 201,
    "authentication": "verified-rs256-app-jwt-issuer-557"
  },
  {
    "method": "POST",
    "path": "/api/v3/app/installations/99/access_tokens",
    "status": 201,
    "authentication": "verified-rs256-app-jwt-issuer-557"
  },
  {
    "method": "GET",
    "path": "/api/v3/repos/fixture/widgets",
    "status": 200,
    "authentication": "installation-token"
  },
  {
    "method": "GET",
    "path": "/api/v3/repos/fixture/widgets/contributors",
    "status": 200,
    "authentication": "installation-token"
  }
]

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

✅ **Review** - passed

✅ No issues found.

✅ **Test** - passed

✅ No issues found.

  • Live validation: ✅ go - 4 of 4 scenarios driven live against the product
Scenario Result Live Evidence
Build the Python 3.15 image when a dependency has no compatible wheel ✅ pass live Pre-fix compiler-failure reproduction; Python 3.15 image build
Start the slim runtime offline and use native dependencies without compiler tools ✅ pass live Offline native-runtime and compiler-exclusion checks; Final runtime image metadata
Run the action with a PAT and receive correct contributor reports ✅ pass live PAT and GitHub App end-to-end transcript; PAT-generated contributor report; Isolated API authentication trace
Run the action with GitHub App credentials and receive correct contributor reports ✅ pass live PAT and GitHub App end-to-end transcript; GitHub App-generated contributor data; GitHub App-generated job summary; Isolated API authentication trace
  • Checked docker version and docker buildx version. Resolved the missing Buildx plugin and legacy-builder architecture mismatch using checksum-verified Buildx v0.38.1 installed only inside the disposable workspace.
  • Built the pre-fix commit 168acfe using archive input and docker buildx build --platform linux/amd64 --no-cache --progress=plain --load --tag contributors-live-01m6eqm1:prefixed-directory .local-docker-validation/prefixed-context; both reproduced cffi's missing-gcc failure.
  • Built target commit 25ee154496340fa890cbffd7c7655a49bb047b0f from archive input, then ran docker buildx build --platform linux/amd64 --no-cache --progress=plain --load --tag contributors-live-01m6eqm1:directory . to exercise the normal context and .dockerignore.
  • Ran docker run --rm --platform linux/amd64 --network none --tmpfs /tmp:rw,nosuid,size=64m --env UV_CACHE_DIR=/tmp/uv-cache --env UV_OFFLINE=true --env PYTHONDONTWRITEBYTECODE=1 -i contributors-live-01m6eqm1:directory python - < .local-docker-validation/runtime_check.py. Verified Python 3.15, native cffi execution/linkage, valid and tampered signatures, GitHub App JWT signing, locked dependencies, Git availability, and absence of compiler/development packages. Also exercised the archive-built image.
  • Ran PYTHONDONTWRITEBYTECODE=1 python3 .local-docker-validation/drive_reports.py against both built images. The unmodified action entrypoint used PAT and GitHub App credentials against an isolated API; assertions checked complete JSON output, Markdown content, matching job summaries, and authenticated API requests.
  • Inspected the final image with docker image inspect contributors-live-01m6eqm1:directory; removed test containers, networks, images, synthetic credentials, and workspace-local tooling. GIT_OPTIONAL_LOCKS=0 git status --short confirmed no remaining changes.
✅ **Document** - passed

✅ No issues found.

⚠️ **Lint** - 1 warning
  • ⚠️ Dockerfile - Dockerfile lint and static-analysis checks remain blocked: hadolint, checkov, trivy, pre-commit, gitleaks, codespell, and jscpd are unavailable on PATH, and no repository-local executables were supplied. Searching elsewhere or installing system tools is prohibited. git diff --check passed. Make the configured tools available before rerunning this phase.

🔧 No changes applied.
1 warning still open:

  • ⚠️ Dockerfile - Dockerfile lint and static-analysis checks remain blocked: hadolint, checkov, trivy, pre-commit, gitleaks, codespell, and jscpd are unavailable on PATH. No repository-local executable paths were supplied. Per the workspace rules, stopped without searching elsewhere or installing tools. Make the configured tools available before rerunning this phase.
✅ **Push** - passed

✅ No issues found.

@dependabot dependabot Bot added dependencies Pull requests that update a dependency file docker Pull requests that update Docker code labels Nov 2, 2026
dependabot Bot and others added 2 commits November 2, 2026 10:16
Bumps the dependencies group with 1 update: python.


Updates `python` from 3.14.8-slim to 3.15.0-slim

---
updated-dependencies:
- dependency-name: python
  dependency-version: 3.15.0-slim
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Zack Koppert <zkoppert@github.com>
@zkoppert
zkoppert force-pushed the dependabot/docker/dependencies-ad7ad3a871 branch from 45a6ce9 to 25ee154 Compare November 2, 2026 18:36
@zkoppert zkoppert changed the title chore(deps): bump python from 3.14.8-slim to 3.15.0-slim in the dependencies group fix: support Python 3.15 in the slim Docker image Nov 2, 2026
@github-actions github-actions Bot added the fix label Nov 2, 2026

@zkoppert zkoppert left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI is green. The Docker build now compiles Python 3.15 dependencies in a dedicated builder stage while keeping the runtime image slim.

@zkoppert
zkoppert merged commit 8cdfb15 into main Nov 2, 2026
39 checks passed
@zkoppert
zkoppert deleted the dependabot/docker/dependencies-ad7ad3a871 branch November 2, 2026 18:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file docker Pull requests that update Docker code fix maintenance

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant