ci: voorgebakken Linux CI-basisimage + publiceer-route (fase 1/2) #1141

Merged
brenno merged 10 commits from ci/prebaked-image into main 2026-08-02 23:45:31 +00:00
Owner

Antwoord op "iedere keer wordt de hele Linux-omgeving vanaf scratch opgebouwd". Fase 1 van 2: introduceert een voorgebakken CI-basisimage; raakt de live-gates nog niet (die volgen in een vervolg-PR zodra het image gepubliceerd + gevalideerd is).

Waarom

linux-gate, static-gate en scans draaien elk in een kaal ubuntu:24.04 en bouwen élke run dezelfde omgeving op: apt-build-tools installeren, de officiële Flutter ophalen+uitpakken, desktop-artefacten precachen. Identiek werk, identiek resultaat — één keer bakken i.p.v. herhalen.

Wat

  • .forgejo/ci-image/Dockerfile — draagt de traag-veranderende toolchain: OS + de vaste apt-.deb-lijst + de gepinde Flutter (official stable, sha256 getoetst bij de build tegen het release-manifest) + flutter precache --linux. Bewust niet erin: pub-pakketten en de dartcv OpenCV-build — die volgen pubspec.lock en blijven op actions/cache.
  • .forgejo/workflows/ci-image.yml — bouwt+pusht naar pawprint.vigilis.online/librekat/ocideck-ci:flutter-<pin>. Op afroep én automatisch bij een wijziging aan de Dockerfile of .tool-versions. Slaat zichzelf groen over als CI_IMAGE_TOKEN ontbreekt, zodat déze PR na de merge geen rode main oplevert vóór de inrichting.
  • make ci-image-publish — betrouwbare handmatige route (buildx, cross-build naar linux/amd64) vanaf een machine met docker/colima.

Waarborgen (bewaker-relevant, expliciet)

  • Provenance ongewijzigd. De sha256-toets verhuist naar bouwtijd; check-toolchain draait onverkort in de poort op de ingebakken Flutter (kanaal stable, officiële herkomst, gelijk aan de pin). Een image met iets anders valt om op dezelfde poort die ooit het cirruslabs-image afkeurde.
  • Geen nieuwe partij. De build pult ubuntu:24.04 (Docker Hub) en Flutter (Google) — beide haalden de huidige workflows al. Het image leeft op de eigen Forgejo-registry; zelfde vertrouwensgrens als de runner en de bestaande actions/cache (zie de kop van linux-gate.yml). Geen pubspec-dep → geen SBOM-impact. De app-belofte ("only HTTP client dependency is http", "never phones home") raakt dit niet (CI, niet de app).
  • Pin-koppeling via .tool-versions → build-arg → image-tag, met auto-rebuild bij pin-bump.

Eenmalige inrichting (jij)

  1. Repo-secret CI_IMAGE_TOKEN = een Forgejo-token met write:packageof draai make ci-image-publish.
  2. Zet het gepubliceerde package op publiek (anders kunnen de gates het niet pullen).

Daarna de vervolg-PR die linux-gate/static-gate/scans omzet naar container: image: …/ocideck-ci:flutter-<pin> en de installatiestappen sloopt — dát levert de snelheidswinst.

Poortstand

Op verse origin/main gebouwd. Geen Dart-wijziging → static-gate/scans onaangetast; YAML gevalideerd (ruby), Makefile-doel dry-run correct. Kernwaardenbewaker-review loopt.

