chore: trek CI-pins en Renovate-config gelijk met de andere repositories - #7
Merged
Merged
Conversation
An audit across the organisation found the same tools pinned differently in each repository, with nothing to make them converge again. codeql-action/upload-sarif sat on three different commits org-wide, all labelled only `# v4`, so the difference was invisible at the pin. All of them now point at v4.37.8 with the exact version in the comment. The Semgrep container was pinned to two different digests, meaning two groups of repositories scanned with a different rule set. Both now use the current `latest` manifest digest. HTMLHint installs with `npm ci` against a checked-in lockfile instead of `npm install -g htmlhint@version`, which resolved through the registry at run time with nothing to verify the result against. Scorecard's Pinned-Dependencies check and zizmor's adhoc-packages audit both flag the old form. Renovate gets the npm manager enabled so the lockfile stays current. The SARIF uploads no longer skip themselves on a private repository. That guard was correct when it was written, but Advanced Security is now enabled across the whole organisation, so the uploads it was suppressing would succeed today. The comments explaining the guard went with it rather than being left to describe behaviour that no longer exists. .gitattributes was four slightly different files across seven repositories. It is now one, covering the union of what the variants covered. Renovate also gains dependencyDashboard, osvVulnerabilityAlerts and configMigration. The last one is the point: it opens a pull request when an option goes stale, which is what would have surfaced this drift on its own. 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
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
…ositories security.yml is nu in alle vijf de Hugo-repositories hetzelfde bestand, op de regel met het semgrep-scanpad na. Dat pad verschilt terecht: niet elke repository heeft dezelfde mappenstructuur. Wat hier verschilde was alleen de plaatsing van permissies en de formulering van het commentaar. Dat leest als betekenisverschil terwijl het er geen is, en juist bij een securityworkflow wil je in één oogopslag kunnen zien dat vijf repositories hetzelfde doen. .markdownlint.yml gaat om dezelfde reden mee: het commentaar naar het Nederlands, en MD033 erbij zodat het bestand ook bruikbaar is in de repositories die <details> in hun README of <address> in hun content gebruiken. Hier stond alleen MD060 al uit, daar week deze van de rest af.
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.
Part of an organisation-wide consistency audit.
What changed
codeql-action/upload-sarifpinned to v4.37.8. This repository had two different commits for the same action —5595ccaf(v4.37.6) insecurity.ymlandff2f1c62(v4.37.7) inquality.yml— both labelled only# v4, so the difference was invisible at the pin. Across the organisation there were three distinct SHAs. All now point at v4.37.8, with the exact version in the comment so the next divergence is visible.Semgrep digest updated. Two groups of repositories were scanning with different Semgrep builds, and therefore different rule sets. This one was on the older digest; it now matches the current
latestmanifest.SARIF uploads no longer skip on a private repository. The guard was correct when written — the comment even said it would give the step back "the day this repository goes public or gets Advanced Security". Advanced Security is now enabled across the organisation, so that day has arrived. The comments explaining it were removed rather than left describing behaviour that no longer exists.
htmlhint package renamed.
.github/htmlhint/package.jsonwashugo-template-htmlhint; it is nowthectic-htmlhintin all five repositories that use it, so the file is byte-identical everywhere.Added after this PR was opened
The audit continued while this was open, so later commits are also in the diff:
.gitattributesand.editorconfigreplaced with the org-wide versions.config-validation.yml,update-checksums.yml,setup-hugo/action.yml) were translated once and copied, so they stay byte-identical with the repositories that share them. Only comments changed: a diff with every comment line filtered out is empty for each file, and each was re-parsed as YAML.pr-title.ymlthat is byte-identical in all nine repositories.CODEOWNERSand a PR template that repositories generated from it already had. Both are now here, on the shared skeleton — so a new site inherits them instead of starting a repository short.pr-checklist.ymlticks the two checklist items derivable from the pull request itself and clears the unchosen type lines.dependencyDashboard,osvVulnerabilityAlertsandconfigMigration, plus both owners as assignee and reviewer.Still outstanding
deploy-bunny.ymlstill has English comments — it is the one workflow that differs per repository, so it could not be translated once and copied.There is still no org-level
.githubrepository. Until there is, every repository carries its own copy of these files and this drift can recur — thoughconfigMigrationnow catches the Renovate half on its own.Verification
renovate-config-validator --strictpasses;migrateConfigreports no migration needed. Every# renovate:annotation was checked against the configured managers by simulating the regexes — all five match. actionlint 1.7.12 is clean, and markdownlint passes against this repository's own config.