ci: uitrol wacht zonder draaiende bouwmachine op de kwaliteitscontroles - #174
Merged
Merged
Conversation
De `gate`-job hield per deploy-run gemiddeld 461 s een runner bezet met `sleep 15`, omdat de verplichte checks in aparte workflows draaien en er dus geen `needs:` aan te hangen viel. Over 3-10 augustus 2026: 51 runs, 23.522 s (6 u 32 min) wachtende runner en ~6.000 API-verzoeken. test.yml, detekt.yml, pin-consistency.yml en cflite_pr.yml krijgen een `workflow_call`-trigger en worden vanuit deploy.yml aangeroepen. De gate blijft bestaan als aggregator van `needs.*.result` — daar staat de "overgeslagen telt als OK"-regel één keer, in plaats van als `always() && ...`-formule op elk van de zes deploy-jobs. Dubbele runs worden voorkomen door de PR-trigger van de aangeroepen workflows te beperken tot `branches-ignore: [main]`, het complement van deploy.yml's `branches: [main]`: een gestapelde PR draait ze zelfstandig, een PR naar main draait ze hier. cflite_pr.yml draait voortaan alleen als aangeroepen workflow — fuzzing gold al uitsluitend voor PR's naar main. De workflow-brede concurrency verhuist naar job-niveau. Met de tests in deze workflow zou `cancel-in-progress: false` op workflow-niveau een opvolgende push laten wachten op de vorige deploy en de achterhaalde testrun helemaal uit laten draaien; `true` zou een lopende ZAD-deploy halverwege kunnen afbreken. Per job: build/toetsing breken af, deploy en cleanup krijgen een eigen groep per project en doel-deployment. Branch protection op main moet mee: `test` -> `checks-test / test`, `detekt-gate` -> `checks-detekt / detekt-gate`, `infra-image-pins` -> `checks-pins / infra-image-pins`, `PR` -> `checks-fuzz / PR`. Refs #173 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Contributor
JaCoCo coverage
|
…kost GitHub's default job-timeout is 360 minuten. Een job die hangt houdt zo lang een runner bezet voordat iemand ingrijpt. De waarden staan op ~3x de waargenomen maximumduur. Refs #173 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ericwout-overheid
marked this pull request as draft
August 10, 2026 12:41
Refs #173, #176 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ericwout-overheid
marked this pull request as ready for review
August 10, 2026 14:16
mreuvekamp
previously approved these changes
Aug 11, 2026
…onder-wachtende-runner # Conflicts: # .github/workflows/deploy.yml
mreuvekamp
approved these changes
Aug 11, 2026
2 tasks
ericwout-overheid
pushed a commit
that referenced
this pull request
Aug 12, 2026
De impliciete success() op deploy-test-uitvraag/-externe-stubs/-magazijnen kijkt niet alleen naar hun vier directe needs, maar transitief door tot checks-fuzz — die bij elke push naar main 'skipped' is (PR-only check). Sinds #174 werden de drie test-deploys daardoor bij elke push stilzwijgend overgeslagen, ook al waren meta/build/build-externe-stubs/gate stuk voor stuk 'success'. gate's eigen !cancelled()-fix (#174) beschermt alleen gate zelf, niet de jobs die ervan afhangen.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Important
Deze PR hernoemt vier required status checks. Branch protection op
mainmoet in dezelfdebeweging mee, en de volgorde waarin dat gebeurt bepaalt of de zeven andere open PR's
tussentijds vastlopen. Lees Handmatige stap vóór de merge
vóórdat je mergt. Er is bewust niets aan branch protection gewijzigd.
De uitrol naar de testomgeving wachtte op een eigen bouwmachine tot de kwaliteitscontroles groen
waren: gemiddeld 7 minuten en 41 seconden per wijziging, waarin die machine niets deed dan elke
15 seconden vragen of de controles al klaar waren. Deze PR laat de uitrol daar met een gewone
afhankelijkheid aan hangen, zodat er niets meer staat te wachten. De poort duurt nu 4 seconden
in plaats van 461 — en blokkeert nog steeds, aantoonbaar, een revisie die een verplichte
controle niet haalt.
Closes #173
Wat er verandert
test.yml,detekt.yml,pin-consistency.ymlencflite_pr.ymlkrijgen eenworkflow_call-trigger en worden vanuitdeploy.ymlals job aangeroepen. Daardoor kan de deployer met
needs:aan hangen. Degate-job blijft bestaan, maar verliest zijn poll-lus en wordt eenaggregator van
needs.*.result— daar staat de "overgeslagen telt als OK"-regel één keer, inplaats van als
always() && …-formule op elk van de zes deploy-jobs.Dubbele runs worden voorkomen door de PR-trigger van de aangeroepen workflows te beperken tot
branches-ignore: [main], precies het complement vandeploy.yml'sbranches: [main]. Eengestapelde PR (base ≠ main) draait ze zelfstandig; een PR naar main draait ze hier.
cflite_pr.ymldraait voortaan uitsluitend als aangeroepen workflow — fuzzing gold al alleen voor PR's naar main.
De workflow-brede
concurrencyverhuist naar job-niveau. Met de tests binnen deze workflow zoucancel-in-progress: falseop workflow-niveau een opvolgende push laten wachten tot de vorigedeploy klaar is én de achterhaalde testrun helemaal uit laten draaien — precies de verspilling die
we wegnemen — terwijl
trueeen lopende ZAD-deploy halverwege zou kunnen afbreken. Per job kan hetallebei: build- en toetsjobs breken achterhaald werk af, deploy- en cleanup-jobs krijgen een eigen
groep per project + doel-deployment die nooit afbreekt.
Twee kleinere posten uit dezelfde analyse zijn meegenomen:
timeout-minutesop elke job (GitHub'sdefault is 360 minuten, dus een hangende job kost zes uur runner voordat iemand ingrijpt), en de
permissions: read-allvantest.yml/detekt.ymlteruggebracht tot wat de jobs echt nodighebben — een aangeroepen workflow mag toch niet meer rechten hebben dan de caller-job toekent.
De afweging van de drie richtingen — inclusief waarom
workflow_runafvalt — staat indocs/plans/2026-08-10-deploy-gate-zonder-wachtende-runner.md. Kort: bijworkflow_runhangen decheck-runs aan de default branch in plaats van aan de head-SHA van de PR, en zo'n workflow triggert
pas als hij op de default branch staat. De wijziging met het grootste "blokkeert alle merges"-risico
zou dan de enige zijn die je niet vooraf op een PR kunt uitproberen.
Branch protection op
mainpint required contexts op check-run-namen. Door de aanroep krijgen diehet caller-job-voorvoegsel. Zet ze om nadat deze PR groen is en vóór de merge:
testchecks-test / testdetekt-gatechecks-detekt / detekt-gateinfra-image-pinschecks-pins / infra-image-pinsPRchecks-fuzz / PROngewijzigd:
Analyze (kotlin),deploy-preview-uitvraag,deploy-preview-externe-stubs,deploy-preview-magazijnen,strict: true.Tot die omzetting is deze PR niet merge-baar: de oude contexts verschijnen niet meer. Dat de
nieuwe contexts wél al op deze PR staan, is precies het voordeel van deze richting boven
workflow_run.De volgorde is de hele afweging
De nieuwe namen bestaan alléén op branches die deze wijziging al bevatten. De zeven andere open
PR's (#172, #170, #168, #166, #163, #150, #147) draaien nog de workflows van
mainen producerendus nog de oude namen. Er is geen moment waarop beide sets tegelijk bestaan, dus wie de knop ook
omzet: één van de twee groepen is even geblokkeerd. Drie routes, met hun prijs:
main. Houd het venster kort: zet om, merge direct, meld het in het kanaal.strict: truestaat aan, dus de andere PR's moeten na de merge sowieso rebasen. Het extraongemak van route 1 is dus vooral timing, niet extra werk: de rebase moest toch gebeuren.
Er is bewust niets aan branch protection gewijzigd vanuit deze PR — het is een handmatige stap
buiten de repo, en wie hem zet moet weten wat er in het venster ertussen gebeurt.
Meting
Reproduceerbaar met:
Vóór (3–10 augustus 2026)
gatetestPR(fuzz)detekt-gateinfra-image-pinsbuild(matrix ×2)Twee dingen die de richtingskeuze bepaalden: de fuzz-check is de langste pool (526 s), niet
test; enbuildduurt maar 83 s, dus "gate pas na de build starten" (richting 3) zou hooguit18% schelen.
Ná (deze PR)
gaterunnertijdTer controle draaide in hetzelfde tijdvak een run van een andere branch
(31389684161) nog
op de oude, gepollde gate uit
main: 526 s. Zelfde infrastructuur, zelfde moment.Doorlooptijd niet verslechterd. Van run-start tot de eerste preview-deploy: 475 s en 655 s ná,
tegenover gemiddeld 735 s (spreiding 434–936 s, n=38) ervóór. Die doorlooptijd wordt bepaald door
de traagste check (fuzz 526 s, test 420 s), niet door de poort — de poort zat er alleen naast te
wachten. Met n=2 is dit "binnen de bestaande spreiding", geen aantoonbare versnelling.
Verificatie
1. De poort werkt nog — wegwerp-PR #175 forceerde detekt-bevindingen. Run
31387899696:
2. De merge-route werkt nog — alle vier nieuwe contexts verschijnen op de head-SHA van deze PR,
naast de ongewijzigde
deploy-preview-*enAnalyze (kotlin). Voor de docs-only route draaide op#175 een run waarin elke
changes-jobrun=falserapporteerde(31388993368): alle
vier de contexts verschenen als
skipped, alle deploy-jobs sloegen over, run groen — merge-barestaat.
3. Geen dubbele runs — op de branch van deze PR draaiden alleen
Deploy ZADenCodeQL:Test,detekt,Pin consistencyenClusterFuzzLite PR fuzzingstartten niet zelfstandig.4. Gestapelde PR's blijven getoetst zonder te deployen — wegwerp-PR #177 met base = deze
feature-branch draaide
Test(jobtest, 444 s, geslaagd),detektenPin consistencyzelfstandig, met de onveranderde check-namen.
Deploy ZADenClusterFuzzLite PR fuzzingstartten niet. Het complement-filter dekt dus precies één keer, aan beide kanten.
5. PR-close doet geen toetswerk meer — de close van #175
(31390338566) sloeg
alle vier de
checks-*-jobs en degateover en draaide alleen de drie cleanup-jobs.6. De rechten kloppen door de aanroep heen — de JaCoCo-coverage-comment
(
pull-requests: writevia de caller-job), de ZAD-preview-comment en de detekt-SARIF-upload(
security-events: write) werkten alle drie op deze PR.Kanttekening: bij de eerste run faalde
deploy-preview-magazijnenoptimed out waiting for application to be created. Dat is de bekende Argo-Application-wait aan ZAD-zijde die in de kop vandeploy.ymlstaat beschreven; de tweede run deployde hetzelfde project zonder wijziging succesvol.Samenloop met #172
#172 landde op main terwijl deze PR openstond en raakt dezelfde jobs. Bij het samenvoegen (merge
03f5043) drie conflicten indeploy.yml, alle drie opgelost richting "beide behouden":gatehoudt zijnneeds-lijst en!cancelled()uit deze PR, met de nauwkeurigerecomment-tekst van fix(ci): preview rolt uit per commit via unieke image-tag #172 (docs-only of bot-PR).
build/build-externe-stubshouden dechanges-afhankelijkheid van fix(ci): preview rolt uit per commit via unieke image-tag #172 én dejob-concurrency hiervandaan. Het oorspronkelijke argument voor die concurrency — voorkomen dat
twee runs dezelfde tag overschrijven — is met de per-commit-tag vervallen; wat blijft is dat een
achterhaalde build geen runnertijd hoeft te kosten. Comment daarop aangepast.
cleanup-preview-*-jobs nemen de versmalling van fix(ci): preview rolt uit per commit via unieke image-tag #172 over (packages: writeenneeds: metaweg), met de job-concurrency entimeout-minuteshiervandaan erbovenop. De nieuwejob
cleanup-preview-imagesheefttimeout-minutesgekregen.De per-commit-tag werkt na de merge: run
31473630425 pushte
fbs-berichtenuitvraag:pr-174-03f5043, gelijk aan de head-sha.gatedeed er 3 s over; alle driede previews rolden uit.
Eén nieuw randgeval, eerlijk gemeld: een close-run wacht niet meer op een nog lopende build
van een eerdere push (venster ≈ 85 s), dus
cleanup-preview-imageskan die net mislopen en éénghcr-versie laten staan. Geen kapotte deploy; herdraaien ruimt hem op. Staat als bekende beperking
in
deploy.ymlen met denkrichting in MinBZK/MijnOverheidZakelijk#934.Eén post uit MinBZK/MijnOverheidZakelijk#934 is door #172 al opgelost:
buildhangt daar nu zelf aanchanges.Wat blijft staan
Vier kleinere posten uit dezelfde analyse staan met meetgegevens in MinBZK/MijnOverheidZakelijk#934 — waaronder de vier
changes-jobs die dezelfde vraag stellen, en de preview-uitrol voor PR's die de applicatie nietraken (de enige post met echt clusterverbruik). Elk is bewust doorgeschoven; de afwegingen staan
in het plan.