Antwoord op "iedere keer wordt de hele Linux-omgeving vanaf scratch opgebouwd". **Fase 1 van 2:** introduceert een voorgebakken CI-basisimage; raakt de live-gates nog **niet** (die volgen in een vervolg-PR zodra het image gepubliceerd + gevalideerd is). ## Waarom `linux-gate`, `static-gate` en `scans` draaien elk in een kaal `ubuntu:24.04` en bouwen élke run dezelfde omgeving op: apt-build-tools installeren, de officiële Flutter ophalen+uitpakken, desktop-artefacten precachen. Identiek werk, identiek resultaat — één keer bakken i.p.v. herhalen. ## Wat - **`.forgejo/ci-image/Dockerfile`** — draagt de *traag-veranderende* toolchain: OS + de vaste apt-`.deb`-lijst + de gepinde Flutter (official stable, **sha256 getoetst bij de build** tegen het release-manifest) + `flutter precache --linux`. Bewust **niet** erin: pub-pakketten en de dartcv OpenCV-build — die volgen `pubspec.lock` en blijven op `actions/cache`. - **`.forgejo/workflows/ci-image.yml`** — bouwt+pusht naar `pawprint.vigilis.online/librekat/ocideck-ci:flutter-<pin>`. Op afroep én automatisch bij een wijziging aan de Dockerfile of `.tool-versions`. **Slaat zichzelf groen over als `CI_IMAGE_TOKEN` ontbreekt**, zodat déze PR na de merge geen rode `main` oplevert vóór de inrichting. - **`make ci-image-publish`** — betrouwbare handmatige route (buildx, cross-build naar `linux/amd64`) vanaf een machine met docker/colima. ## Waarborgen (bewaker-relevant, expliciet) - **Provenance ongewijzigd.** De sha256-toets verhuist naar bouwtijd; `check-toolchain` draait **onverkort in de poort** op de ingebakken Flutter (kanaal `stable`, officiële herkomst, gelijk aan de pin). Een image met iets anders valt om op dezelfde poort die ooit het cirruslabs-image afkeurde. - **Geen nieuwe partij.** De build pult `ubuntu:24.04` (Docker Hub) en Flutter (Google) — beide haalden de huidige workflows al. Het image leeft op de **eigen** Forgejo-registry; zelfde vertrouwensgrens als de runner en de bestaande `actions/cache` (zie de kop van `linux-gate.yml`). Geen pubspec-dep → geen SBOM-impact. De app-belofte ("only HTTP client dependency is `http`", "never phones home") raakt dit niet (CI, niet de app). - **Pin-koppeling** via `.tool-versions` → build-arg → image-tag, met auto-rebuild bij pin-bump. ## Eenmalige inrichting (jij) 1. Repo-secret `CI_IMAGE_TOKEN` = een Forgejo-token met `write:package` — **of** draai `make ci-image-publish`. 2. Zet het gepubliceerde package op **publiek** (anders kunnen de gates het niet pullen). Daarna de vervolg-PR die `linux-gate`/`static-gate`/`scans` omzet naar `container: image: …/ocideck-ci:flutter-<pin>` en de installatiestappen sloopt — dát levert de snelheidswinst. ## Poortstand Op verse `origin/main` gebouwd. Geen Dart-wijziging → static-gate/scans onaangetast; YAML gevalideerd (ruby), Makefile-doel dry-run correct. Kernwaardenbewaker-review loopt.
De drie Linux-workflows (linux-gate, static-gate, scans) draaien elk in een kaal
ubuntu:24.04 en bouwen de omgeving per run opnieuw op: apt-build-tools
installeren, de officiële Flutter ophalen+uitpakken, desktop-artefacten
precachen. Identiek werk met een identiek resultaat — dit bakt het één keer.

.forgejo/ci-image/Dockerfile draagt de traag-veranderende toolchain (OS + de
vaste apt-.deb-lijst + de gepinde Flutter, official stable, sha256-getoetst bij
de build + flutter precache --linux). Bewust NIET erin: pub-pakketten en de
dartcv OpenCV-build — die volgen pubspec.lock en horen op actions/cache.

Provenance blijft gelijk: de sha256-toets verhuist naar bouwtijd, check-toolchain
draait onverkort in de poort op de ingebakken Flutter. Pin-koppeling: de versie
komt als build-arg uit .tool-versions en het image-tag ís die versie, dus een
pin-bump publiceert automatisch een nieuw tag (de workflow vuurt op een wijziging
aan de Dockerfile of .tool-versions). De workflow slaat zichzelf groen over als
CI_IMAGE_TOKEN niet gezet is, zodat het toevoegen van dit image geen rode main
kan opleveren vóór de eenmalige inrichting.

Dit raakt de live-gates nog NIET: die blijven de toolchain per run installeren
tot een vervolg-PR ze omzet naar dit image. Zo kan het introduceren van het image
de CI niet op zichzelf breken.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Naast de ci-image.yml-workflow (die docker op de runner vereist) een handmatige
route vanaf een machine met docker/colima: cross-buildt naar linux/amd64 (de
runner is amd64) via buildx en tagt op de Flutter-pin uit .tool-versions, zodat
image-tag en repo-pin niet uiteenlopen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
docs(checks): beschrijf het voorgebakken CI-image en de eenmalige inrichting
Some checks failed
scans / scans (pull_request) Has been cancelled
static-gate / static-gate (pull_request) Has been cancelled
8660381129
Wat het image wel/niet draagt, de ongewijzigde provenance (sha256 → bouwtijd,
check-toolchain onverkort in de poort), de pin-koppeling, de vertrouwensgrens
(eigen runner/registry, geen nieuwe partij), en de eenmalige inrichting
(CI_IMAGE_TOKEN met write:package óf make ci-image-publish; package op publiek).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ci: verwerk de kernwaardenbewaker-review op #1141
Some checks failed
scans / scans (pull_request) Has been cancelled
static-gate / static-gate (pull_request) Has been cancelled
22f68a6663
- Publiceer-workflow logt in als de EIGENAAR van het token (repo-variabele
  CI_IMAGE_USER) i.p.v. `github.actor` — die is wie de run triggert en hoeft niet
  de token-eigenaar te zijn; anders faalt de push stil op de verkeerde login. De
  guard eist nu zowel het token (secret) als de gebruikersnaam (variabele).
