feat(ci): poort op de systeembibliotheken die de Linux-build nodig heeft #1764

Merged
brenno merged 1 commit from fix/linux-deps-poort into main 2026-08-24 08:53:02 +00:00
Owner

Waarom

v0.4.9 kreeg geen release. Niet omdat er iets stuk was dat een poort had kunnen
zien, maar omdat niets de Linux-desktop bouwt tussen een merge en een tag:
make check(-no-coverage) draait flutter test, en flutter build linux komt
pas in de releaseketen langs. De nativeapi-migratie (#1741) bracht cnativeapi
mee, dat op Linux ayatana-appindicator3-0.1 opeist — de enige van zijn vier
pkg-config-modules die libgtk-3-dev niet meebrengt. CMake viel om vóórdat er
iets gecompileerd werd, de job linux faalde, publiceren needt hem, en de tag
leverde niets op. Van de merge tot de tag stond alles groen.

De reparatie zelf zit in #1762. Dit is de poort eromheen.

Twee lagen, bewust gescheiden

1. make check-linux-deps (in de STATIC_GATES, dus op elke PR). Leest élke
pkg_check_modules(... REQUIRED ...) uit de opgeloste plugin-bronnen en legt die
naast .github/linux-pkgconfig-modules.json: welk apt-pakket levert de module,
welke buildomgevingen moeten dat installeren, en welke runtime-bibliotheek
moeten het .deb en de AUR-PKGBUILD noemen.

  • Beide richtingen fataal. Een module die niemand installeert is de fout
    hierboven; een pakket dat geen plugin meer vraagt laten we gebruikers voor
    niets installeren.
  • Een buildomgeving is een samenstelling, geen bestand: de release-job
    installeert een deel en erft de rest van het voorgebakken image, dus elke
    omgeving noemt alle bestanden die het pakket mogen dragen.
  • Commentaar telt niet mee. De zin die een pakket uitlegt is niet de regel
    die het installeert — zonder die regel houd je de poort groen door alleen het
    apt-argument te schrappen.
  • Getoetst door de faalgevallen na te spelen: manifest zonder de module (=
    precies het moment van #1741) en een apt-regel zonder het pakket. Allebei rood,
    met een melding die het bestand noemt dat bijgewerkt moet worden.

2. linux-build.yml draait weer na een merge naar main — maar alleen als
pubspec.yaml/pubspec.lock, linux/, third_party/ of het CI-image
veranderde. Laag 1 ziet alleen wat via pkg-config wordt gevraagd; find_library,
een header of een build-script dat een tool aanroept blijven onzichtbaar, en
daarvoor moet er echt gebouwd worden.

Dit kost runnertijd — dat is de afweging in deze PR. #790 zette deze
workflow uit omdat hij bij élke push 17,5 minuten kostte en release.yml toch al
bouwde. Dat argument klopt nog steeds voor het inpakken; het klopte niet voor het
bouwen zelf, en die vergissing kostte een release. Het padfilter is het
compromis: bij gewoon Dart-werk zwijgt hij, dus dit valt een paar keer per maand.
Wil je die minuten niet, schrap dan de push:-trekker en houd laag 1 — zeg het,
dan haal ik hem eruit.

Toetsing

  • make check groen (exit 0).
  • test/linux_pkgconfig_manifest_test.dart draait de tekstelijke helft van het
    manifest ook in de suite, zodat een scheefgegroeid manifest ook faalt waar de
    pub-cache niet gevuld is.
  • Gedocumenteerd in docs/CHECKS.md, inclusief het plafond van laag 1.

Bewaker

Overgeslagen, expliciet: poorten en documentatie, geen formaat-, opslag- of
beloftewijziging. Wat het wél raakt is een afhankelijkheid van buiten die we
gebruikers opleggen — en dat is precies wat de poort zichtbaar maakt in plaats
van verbergt.

## Waarom v0.4.9 kreeg geen release. Niet omdat er iets stuk was dat een poort had kunnen zien, maar omdat **niets de Linux-desktop bouwt tussen een merge en een tag**: `make check(-no-coverage)` draait `flutter test`, en `flutter build linux` komt pas in de releaseketen langs. De nativeapi-migratie (#1741) bracht `cnativeapi` mee, dat op Linux `ayatana-appindicator3-0.1` opeist — de enige van zijn vier pkg-config-modules die `libgtk-3-dev` niet meebrengt. CMake viel om vóórdat er iets gecompileerd werd, de job `linux` faalde, `publiceren` needt hem, en de tag leverde niets op. Van de merge tot de tag stond alles groen. De reparatie zelf zit in #1762. Dit is de poort eromheen. ## Twee lagen, bewust gescheiden **1. `make check-linux-deps`** (in de `STATIC_GATES`, dus op elke PR). Leest élke `pkg_check_modules(... REQUIRED ...)` uit de opgeloste plugin-bronnen en legt die naast `.github/linux-pkgconfig-modules.json`: welk apt-pakket levert de module, welke buildomgevingen moeten dat installeren, en welke runtime-bibliotheek moeten het `.deb` en de AUR-PKGBUILD noemen. - **Beide richtingen fataal.** Een module die niemand installeert is de fout hierboven; een pakket dat geen plugin meer vraagt laten we gebruikers voor niets installeren. - **Een buildomgeving is een samenstelling**, geen bestand: de release-job installeert een deel en erft de rest van het voorgebakken image, dus elke omgeving noemt alle bestanden die het pakket mogen dragen. - **Commentaar telt niet mee.** De zin die een pakket uitlegt is niet de regel die het installeert — zonder die regel houd je de poort groen door alleen het apt-argument te schrappen. - **Getoetst door de faalgevallen na te spelen:** manifest zonder de module (= precies het moment van #1741) en een apt-regel zonder het pakket. Allebei rood, met een melding die het bestand noemt dat bijgewerkt moet worden. **2. `linux-build.yml` draait weer na een merge naar `main`** — maar alleen als `pubspec.yaml`/`pubspec.lock`, `linux/`, `third_party/` of het CI-image veranderde. Laag 1 ziet alleen wat via pkg-config wordt gevraagd; `find_library`, een header of een build-script dat een tool aanroept blijven onzichtbaar, en daarvoor moet er echt gebouwd worden. **Dit kost runnertijd — dat is de afweging in deze PR.** #790 zette deze workflow uit omdat hij bij élke push 17,5 minuten kostte en `release.yml` toch al bouwde. Dat argument klopt nog steeds voor het inpakken; het klopte niet voor het bouwen zelf, en die vergissing kostte een release. Het padfilter is het compromis: bij gewoon Dart-werk zwijgt hij, dus dit valt een paar keer per maand. Wil je die minuten niet, schrap dan de `push:`-trekker en houd laag 1 — zeg het, dan haal ik hem eruit. ## Toetsing - `make check` groen (exit 0). - `test/linux_pkgconfig_manifest_test.dart` draait de tekstelijke helft van het manifest ook in de suite, zodat een scheefgegroeid manifest ook faalt waar de pub-cache niet gevuld is. - Gedocumenteerd in `docs/CHECKS.md`, inclusief het plafond van laag 1. ## Bewaker Overgeslagen, expliciet: poorten en documentatie, geen formaat-, opslag- of beloftewijziging. Wat het wél raakt is een *afhankelijkheid van buiten* die we gebruikers opleggen — en dat is precies wat de poort zichtbaar maakt in plaats van verbergt.
feat(ci): poort op de systeembibliotheken die de Linux-build nodig heeft
All checks were successful
scans / scans (pull_request) Successful in 6m56s
static-gate / static-gate (pull_request) Successful in 18m38s
f23177bb60
v0.4.9 kreeg geen release omdat niets de Linux-desktop bouwt tussen een merge en
een tag. `make check(-no-coverage)` draait `flutter test`; `flutter build linux`
kwam pas in de releaseketen langs. De nativeapi-migratie (#1741) bracht een
plugin mee die op Linux `ayatana-appindicator3-0.1` opeist — de enige van zijn
vier pkg-config-modules die libgtk-3-dev niet meebrengt — en CMake viel om
voordat er iets gecompileerd was. Alle poorten stonden intussen groen.

Twee lagen, bewust gescheiden:

`make check-linux-deps` leest élke `pkg_check_modules(... REQUIRED ...)` uit de
opgeloste plugin-bronnen en legt die naast .github/linux-pkgconfig-modules.json:
welk apt-pakket levert de module, welke buildomgevingen moeten dat installeren,
en welke runtime-bibliotheek moeten het .deb en de PKGBUILD noemen. Beide
richtingen fataal. Een buildomgeving is een samenstelling (image + apt-regel), en
commentaar telt niet mee — de zin die een pakket uitlegt is niet de regel die het
installeert. De poort zit in de STATIC_GATES, dus hij draait op elke PR; de
tekstelijke helft draait ook los in de suite. Getoetst door beide faalgevallen na
te spelen: manifest zonder de module (= het moment van #1741) en een apt-regel
zonder het pakket.

De poort ziet alleen wat via pkg-config wordt gevraagd — `find_library`, een
header of een build-script dat een tool aanroept blijven onzichtbaar. Daarvoor
moet er echt gebouwd worden, dus linux-build.yml draait weer na een merge naar
main, maar alleen als pubspec.lock/yaml, linux/, third_party/ of het CI-image
veranderde. Dat zijn de invoeren die een native build kunnen breken; bij gewoon
Dart-werk zwijgt hij, dus de 17,5 minuten waar #790 hem om uitzette vallen een
paar keer per maand in plaats van bij elke push.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
brenno merged commit 01a35bb3d4 into main 2026-08-24 08:53:02 +00:00
Sign in to join this conversation.
No description provided.