feat(ci): macOS en Windows bouwen ook na een merge + repetitie bij een toolchain-bump #1781

Merged
brenno merged 2 commits from feat/platformbuilds-post-merge into main 2026-08-24 20:51:37 +00:00
Owner

Gestapeld op #1778 (die moet eerst).

1. De rotatietoetsen toetsten de testomgeving

De Windows-job stond nog op twee rood, en de diagnose uit #1774 gaf twee keer dezelfde melding: PathAccessException … errno = 32. Mijn twee reparaties daarvoor — de beeldcache loslaten en blokkerend herkansen — veranderden er niets aan, en dát is het bewijs waar het om draait.

Binnen testWidgets draait de echte gebeurtenislus niet. De asynchrone leesbeurt waarmee de voorvertoning het bestand inleest rondt daardoor nooit af, dus de test houdt de bestandshandle open zolang hij duurt. Op POSIX valt dat niet op (een geopend bestand mag je vervangen), op Windows blokkeert het élke schrijfbeurt. De app mankeert hier waarschijnlijk niets: een gebruiker drukt seconden later op Klaar, met een lopende gebeurtenislus, en dan is die leesbeurt allang afgerond.

De toets laat die leesbeurt nu afronden (tester.runAsync) vóór ze handelt. Het commentaar bij de herkansingshulp beweerde dat de houder "een ander proces" is; dat is voor dit geval weerlegd en staat er nu bij. De herkansing zelf blijft — voor de houder waarvoor ze wél iets kan doen.

Wat dit betekent voor de eerdere PR's: de Windows-terugval (#1763) en de herstelkopie (#1776) blijven terecht — dat waren echte gebreken, waaronder een pad waarlangs een mislukte schrijfbeurt een bestaand bestand kon laten verdwijnen. Alleen de dúiding van de rotatietoets was mis.

2. macOS en Windows bouwen na een merge

Geen enkele poort bouwt een desktop-app. Voor Linux is dat opgelost in #1764; nu de andere twee, met hetzelfde padfilter en dezelfde afweging:

  • macos-build.yml draait weer na een merge (eigen Mac-runner).
  • .github/workflows/windows-native-check.yml is nieuw: flutter build windows --release op de spiegel, want hier staat geen Windows-machine. Bouwt en gooit het resultaat weg — controle, geen levering.

3. Repetitie bij een toolchain-bump

toolchain-rehearsal.yml: een PR die .tool-versions raakt laat de volledige spiegel-CI over díe tak draaien (Linux-build, macOS-tests, Windows-suite) en faalt zichtbaar. Dat is de enige wijziging die alle drie de platformen tegelijk kan breken.

Advies, geen slot — de takbescherming eist alleen static-gate; wil je hem blokkerend, dan is dat een instelling op de forge. Zonder GH_DISPATCH_TOKEN (fork-PR) slaat hij zichzelf over in plaats van rood te worden voor iets waar de indiener niets aan kan doen.

test/native_build_triggers_test.dart bewaakt de drie padfilters én de repetitie: een build die niet afgaat bewaakt niets.

Toetsing

  • make check groen (exit 0).
  • Wat dit niet bewijst: dat de twee rotatietoetsen op de echte Windows-runner groen worden, en dat de drie nieuwe trekkers in de praktijk afgaan. Dat toetst de eerstvolgende spiegel-run en de eerstvolgende merge die pubspec of de pin raakt. De diagnose uit #1774 blijft staan, dus als het opnieuw misgaat noemt hij de reden.

Bewaker

Overgeslagen, expliciet: CI-configuratie, een toets en documentatie. Wel kost dit runnertijd op jouw eigen machines; de afweging staat in het kopcommentaar van elke workflow.

