You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bij MinBZK/moza-poc-fbs-berichtenbox#173 is de grootste verspilling in de bouwstraat weggenomen: een machine die per wijziging
bijna acht minuten stond te wachten. Tijdens die analyse kwamen vier kleinere posten boven water
die nog blijven staan. Elk is klein genoeg om níét met MinBZK/moza-poc-fbs-berichtenbox#173 mee te nemen, en samen groot genoeg om
niet te vergeten.
Effect
Machinetijd en cluster-capaciteit die geen resultaat opleveren. Geen van deze posten raakt de
werking van de dienst; het gaat om verbruik zonder functie.
Wat er nog blijft staan
Dezelfde vraag vier keer stellen. Vier processen bepalen elk apart of een wijziging alleen
documentatie raakt. Samen ~211 korte machinestarts per week.
Een pakket herbouwen dat niet veranderd is. Het testhulpje voor externe koppelingen wordt
bij elke wijziging opnieuw gebouwd en gepubliceerd, ook als er niets aan veranderd is.
Een voorvertoning uitrollen die identiek is aan de vorige. Wijzigingen die de applicatie
niet raken (bouwstraat-configuratie, voorbeeldverzoeken) rollen toch drie voorvertoningen uit.
Dit is de enige post die echte serverruimte kost in plaats van alleen machinetijd.
Een achtergebleven pakket bij snel sluiten. Sluit iemand een voorstel binnen ~85 seconden na
een wijziging, dan kan het opruimen klaar zijn vóórdat de laatste bouw zijn pakket publiceert.
Dat pakket blijft dan staan. Geen storing, wel een langzaam groeiende berg.
Acceptatiecriteria
Per post geldt: óf het verbruik verdwijnt, óf er ligt een vastgelegde afweging waarom het blijft.
Voorwaarde bij elke oplossing: een wijziging mag nooit stilzwijgend ongetoetst of onuitgerold
blijven — een controle die "overgeslagen" rapporteert telt door als geslaagd, dus een fout in de
overslag-logica is direct een gat in de kwaliteitsbewaking.
Technische context
1. Vier changes-jobs met dezelfde detectie
deploy.yml, test.yml, detekt.yml en cflite_pr.yml hebben elk een changes-job. De eerste
drie draaien exact dezelfde grep -qvE '(^docs/|\.md$)'-detectie; cflite_pr.yml heeft een eigen
fuzz-relevantiefilter. Gemeten 3–10 augustus 2026: 62 + 53 + 53 + 43 = 211 jobs, ~841 s billed —
maar de echte kost is 211 runner-allocaties, niet de 14 minuten die ervan geteld worden.
Dedupliceren kan sinds MinBZK/moza-poc-fbs-berichtenbox#173 via een workflow_call-input, want deploy.yml roept de andere aan.
Valkuil die bij het uitwerken bovenkwam: laat je checks-test van changes afhangen, dan wordt
bij een falende changes-job de testjob overgeslagen — en skipped telt door als succes voor
branch protection, dus ongeteste code wordt merge-baar. Sluitbaar met !cancelled() op de
caller-job plus "sla alleen over bij een expliciete false" in plaats van "draai alleen bij true", zodat elke onverwachte toestand fail-safe naar wel draaien valt.
build en build-externe-stubs hebben daar nu needs: [meta, changes] plus needs.changes.outputs.run == 'true', en changes sluit behalve docs-only ook bot-PR's uit. De
blokkade die hier genoemd stond — de cleanup die een niet-bestaande exacte tag zou verwijderen —
verviel in dezelfde wijziging, doordat cleanup-preview-images op prefix pr-<n>- werkt.
3. build-externe-stubs zonder paths-filter
docker build + docker push van wiremock/externe-stubs bij elke commit: 52 runs, ~1.125 s in
de meetweek, plus 52 image-pushes. De inhoud wijzigt zelden. Een paths-filter is niet triviaal,
want de deploy-jobs verwachten een image op de tag van déze run; overslaan vergt een
tag-hergebruikstrategie die botst met de per-commit-tag uit MinBZK/moza-poc-fbs-berichtenbox#171/#172.
4. Preview-uitrol voor niet-applicatieve wijzigingen
Het changes-filter kijkt alleen naar docs/ en *.md. Een PR die uitsluitend .github/workflows/, bruno/ of demo/ raakt, rolt drie ZAD-previews uit met een image die
functioneel gelijk is aan de vorige. Dat is de enige post met echt clusterverbruik
(pods, volumes, ingress) in plaats van alleen runnertijd — en daarmee waarschijnlijk de grootste
energiepost van de vier.
Tegenargument: een wijziging in .github/workflows/ kán de deploy zelf raken, en dan is een
preview juist wél zinvol. Een filter moet dat onderscheid maken, of de uitzondering expliciet
benoemen.
5. Race tussen cleanup-preview-images en een lopende build
Vóór MinBZK/moza-poc-fbs-berichtenbox#174 hield een workflow-brede concurrency met cancel-in-progress: false de runs van één
PR op volgorde: een close-run wachtte op een lopende build. MinBZK/moza-poc-fbs-berichtenbox#174 verplaatste die concurrency naar
job-niveau (nodig, anders zou een opvolgende push wachten op de vorige deploy én de achterhaalde
testrun helemaal uitdraaien). Gevolg: bij een close binnen ~85 s na een push kan cleanup-preview-images de sweep afronden vóórdat de build zijn pr-<n>-<sha7>-tag pusht, en
blijft die versie staan.
De build-jobs kunnen niet in de cleanup-groep meedraaien: ze hebben er per service al één, anders
blokkeren de drie parallelle builds elkaar. Een job kan maar in één groep zitten.
Denkrichting: cleanup-preview-images als matrix over de drie packages, elke instantie in de
concurrency-groep van de bijbehorende build-job met cancel-in-progress: true — dan breekt het
opruimen de lopende build af vóór het sweept. Kost drie korte jobs per close in plaats van één
(~9 closes per week). Nog niet uitgewerkt of het de complexiteit waard is tegenover één weesversie
in een zeldzaam geval.
Staat als bekende beperking in de kop van cleanup-preview-images in deploy.yml.
Aanleiding
Bij MinBZK/moza-poc-fbs-berichtenbox#173 is de grootste verspilling in de bouwstraat weggenomen: een machine die per wijziging
bijna acht minuten stond te wachten. Tijdens die analyse kwamen vier kleinere posten boven water
die nog blijven staan. Elk is klein genoeg om níét met MinBZK/moza-poc-fbs-berichtenbox#173 mee te nemen, en samen groot genoeg om
niet te vergeten.
Effect
Machinetijd en cluster-capaciteit die geen resultaat opleveren. Geen van deze posten raakt de
werking van de dienst; het gaat om verbruik zonder functie.
Wat er nog blijft staan
documentatie raakt. Samen ~211 korte machinestarts per week.
Bouwen voor een uitrol die niet komt.Opgelost in fix(ci): preview rolt uit per commit via unieke image-tag moza-poc-fbs-berichtenbox#172 — het bouwen hangt daar nuaan dezelfde beslissing als het uitrollen, en slaat behalve documentatie-wijzigingen ook
bot-voorstellen over.
bij elke wijziging opnieuw gebouwd en gepubliceerd, ook als er niets aan veranderd is.
niet raken (bouwstraat-configuratie, voorbeeldverzoeken) rollen toch drie voorvertoningen uit.
Dit is de enige post die echte serverruimte kost in plaats van alleen machinetijd.
een wijziging, dan kan het opruimen klaar zijn vóórdat de laatste bouw zijn pakket publiceert.
Dat pakket blijft dan staan. Geen storing, wel een langzaam groeiende berg.
Acceptatiecriteria
Per post geldt: óf het verbruik verdwijnt, óf er ligt een vastgelegde afweging waarom het blijft.
Voorwaarde bij elke oplossing: een wijziging mag nooit stilzwijgend ongetoetst of onuitgerold
blijven — een controle die "overgeslagen" rapporteert telt door als geslaagd, dus een fout in de
overslag-logica is direct een gat in de kwaliteitsbewaking.
Technische context
1. Vier
changes-jobs met dezelfde detectiedeploy.yml,test.yml,detekt.ymlencflite_pr.ymlhebben elk eenchanges-job. De eerstedrie draaien exact dezelfde
grep -qvE '(^docs/|\.md$)'-detectie;cflite_pr.ymlheeft een eigenfuzz-relevantiefilter. Gemeten 3–10 augustus 2026: 62 + 53 + 53 + 43 = 211 jobs, ~841 s billed —
maar de echte kost is 211 runner-allocaties, niet de 14 minuten die ervan geteld worden.
Dedupliceren kan sinds MinBZK/moza-poc-fbs-berichtenbox#173 via een
workflow_call-input, wantdeploy.ymlroept de andere aan.Valkuil die bij het uitwerken bovenkwam: laat je
checks-testvanchangesafhangen, dan wordtbij een falende
changes-job de testjob overgeslagen — enskippedtelt door als succes voorbranch protection, dus ongeteste code wordt merge-baar. Sluitbaar met
!cancelled()op decaller-job plus "sla alleen over bij een expliciete
false" in plaats van "draai alleen bijtrue", zodat elke onverwachte toestand fail-safe naar wel draaien valt.2.
buildhangt niet aanchanges— OPGELOST in MinBZK/moza-poc-fbs-berichtenbox#172buildenbuild-externe-stubshebben daar nuneeds: [meta, changes]plusneeds.changes.outputs.run == 'true', enchangessluit behalve docs-only ook bot-PR's uit. Deblokkade die hier genoemd stond — de cleanup die een niet-bestaande exacte tag zou verwijderen —
verviel in dezelfde wijziging, doordat
cleanup-preview-imagesop prefixpr-<n>-werkt.3.
build-externe-stubszonder paths-filterdocker build+docker pushvanwiremock/externe-stubsbij elke commit: 52 runs, ~1.125 s inde meetweek, plus 52 image-pushes. De inhoud wijzigt zelden. Een paths-filter is niet triviaal,
want de deploy-jobs verwachten een image op de tag van déze run; overslaan vergt een
tag-hergebruikstrategie die botst met de per-commit-tag uit MinBZK/moza-poc-fbs-berichtenbox#171/#172.
4. Preview-uitrol voor niet-applicatieve wijzigingen
Het
changes-filter kijkt alleen naardocs/en*.md. Een PR die uitsluitend.github/workflows/,bruno/ofdemo/raakt, rolt drie ZAD-previews uit met een image diefunctioneel gelijk is aan de vorige. Dat is de enige post met echt clusterverbruik
(pods, volumes, ingress) in plaats van alleen runnertijd — en daarmee waarschijnlijk de grootste
energiepost van de vier.
Tegenargument: een wijziging in
.github/workflows/kán de deploy zelf raken, en dan is eenpreview juist wél zinvol. Een filter moet dat onderscheid maken, of de uitzondering expliciet
benoemen.
5. Race tussen
cleanup-preview-imagesen een lopendebuildVóór MinBZK/moza-poc-fbs-berichtenbox#174 hield een workflow-brede
concurrencymetcancel-in-progress: falsede runs van éénPR op volgorde: een close-run wachtte op een lopende build. MinBZK/moza-poc-fbs-berichtenbox#174 verplaatste die concurrency naar
job-niveau (nodig, anders zou een opvolgende push wachten op de vorige deploy én de achterhaalde
testrun helemaal uitdraaien). Gevolg: bij een close binnen ~85 s na een push kan
cleanup-preview-imagesde sweep afronden vóórdat de build zijnpr-<n>-<sha7>-tag pusht, enblijft die versie staan.
De build-jobs kunnen niet in de cleanup-groep meedraaien: ze hebben er per service al één, anders
blokkeren de drie parallelle builds elkaar. Een job kan maar in één groep zitten.
Denkrichting:
cleanup-preview-imagesals matrix over de drie packages, elke instantie in deconcurrency-groep van de bijbehorende build-job met
cancel-in-progress: true— dan breekt hetopruimen de lopende build af vóór het sweept. Kost drie korte jobs per close in plaats van één
(~9 closes per week). Nog niet uitgewerkt of het de complexiteit waard is tegenover één weesversie
in een zeldzaam geval.
Staat als bekende beperking in de kop van
cleanup-preview-imagesindeploy.yml.Meting
Reproduceerbaar met de scripts uit de beschrijving van MinBZK/moza-poc-fbs-berichtenbox#174.