chore: trek gedeelde config en workflow-commentaar gelijk met de rest van de organisatie - #101
Merged
Merged
Conversation
The file existed in four slightly different versions across seven repositories, differing in whitespace, ordering and which binary types they covered. This is the shared version, covering the union of all of them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
.editorconfig bestond in vijf varianten over zeven repositories. De regels waren overal al hetzelfde; alleen de comments verschilden, deels Engels en deels Nederlands. Dit is de gedeelde versie, in het Nederlands. Renovate wees per repository iemand anders aan: vijf hadden Stensel8, een had Stensel8 en AdiH1310, en vier hadden helemaal niemand staan, waardoor dependency-PR's daar bij niemand terechtkwamen. Nu overal allebei. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
De comments waren een mengeling: hugo-template en StenTijhuis stonden volledig in het Engels, LohuisHoveniers en Hagmolenpups door elkaar heen binnen hetzelfde bestand. Dat is nu overal Nederlands, gelijk aan de rest van de organisatie. Alleen commentaar. De workflowlogica is regel voor regel gecontroleerd en ongewijzigd: een diff met alle commentregels weggefilterd is leeg voor elk gewijzigd bestand, en elk bestand is opnieuw als YAML geparsed. De gedeelde bestanden zijn per stuk één keer vertaald en daarna gekopieerd, zodat config-validation.yml en setup-hugo/action.yml byte-identiek blijven over de repositories die ze delen. Twee comments klopten niet meer en zijn meegenomen: bij LohuisHoveniers stond een dubbele regel over de SARIF-upload, en op drie plekken beschreef het commentaar nog de private-guard die er inmiddels uit is. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
Alleen Zephyrus-Linux controleerde of de titel van een pull request het Conventional Commits-formaat volgt. Dat is nu overal een aparte workflow, byte-identiek en met dezelfde jobnaam, zodat de check in elke repository "Conventional commit title" heet. De titel en niet de losse commits: de titel is wat er op main terechtkomt zodra je squasht. Renovate levert zijn eigen titels al in dit formaat aan via semanticCommits, wat in alle negen repositories al aanstond; deze controle dekt de rest. De check draait ook op `edited`. Zonder dat blijft hij rood staan nadat iemand de titel heeft verbeterd, want een titelwijziging is geen nieuwe push -- een gat dat in de opzet van Zephyrus-Linux zat. In Zephyrus-Linux verhuist de bestaande job uit pr-checks.yml naar deze workflow. De jobnaam blijft gelijk, dus een branch protection-regel die op die check wacht blijft werken. De job daar meeverhuizen was nodig omdat `types` voor een hele workflow geldt: hem in pr-checks.yml zetten had de Hugo-build en de bandit-scan laten draaien zodra iemand een PR-omschrijving aanpast. CONTRIBUTING.md in hugo-template en LohuisHoveniers.nl documenteerde zes types terwijl de check er acht accepteert. `content` en `revert` stonden er niet in, dus die leken ongeldig terwijl ze dat niet zijn. Nu gelijk aan Zephyrus-Linux, dat ze wel allemaal noemde. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
De vorige commit haalde de pr-title-job uit pr-checks.yml, maar de update-checklist-job hing er nog van af via `needs` en `needs.pr-title.result`. Een job kan niet wachten op een job in een andere workflow, dus actionlint sloeg hierop aan met "job needs job which does not exist in this workflow" en de workflow-check werd rood. De afhankelijkheid is niet hersteld maar overbodig gemaakt: het vinkje "PR title follows the commit convention" wordt nu uit de titel zelf afgeleid. De job haalt de pull request toch al op, dus het jobresultaat voegde daar niets aan toe. De regex gebruikt dezelfde typelijst als pr-title.yml en CONTRIBUTING.md, en staat een scope en een `!` voor een breaking change toe. Gecontroleerd met dezelfde actionlint als CI (1.7.12, tegen de gepinde checksum): alle negen repositories komen er nu schoon doorheen. De regex is apart getest tegen negen titels, geldige en ongeldige. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
Wie een pull request opende kreeg per repository iets anders te zien. Vier van de negen hadden een PR-template en die drie verschilden onderling in opbouw en taal; vier hadden een CODEOWNERS, drie een CONTRIBUTING en vijf een SECURITY.md. Nu heeft elke repository alle vier, met hetzelfde skelet: Samenvatting, Type wijziging, Checklist. De eerste 24 regels van de template zijn byte-identiek in alle acht Nederlandstalige repositories; Zephyrus-Linux houdt zijn Engelse versie omdat dat project tweetalig is en een EN/NL- pariteitscontrole heeft. Wat per repository verschilt, is de checklist eronder, en alleen omdat de stack verschilt: Hugo-sites vragen om `hugo server`, Tijhuis-Tuinen om PHP en welke van de twee sites je raakt, Web-Dev om `docker compose up`, en Blocklists om het lijstformaat en een bron. Een Hugo-vraag stellen in een PHP-repository helpt niemand. De "Type wijziging"-lijst komt overeen met de acht types die de controle "Conventional commit title" accepteert en die CONTRIBUTING.md beschrijft. Zephyrus-Linux miste `revert` in zijn template terwijl de check die wel toestond; dat is rechtgezet. Een nieuwe workflow pr-checklist.yml vinkt de twee punten af die uit de pull request zelf af te leiden zijn en ruimt de niet-gekozen types op. Anders dan de variant in Zephyrus-Linux gebeurt dat opruimen alleen als er al een type is aangevinkt: zonder die voorwaarde stript de eerste run alle acht regels weg voordat de auteur er een kon kiezen. Zephyrus-Linux houdt zijn eigen, uitgebreidere job die daarnaast EN/NL-pariteit, AVIF en de linkcheck afvinkt. CODEOWNERS is overal `* @Stensel8`, de vorm die de vier bestaande al gebruikten. Bewust niet AdiH1310 erbij: waar "Require review from Code Owners" aanstaat zou dat een merge blokkeren op iemand die niet in elke repository actief is. Voor Renovate staan ze wel allebei als reviewer. Gecontroleerd met actionlint 1.7.12 (alle negen schoon) en met markdownlint tegen de eigen configuratie van de drie repositories die root-Markdown linten (nul issues). De herschrijflogica van de checklist is apart getest op vijf gevallen, waaronder een lege omschrijving en of een tweede run niets meer verandert. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
CODEOWNERS stond op alleen @Stensel8, met als redenering dat een tweede naam een merge zou kunnen ophouden. Dat was onjuist: staan er meerdere eigenaren op hetzelfde pad, dan vraagt GitHub ze allebei om review maar is de goedkeuring van één van hen genoeg om aan "Require review from Code Owners" te voldoen. Beide namen erop betekent dus niet meer wachten maar minder: het werk ligt niet stil als een van de twee er even niet is. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
De vorige commits zetten de titelcontrole en het bijwerken van de checklist in twee losse workflows. Dat was precies de fout die commit 530ba29 in THectic.nl al had rechtgezet: GitHub rekent per job en rondt elke job naar boven af op een hele minuut. Beide stappen zijn in een paar seconden klaar en hebben geen checkout nodig, dus als losse jobs kostten ze twee volle minuten voor tien seconden werk. In één job is dat één minuut. Dat scheelt een gefactureerde minuut per pull request-event, in acht repositories. Zephyrus-Linux hield zijn eigen, uitgebreidere checklist-job in pr-checks.yml en verandert hier alleen door de concurrency-groep. Die concurrency-groep is de tweede besparing: snel achter elkaar de omschrijving aanpassen startte evenveel runs, terwijl alleen de laatste nog iets zegt. cancel-in-progress ruimt de rest op. De job draagt nu `pull-requests: write` terwijl de titelcontrole aan lezen genoeg heeft. Dat is de prijs van het samenvoegen; beide actions staan op een vastgezette SHA, dus dat is hier een acceptabele ruil. Gecontroleerd met actionlint 1.7.12 (alle negen schoon) en de herschrijflogica opnieuw getest op zes gevallen, waaronder een lege omschrijving en of een tweede run niets meer verandert. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
bandit draaide twee keer per pull request: als eigen job in pr-checks.yml op src/static/scripts/, en nogmaals in python-checks.yml op het enige bestand in die map. Twee jobs, twee Python-setups, dezelfde scan. De job in pr-checks.yml vervalt; python-checks.yml draait al op elke pull request, dus de dekking blijft. Wel met de bredere scan van de twee: flake8 en bandit kijken daar nu naar src/static/scripts/ in plaats van naar saxion-eduroam.py. Vandaag is dat hetzelfde bestand, maar een tweede script wordt zo vanzelf meegenomen in plaats van stilletjes overgeslagen. In config-validation.yml wordt actionlint een stap in plaats van een eigen job. Het is in vijf seconden klaar en heeft dezelfde checkout nodig als de stappen ernaast, dus een eigen job kostte een volle minuut voor niets. Elke stap daar draait nu op !cancelled(), zodat een rode Renovate-validatie actionlint niet verbergt. Samen twee gefactureerde minuten per pull request minder, van dertien naar elf jobs. Gecontroleerd met actionlint 1.7.12. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
markdownlint, de EN/NL-pariteit, de AVIF-controle, de Hugo-build, de linkcheck en het bijwerken van de checklist stonden elk op een eigen runner. Ze duurden 3, 4, 3, 12, 6 en 6 seconden: vierendertig seconden werk, verdeeld over zes runners. GitHub rekent per job en rondt elke job naar boven af op een hele minuut, dus dat waren zes gefactureerde minuten per pull request-event. Er is geen enkele controle weggehaald. Er verdwijnt meer dan die vijf minuten. De linkcheck kreeg de gebouwde site via een artefact aangeleverd, met een upload, een download en de opslag erbij. Nu staat de build ernaast en leest lychee gewoon de map. Dezelfde vorm als in LohuisHoveniers.nl, waar CI die aanroep vandaag heeft bevestigd: hij leest src/public en meldde 20 links, 17 OK, 0 fouten. De checklist-job las vier jobresultaten via needs. In een job is dat steps.<id>.outcome, en dat scheelt de zesde runner. Een detail daarbij: de AVIF-stap slaagt ook als hij PNG's vindt -- het oordeel zit in zijn output en niet in zijn uitkomst -- dus dat vinkje leest steps.images.outputs.found. Elke stap draait op !cancelled(), zodat een rode markdownlint de Hugo-build niet verbergt. Je wilt alle fouten in een run zien en niet de tweede pas nadat je de eerste hebt opgelost. De job faalt alsnog zodra er iets fout is. De job draagt `pull-requests: write` omdat twee stappen op de pull request zelf schrijven: de AVIF-controle plaatst een comment en de laatste stap werkt de checklist bij. Dat is de prijs van het samenvoegen; alle actions staan op een vastgezette SHA. Verder krijgt de workflow een concurrency-groep, zodat drie pushes achter elkaar naar dezelfde pull request niet drie volledige runs opleveren. Daarmee gaat Zephyrus-Linux van elf naar zes gefactureerde jobs per pull request. Gecontroleerd met actionlint 1.7.12 en de checklist-logica los getest op negen gevallen: goede en slechte titel, gevonden PNG's, een rode build met een overgeslagen linkcheck, stappen die helemaal niet draaiden, een lege omschrijving, idempotentie, en het opruimen van de typelijst met en zonder aangevinkt type.
flake8 en bandit draaiden als eigen job in python-checks.yml, op elke pull request en zonder padfilter. Dat was een volle gefactureerde minuut, ook op een pull request die alleen content aanraakte -- en de map die ze bekijken bevat een script. Ze draaien nu als stap in pr-checks.yml, waar de checkout er toch al is. Dat kost geen extra job. python-checks.yml blijft bestaan voor de wekelijkse run, de run op main en workflow_dispatch. Daar zit de waarde van een herhaalde scan: bandit vindt met nieuwe regels iets in code die zelf niet veranderd is, en dat merk je nooit als hij alleen op gewijzigde code draait. Vooraf gecontroleerd dat branch protection hier niet op checknamen wacht: alle negen checkruns op PR #101 staan afgerond, geen enkele op "expected", en mergeable_state is blocked omdat er nog een review-goedkeuring ontbreekt. Het weghalen van de check "lint" op pull requests zet dus niets vast. Beide commando's zijn hier gedraaid met dezelfde argumenten als CI: flake8 src/static/scripts/ --max-line-length=120 is schoon, en bandit -ll geeft nul bevindingen op medium of hoger. actionlint 1.7.12 schoon. Daarmee gaat Zephyrus-Linux van zes naar vijf gefactureerde jobs per pull request.
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.
Summary
Part of an organisation-wide consistency audit. The scope grew after the PR was opened — it started as
.gitattributesonly, and the title and description have been corrected to match what is actually in the diff.Type of change
chore— maintenance (dependencies, config, CI/CD)What changed
.gitattributesadded. This repository had none, while seven others carried four slightly different versions. This is the shared version..editorconfigreplaced with the org-wide version. It existed in five variants across seven repositories; the rules were already identical everywhere, only the comments differed.Renovate assignees and reviewers set to Stensel8 and AdiH1310. This repository had neither, so dependency PRs were assigned to nobody. Also enables
dependencyDashboard,osvVulnerabilityAlertsandconfigMigration, matching the rest.Workflow comments translated to Dutch in
config-validation.yml,update-checksums.ymlandpr-checks.yml. The organisation settled on Dutch for code comments; the shared workflow files were translated once and copied, so they stay byte-identical with the repositories that share them.Checklist
chore: ...)hugo server— n/a, no site changeVerification
Only comments changed in the workflow files: a diff with every comment line filtered out is empty for each one, and each file was re-parsed as YAML.
git add --renormalize .produces no changes, so nothing here relied on CRLF.Note
On the rest of the audit this repository came out ahead: it was the only one already pinning
codeql-actionto a precise version (# v4.37.8) rather than a bare# v4, and that pin is what the other five have now been levelled onto.