Gestapeld op #1778 (die moet eerst). ## 1. De rotatietoetsen toetsten de testomgeving De Windows-job stond nog op twee rood, en de diagnose uit #1774 gaf twee keer dezelfde melding: `PathAccessException … errno = 32`. Mijn twee reparaties daarvoor — de beeldcache loslaten en blokkerend herkansen — veranderden er niets aan, en dát is het bewijs waar het om draait. Binnen `testWidgets` draait de echte gebeurtenislus niet. De asynchrone leesbeurt waarmee de voorvertoning het bestand inleest rondt daardoor nooit af, dus de test houdt de bestandshandle open zolang hij duurt. Op POSIX valt dat niet op (een geopend bestand mag je vervangen), op Windows blokkeert het élke schrijfbeurt. **De app mankeert hier waarschijnlijk niets**: een gebruiker drukt seconden later op Klaar, met een lopende gebeurtenislus, en dan is die leesbeurt allang afgerond. De toets laat die leesbeurt nu afronden (`tester.runAsync`) vóór ze handelt. Het commentaar bij de herkansingshulp beweerde dat de houder "een ander proces" is; dat is voor dit geval weerlegd en staat er nu bij. De herkansing zelf blijft — voor de houder waarvoor ze wél iets kan doen. **Wat dit betekent voor de eerdere PR's:** de Windows-terugval (#1763) en de herstelkopie (#1776) blijven terecht — dat waren echte gebreken, waaronder een pad waarlangs een mislukte schrijfbeurt een bestaand bestand kon laten verdwijnen. Alleen de dúiding van de rotatietoets was mis. ## 2. macOS en Windows bouwen na een merge Geen enkele poort bouwt een desktop-app. Voor Linux is dat opgelost in #1764; nu de andere twee, met hetzelfde padfilter en dezelfde afweging: - `macos-build.yml` draait weer na een merge (eigen Mac-runner). - `.github/workflows/windows-native-check.yml` is nieuw: `flutter build windows --release` op de spiegel, want hier staat geen Windows-machine. Bouwt en gooit het resultaat weg — controle, geen levering. ## 3. Repetitie bij een toolchain-bump `toolchain-rehearsal.yml`: een PR die `.tool-versions` raakt laat de volledige spiegel-CI over díe tak draaien (Linux-build, macOS-tests, Windows-suite) en faalt zichtbaar. Dat is de enige wijziging die alle drie de platformen tegelijk kan breken. **Advies, geen slot** — de takbescherming eist alleen `static-gate`; wil je hem blokkerend, dan is dat een instelling op de forge. Zonder `GH_DISPATCH_TOKEN` (fork-PR) slaat hij zichzelf over in plaats van rood te worden voor iets waar de indiener niets aan kan doen. `test/native_build_triggers_test.dart` bewaakt de drie padfilters én de repetitie: een build die niet afgaat bewaakt niets. ## Toetsing - `make check` groen (exit 0). - Wat dit **niet** bewijst: dat de twee rotatietoetsen op de echte Windows-runner groen worden, en dat de drie nieuwe trekkers in de praktijk afgaan. Dat toetst de eerstvolgende spiegel-run en de eerstvolgende merge die pubspec of de pin raakt. De diagnose uit #1774 blijft staan, dus als het opnieuw misgaat noemt hij de reden. ## Bewaker Overgeslagen, expliciet: CI-configuratie, een toets en documentatie. Wel kost dit runnertijd op jouw eigen machines; de afweging staat in het kopcommentaar van elke workflow.
fix(ci): een kale Flutter-bump sloeg de post-merge Linux-build over
All checks were successful
scans / scans (pull_request) Successful in 4m51s
static-gate / static-gate (pull_request) Successful in 9m2s
a43ca64b69
Het padfilter uit #1764 noemde de opgeloste afhankelijkheden, `linux/`,
`third_party/` en het CI-image — maar niet `.tool-versions`. Een bump die óók
pakketten meeneemt raakt `pubspec.lock` en gaat dus vanzelf af; een kále
pin-bump raakt alleen `.tool-versions`, de workflows en de documentatie. Juist
die verandert de compiler, de engine en de gegenereerde CMake onder de
Linux-build. De preventielaag sloeg daarmee precies de wijziging over waarvoor
ze het meest nodig is.

`test/linux_pkgconfig_manifest_test.dart` bewaakt de lijst nu: elke invoer die
een native build kan breken moet in het filter staan, mét de reden erbij. Een
build die niet afgaat bewaakt niets, en dat hoort niet stil te kunnen inkorten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
brenno force-pushed feat/platformbuilds-post-merge from 9f0d8e1833
All checks were successful
scans / scans (pull_request) Successful in 3m5s
static-gate / static-gate (pull_request) Successful in 6m40s
to 17971184b1
All checks were successful
scans / scans (pull_request) Successful in 2m2s
static-gate / static-gate (pull_request) Successful in 4m52s
2026-08-24 19:30:05 +00:00
Compare
brenno force-pushed feat/platformbuilds-post-merge from 9f0d8e1833
All checks were successful
scans / scans (pull_request) Successful in 3m5s
static-gate / static-gate (pull_request) Successful in 6m40s
to 17971184b1
All checks were successful
scans / scans (pull_request) Successful in 2m2s
static-gate / static-gate (pull_request) Successful in 4m52s
2026-08-24 20:32:12 +00:00
Compare
brenno merged commit 31f99e71a8 into main 2026-08-24 20:51:37 +00:00
Sign in to join this conversation.
No description provided.