- CHECKS.md legt de twee fase-2-voorwaarden vast die de bewaker benoemde:
  (1) continuïteit — een registry-storing of per ongeluk privé package mag niet
  de gate blokkeren; fase 2 degradeert naar per-run installeren of richt
  pull-credentials op de runner in. (2) één bron pin↔tag — een pin-bump werkt
  .tool-versions én de gate-tag in dezelfde commit bij, met een volgorde die
  voorkomt dat een gate het nieuwe tag pullt vóór ci-image het publiceerde.

Fase 1 blijft inert: de live-gates zijn ongewijzigd.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ci(ci-image): installeer node + docker-CLI in de job vóór checkout/build
Some checks failed
static-gate / static-gate (pull_request) Has been cancelled
scans / scans (pull_request) Has been cancelled
3f0acddaa1
De job draait in een kaal ubuntu:24.04 (runner-default) zonder node, waardoor
actions/checkout (een node-actie) faalde op "node: not found". Zelfde patroon als
de andere workflows: node eerst installeren. Plus de docker-CLI (de dind-runner
levert de daemon) om het image te bouwen en te pushen, en git voor checkout. Een
`docker version`-regel maakt meteen zichtbaar of de daemon bereikbaar is.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ci(ci-image): draai een dind-service als docker-daemon voor build+push
Some checks are pending
scans / scans (pull_request) Successful in 5m56s
static-gate / static-gate (pull_request) Has started running
9ff030646b
De vorige run faalde niet op auth (docker login SLAAGDE) maar op de bouw: de job
draait in een container zonder docker-daemon (/var/run/docker.sock ontbreekt).
Standaardoplossing: een docker:27-dind service meestarten (--privileged, TLS uit
→ platte TCP 2375) en de CLI erheen wijzen via DOCKER_HOST. Een wachtlus laat de
build pas los als de daemon luistert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ci(ci-image): bouw tegen de bestaande dind via het gedeelde netwerk
Some checks failed
scans / scans (pull_request) Failing after 5s
static-gate / static-gate (pull_request) Failing after 5s
310c9dd4a3
De runner-config kreeg `network: forgejo-stack_default`, zodat job-containers de
al draaiende dind-daemon bereiken op `docker-in-docker:2375` (dockerd --tls=false).
De eigen dind-service is daarmee overbodig en verwijderd; de docker-CLI wijst via
DOCKER_HOST naar die host. Node/CLI-install en de wachtlus blijven.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ci(ci-image): bouw tegen de dind-daemon via de netwerk-gateway (172.30.0.1)
Some checks are pending
scans / scans (pull_request) Successful in 3m40s
static-gate / static-gate (pull_request) Has started running
53cdcb7f14
Job-containers draaien ín de dind; ze staan op het dind-netwerk
`forgejo-stack_default` (aangemaakt met vaste gateway 172.30.0.1), en die gateway
ís de dind-daemon (dockerd luistert op 0.0.0.0:2375). DOCKER_HOST wijst daarheen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno force-pushed ci/prebaked-image from 53cdcb7f14
Some checks are pending
scans / scans (pull_request) Successful in 3m40s
static-gate / static-gate (pull_request) Has started running
to df09cdd03d
All checks were successful
scans / scans (pull_request) Successful in 7m58s
static-gate / static-gate (pull_request) Successful in 30m22s
2026-08-02 23:05:06 +00:00
Compare
docs(checks): beschrijf static-gate/linux-gate op het voorgebakken image
All checks were successful
static-gate / static-gate (pull_request) Successful in 6m9s
scans / scans (pull_request) Successful in 7m23s
9d61dd5df1
De twee gate-secties in CHECKS.md en de linux-gate-kop beschreven nog het oude
"kaal ubuntu + Flutter-download per run"-verhaal. Nu in overeenstemming met de
code: beide draaien op het CI-image (toolchain + gepinde Flutter ingebakken),
alleen pub + dartcv blijven op actions/cache, provenance ongewijzigd
(sha256 → bouwtijd), tag = pin (fail-closed via check-toolchain).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 1c21d35bc2 into main 2026-08-02 23:45:31 +00:00
Sign in to join this conversation.
No description provided.