# ci-python — vorgebackenes CI-Image für Python-Repos (Gitea Actions) # # Basis: debian:bookworm-slim (firmenweite Distro-Linie), Toolchain über uv. # Ziel: schneller Cold-Start + reproduzierbare Läufe (kein `curl | sh` / kein # `pip install` zur Laufzeit mehr). Repo-eigene Deps kommen weiterhin per # `uv sync --frozen` aus dem jeweiligen uv.lock — dieses Image liefert nur die # Toolchain (Python, uv, ruff, pytest). # # Versionen stehen ausschliesslich hier (eine Quelle der Wahrheit). Aktualisieren # heisst: ARG/Digest anpassen -> Push -> Build-Workflow baut & pusht neu. # Basis per Digest gepinnt (reproduzierbar). Auflösen mit: # docker buildx imagetools inspect debian:bookworm-slim FROM debian:bookworm-slim@sha256:7b140f374b289a7c2befc338f42ebe6441b7ea838a042bbd5acbfca6ec875818 # --- zentrale Versionsliste --------------------------------------------------- ARG PYTHON_VERSION=3.12.13 ARG RUFF_VERSION=0.16.1 ARG PYTEST_VERSION=9.1.1 SHELL ["/bin/bash", "-o", "pipefail", "-c"] # 1) Selten ändernde Systemschicht zuerst -> Cache greift lange. # nodejs ist Pflicht, wenn das Image als Gitea-Actions-Job-Container dient: # JavaScript-Actions (actions/checkout u. a.) werden von act mit `node` IM # Container ausgeführt. Ohne node -> "exec: node: not found" (Recherche §3). RUN apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ git \ nodejs \ && rm -rf /var/lib/apt/lists/* # 2) uv aus dem offiziellen, digest-gepinnten uv-Image kopieren. # Digest auflösen mit: docker buildx imagetools inspect ghcr.io/astral-sh/uv:0.12.1 COPY --from=ghcr.io/astral-sh/uv:0.12.1@sha256:cf4eedcaa81655197f625739489effcbe71b61ceb1506f332c3facae5deceded \ /uv /uvx /usr/local/bin/ # 3) uv systemweit verdrahten: managed Python, keine Suche nach System-Python, # Tool-Bins landen in /usr/local/bin (auf PATH). ENV UV_PYTHON_INSTALL_DIR=/opt/uv/python \ UV_TOOL_DIR=/opt/uv/tools \ UV_TOOL_BIN_DIR=/usr/local/bin \ UV_PYTHON_PREFERENCE=only-managed \ UV_LINK_MODE=copy \ UV_NO_PROGRESS=1 # 4) Gepinnte CPython einbacken und als Default `python`/`python3` verdrahten. RUN uv python install "${PYTHON_VERSION}" \ && ln -sf "$(uv python find "${PYTHON_VERSION}")" /usr/local/bin/python3 \ && ln -sf /usr/local/bin/python3 /usr/local/bin/python # 5) Lint-/Test-Tools global (schnelle CI ohne per-Repo-Install). RUN uv tool install "ruff==${RUFF_VERSION}" \ && uv tool install "pytest==${PYTEST_VERSION}" # 6) Smoke-Test beim Bau: bricht den Build ab, falls etwas nicht auf PATH liegt. RUN python --version \ && uv --version \ && ruff --version \ && pytest --version \ && node --version CMD ["/bin/bash"]