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>
Binnen `testWidgets` draait de echte gebeurtenislus niet. De asynchrone
leesbeurt waarmee de voorvertoning het bestand inleest rondt daardoor nooit af,
en de test houdt de bestandshandle open zolang hij duurt. Op POSIX valt dat niet
op — daar mag je een geopend bestand vervangen — maar op Windows blokkeert
diezelfde handle élke schrijfbeurt. Zo stond er een rotatietoets rood om iets
wat de app niet mankeert.

Dat is ook waarom mijn vorige twee pogingen niets uithaalden: eviction en vier
blokkerende herkansingen kunnen een leesbeurt niet laten afronden die op de
isolate wacht die je juist blokkeert. De Windows-CI heeft dat twee keer laten
zien.

De toets laat die leesbeurt nu afronden met `tester.runAsync` vóór ze handelt,
en bootst daarmee na wat een gebruiker vanzelf doet: seconden later op Klaar
drukken in plaats van in dezelfde bevroren tick. Het commentaar bij de
herkansingshulp beweerde dat de houder "een ander proces" is; dat is voor dit
geval weerlegd en staat er nu bij.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat(ci): macOS en Windows bouwen ook na een merge, en een pin-bump krijgt een repetitie
All checks were successful
scans / scans (pull_request) Successful in 3m5s
static-gate / static-gate (pull_request) Successful in 6m40s
9f0d8e1833
Vervolg op #1764: geen enkele poort bouwt een desktop-app, dus een wijziging die
de *build* breekt kwam pas bij de tag aan het licht. Voor Linux is dat opgelost;
macOS en Windows liepen nog achter.

- macos-build.yml draait weer na een merge naar main (eigen Mac-runner), bij
  wijziging in pubspec*, .tool-versions, macos/ of third_party/.
- .github/workflows/windows-native-check.yml is nieuw: `flutter build windows
  --release` op de spiegel bij dezelfde soort wijziging. Bouwt en gooit het
  resultaat weg — een controle, geen levering. Windows heeft hier geen machine,
  dus zonder dit was de releaseketen de eerste die het merkte, en Windows heeft
  dezelfde geschiedenis als Linux (MSVC botste ooit met dartcv4's OpenCV, #870).
  De Flutter-pin staat er letterlijk in en is toegevoegd aan
  versionClaimPatterns, zodat het geen tweede plek is om te vergeten.
- toolchain-rehearsal.yml is nieuw: een PR die .tool-versions raakt laat de
  volledige spiegel-CI over díe tak draaien en faalt zichtbaar als daar iets
  omvalt. Een toolchain-bump is de enige wijziging die alle drie de platformen
  tegelijk kan breken. Advies, geen slot: de takbescherming eist alleen
  static-gate. 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.

De verouderde telling in CHECKS.md ("vijftien claims in zeven bestanden", allebei
al onwaar) is vervangen door een verwijzing naar de poort, die de getallen zelf
print.

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.