From b53fadd1e6295e62eece9cd393f3c4a698467d86 Mon Sep 17 00:00:00 2001 From: Serge Koenigsmann Date: Tue, 20 Oct 2026 09:16:55 +0200 Subject: [PATCH] ci-python ohne Docker-Daemon bauen: Kaniko als Docker-Schritt (devops #419) Co-Authored-By: Claude Opus 5.5 --- .gitea/workflows/build-ci-python.yml | 71 ++++++++++++++++++---------- .gitea/workflows/probe-419.yml | 34 +++++++++++-- 2 files changed, 76 insertions(+), 29 deletions(-) diff --git a/.gitea/workflows/build-ci-python.yml b/.gitea/workflows/build-ci-python.yml index b75dc06..01d55d9 100644 --- a/.gitea/workflows/build-ci-python.yml +++ b/.gitea/workflows/build-ci-python.yml @@ -3,9 +3,28 @@ name: Build ci-python image # Baut das ci-python-Image und pusht es in die Gitea-Container-Registry. # Tags: :latest (mitlaufend) + : (unveränderlich, zum Pinnen in Workflows). # -# Voraussetzungen im Runner: -# - Docker verfügbar (Socket oder DinD) — Image-Bau braucht einen Docker-Daemon. -# - Secrets: REGISTRY_USER (Gitea-User) + REGISTRY_TOKEN (PAT, Scope package:write). +# **Ohne Docker-Daemon** (devops #419). Seit dem Umzug der internen Zone (#410) +# reicht kein Runner mehr den Docker-Socket in den Job - wer ihn hat, ist root +# auf dem Wirt. Kaniko braucht ihn nicht: Es fuehrt die RUN-Schritte direkt in +# seinem eigenen Container aus und schreibt die Schichten selbst. Buildah ging +# nicht, es braucht fuer RUN einen User-Namespace, und den verweigert der +# Job-Container ohne Zusatzrechte. +# +# Kaniko laeuft als **Docker-Schritt** (`uses: docker://`), nicht als +# Job-Container: act_runner haelt einen Job-Container mit /bin/sleep am Leben, +# und das Kaniko-Image hat sleep nur unter /busybox. Der Docker-Schritt startet +# mit dem Einstiegspunkt des Images und bekommt den Arbeitsbereich eingehaengt. +# +# Image: der gepflegte Fork osscontainertools/kaniko. Das Projekt von Google ist +# seit Mai 2025 archiviert. Per Digest gepinnt; auffrischen mit +# docker buildx imagetools inspect ghcr.io/osscontainertools/kaniko:debug +# +# **Kein Schicht-Cache, mit Absicht.** Der woechentliche Lauf ist fuer +# Sicherheits-Updates da. Mit Cache kaeme `apt-get update` nie neu zum Zug - +# die Zeile aendert sich nicht, also gaelte die alte Schicht. Ohne Cache dauert +# der Bau unter einer Minute. +# +# Secrets: REGISTRY_USER (Gitea-User) + REGISTRY_TOKEN (PAT, Scope package:write). on: push: @@ -23,30 +42,34 @@ env: jobs: build: - runs-on: ubuntu-latest - # Kein expliziter Socket-Mount: der act_runner mountet /var/run/docker.sock - # bei docker_host:"" automatisch in den Job-Container. build-push-action - # redet darüber mit dem Host-Daemon. Ein zusätzliches `-v ...docker.sock` - # führt zu "Duplicate mount point" (siehe Issue #11). + runs-on: inmedias-zone steps: - uses: actions/checkout@v4 - - uses: docker/setup-buildx-action@v3 - - - name: Login to Gitea registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ secrets.REGISTRY_USER }} - password: ${{ secrets.REGISTRY_TOKEN }} + # Kaniko liest die Zugangsdaten aus $DOCKER_CONFIG/config.json. Der + # Docker-Schritt sieht vom Job-Container nur den Arbeitsbereich, also + # muss die Datei dort liegen - ausserhalb von python/, damit sie nicht + # im Build-Kontext landet. + - name: Registry-Zugang fuer Kaniko + env: + REGISTRY_USER: ${{ secrets.REGISTRY_USER }} + REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }} + run: | + mkdir -p .kaniko-docker + auth=$(printf '%s:%s' "$REGISTRY_USER" "$REGISTRY_TOKEN" | base64 -w0) + printf '{"auths":{"%s":{"auth":"%s"}}}' "$REGISTRY" "$auth" > .kaniko-docker/config.json - name: Build & push - uses: docker/build-push-action@v6 + uses: docker://ghcr.io/osscontainertools/kaniko:debug@sha256:7ab44d0131c3051b6dea128067e258c7afb5c4815082a93b9cf6c624f2140bf0 + env: + DOCKER_CONFIG: ${{ github.workspace }}/.kaniko-docker with: - context: python - push: true - tags: | - ${{ env.REGISTRY }}/${{ env.IMAGE }}:latest - ${{ env.REGISTRY }}/${{ env.IMAGE }}:${{ github.sha }} - cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE }}:buildcache - cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE }}:buildcache,mode=max + args: >- + --context=dir://${{ github.workspace }}/python + --dockerfile=${{ github.workspace }}/python/Dockerfile + --destination=${{ env.REGISTRY }}/${{ env.IMAGE }}:latest + --destination=${{ env.REGISTRY }}/${{ env.IMAGE }}:${{ github.sha }} + + - name: Registry-Zugang entfernen + if: always() + run: rm -rf .kaniko-docker diff --git a/.gitea/workflows/probe-419.yml b/.gitea/workflows/probe-419.yml index d6b327b..be791e2 100644 --- a/.gitea/workflows/probe-419.yml +++ b/.gitea/workflows/probe-419.yml @@ -1,21 +1,45 @@ name: Probe 419 - Image ohne Docker-Daemon -# Nur Probe fuer devops #419, wird vor dem Merge wieder entfernt. Baut, pusht nicht. +# Nur Probe fuer devops #419, wird vor dem Merge wieder entfernt. Gleiche +# Schritte wie build-ci-python.yml, pusht aber nur das Tag :probe-419. on: push: branches: [probe/419-ohne-daemon] +env: + REGISTRY: gitea.inmedias.it + IMAGE: sko/ci-python + jobs: - kaniko-schritt: + build: runs-on: inmedias-zone steps: - uses: actions/checkout@v4 - - name: Bauen mit Kaniko als Docker-Schritt + + # Kaniko liest die Zugangsdaten aus $DOCKER_CONFIG/config.json. Der + # Docker-Schritt sieht vom Job-Container nur den Arbeitsbereich, also + # muss die Datei dort liegen - ausserhalb von python/, damit sie nicht + # im Build-Kontext landet. + - name: Registry-Zugang fuer Kaniko + env: + REGISTRY_USER: ${{ secrets.REGISTRY_USER }} + REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }} + run: | + mkdir -p .kaniko-docker + auth=$(printf '%s:%s' "$REGISTRY_USER" "$REGISTRY_TOKEN" | base64 -w0) + printf '{"auths":{"%s":{"auth":"%s"}}}' "$REGISTRY" "$auth" > .kaniko-docker/config.json + + - name: Build & push uses: docker://ghcr.io/osscontainertools/kaniko:debug@sha256:7ab44d0131c3051b6dea128067e258c7afb5c4815082a93b9cf6c624f2140bf0 + env: + DOCKER_CONFIG: ${{ github.workspace }}/.kaniko-docker with: args: >- --context=dir://${{ github.workspace }}/python --dockerfile=${{ github.workspace }}/python/Dockerfile - --no-push - --verbosity=info + --destination=${{ env.REGISTRY }}/${{ env.IMAGE }}:probe-419 + + - name: Registry-Zugang entfernen + if: always() + run: rm -rf .kaniko-docker