GitHub Actions: betrouwbare CI/CD-workflows
Gepubliceerd · Bijgewerkt
GitHub actions automatiseert validatie, tests, builds, packaging, geplande taken en deployments vanuit repository-events. Deze gids laat zien hoe je betrouwbare CI/CD-workflows ontwerpt, secrets beschermt, omgevingen scheidt, runtime optimaliseert, geteste artifacts deployt en fouten en herstel beheert.
Ontwerp de workflow vóór YAML
Beschrijf vóór YAML de route van codewijziging naar geteste en gedeployde versie. Leg branches, pull-requestchecks, installatie, lint, typecheck, tests, build, packaging, deploymenttargets en approvals vast. Deze kaart laat afhankelijkheden zien voordat ze in complexe jobs verdwijnen. Bepaal wat op iedere PR draait, wat pas na merge start en wat handmatig of gepland blijft.
Scheid CI en CD conceptueel. CI bepaalt of een wijziging veilig kan worden gemerged. CD bepaalt wat daarna gebeurt: package, deploy, migraties, healthchecks en promotie tussen environments. Zo wordt een testfout niet verward met een productiefout.
Definieer input en output per job. Een build verbruikt source en lockfile en produceert een artifact. Deployment gebruikt dat artifact en de juiste credentials. Duidelijke contracten maken caching, hergebruik en debugging eenvoudiger.
- Map release flow
- Separate CI and CD
- Define job inputs
- Document assumptions
Kies triggers die bij releases passen
Gebruik triggers die overeenkomen met het echte proces. pull_request is geschikt voor pre-mergecontrole, push voor post-mergeacties, schedule voor periodiek werk en workflow_dispatch voor gecontroleerd handmatig starten. Path filters kunnen werk verminderen maar mogen belangrijke checks niet overslaan.
Production hoort niet vanaf willekeurige feature branches te deployen. Bepaal welke branches of tags releases mogen maken en wat een tag betekent. Onduidelijke regels leiden snel tot dubbele runs of verkeerde releases.
Beheer concurrency bewust. Nieuwe commits kunnen oude CI-runs overbodig maken, terwijl bij deployment vaak maar één run per environment tegelijk wenselijk is. Trigger en concurrency horen samen ontworpen te worden.
- Use focused triggers
- Protect release refs
- Manage concurrency
- Avoid duplicate runs
Bouw reproduceerbare CI
Betrouwbare CI begint met een reproduceerbare omgeving. Pin runtimeversies, gebruik lockfiles en vertrouw niet op toevallig aanwezige tooling op de runner. Lokale en CI-commando’s moeten zoveel mogelijk overeenkomen zodat fouten reproduceerbaar blijven.
Laat snelle checks eerst falen. Formatting, lint en static analysis zijn vaak sneller dan integration tests en grote builds. Paralleliseer onafhankelijke tests waar dat meetbaar voordeel heeft, maar voorkom dat de workflow uit tientallen onoverzichtelijke jobs bestaat.
Succescriteria moeten expliciet zijn. Een groene build die belangrijke tests oversloeg is geen bewijs. Commands moeten juist falen, artifacts moeten gevalideerd worden en migrations moeten vóór productie getest worden.
- Pin runtime
- Fail fast
- Parallelize carefully
- Validate outputs
Bescherm secrets en environments
Plaats secrets nooit direct in YAML, broncode of logs. Gebruik encrypted repository-, organization- of environmentsecrets met de kleinste benodigde scope. Productiecredentials horen niet automatisch beschikbaar te zijn voor pull-requestjobs. Kortlevende identity is vaak veiliger dan langdurige sleutels.
Environments scheiden staging en production met eigen variabelen, approvals en protection rules. Daardoor kan een testjob niet automatisch productierechten krijgen. Geef endpoints, regio’s en project-ID’s duidelijke namen.
Logs kunnen gevoelige data lekken. Debugoutput, echo of externe actions kunnen waarden tonen. Controleer wat wordt gelogd, roteer credentials na mogelijke blootstelling en verwijder secrets die niet meer worden gebruikt.
- Scope secrets
- Separate environments
- Protect logs
- Rotate credentials
Optimaliseer cache, artifacts en matrices
Cache versnelt dependency-installatie maar blijft een optimalisatie. Cachekeys moeten afhangen van lockfiles of andere echte dependencydefinities. Bij vreemd gedrag moet de job zonder cache kunnen draaien zodat verouderde data snel uitgesloten kan worden.
Artifacts verplaatsen outputs tussen jobs en bewaren packages, testreports, coverage of screenshots. Stel retention bewust in en upload geen secrets. Deployment hoort bij voorkeur exact het artifact te gebruiken dat CI heeft gevalideerd.
Matrixjobs testen runtimes, systemen of configuraties. Ze zijn nuttig wanneer compatibiliteit echt ondersteund wordt, maar iedere dimensie vermenigvuldigt tijd en kosten. Begin met de relevante combinaties en houd experimenten apart.
- Cache safely
- Use artifacts
- Control retention
- Keep matrices intentional
Automatiseer deployment met controle
Deploymentautomatisering hoort een bekend getest artifact te promoten. Leg commit SHA, versie, environment en tijdstip vast. Daardoor kan een incident direct aan een release worden gekoppeld en voorkom je verschil tussen builds.
Gebruik safeguards volgens risico. Staging kan automatisch zijn, production kan approval of release tag vereisen. Databasemigraties verdienen extra planning omdat data rollback moeilijker is. Compatibele wijzigingen en backups beperken risico.
Draai na deployment smoke tests of healthchecks op de echte omgeving. Bepaal vooraf of een fout rollback, handmatige stop of fix forward betekent. Recovery is onderdeel van CD-ontwerp.
- Promote tested artifacts
- Use approvals
- Run health checks
- Plan recovery
Maak fouten zichtbaar en begrijpelijk
Geef jobs en steps beschrijvende namen. Test API is duidelijker dan Run command. Publiceer reports of annotations en leg bij flaky fouten runtime, dependencies en externe diensten vast.
Onderscheid codefouten van infrastructuur. Assertion, registryuitval, verlopen credential, rate limit en runnerprobleem hebben verschillende oplossingen. Retry hoort alleen bij tijdelijke fouten en mag deterministische fouten niet verbergen.
Meet workflowduur, queue time, failure rate en langzame jobs. Deze cijfers tonen wachttijd en instabiliteit. Bewaar voor deployments historie en koppel incidenten aan releases.
- Name steps clearly
- Classify failures
- Use targeted retries
- Track metrics
Onderhoud en verbeter de pipeline
Houd workflowbestanden leesbaar. Verplaats herhaalde logica naar reusable workflows, composite actions of scripts wanneer dat duplicatie vermindert. Pin externe actions op betrouwbare versies en behandel updates als security-afhankelijkheden.
Herzie de pipeline bij architectuurveranderingen. Nieuwe services, monorepo’s, environments of targets kunnen nieuwe jobgrenzen vragen. Verwijder oude jobs en secrets pas nadat afhankelijkheden gecontroleerd zijn.
Test regelmatig recovery. Een mislukt deployment moet diagnosticeerbaar zijn, een eerder artifact moet indien nodig herstelbaar zijn en credentials moeten roteerbaar blijven. Een volwassen pipeline is begrijpelijk, reproduceerbaar en observeerbaar.
Controleer ook tokenrechten. Een job die geen releases, packages of repositorycontent hoeft te schrijven, hoort die rechten niet te krijgen. Expliciete permissions beperken de impact van een gecompromitteerde externe action. Pull requests uit forks vragen extra aandacht omdat secrets daar bewust beperkt worden.
In monorepos hoeft niet altijd de volledige pipeline te draaien wanneer één onafhankelijk package wijzigt, maar affected-projectdetectie moet voorzichtig blijven. Wijzigingen aan lockfile, rootconfiguratie of gedeelde code kunnen bredere checks vereisen.
Bewaar release-metadata zoals versie, artifactdigest, commit, environment en eventueel migration-ID. Dat maakt incidentanalyse veel nauwkeuriger dan alleen een tijdstip.
Controleer ook tokenrechten. Een job die geen releases, packages of repositorycontent hoeft te schrijven, hoort die rechten niet te krijgen. Expliciete permissions beperken de impact van een gecompromitteerde externe action. Pull requests uit forks vragen extra aandacht omdat secrets daar bewust beperkt worden.
In monorepos hoeft niet altijd de volledige pipeline te draaien wanneer één onafhankelijk package wijzigt, maar affected-projectdetectie moet voorzichtig blijven. Wijzigingen aan lockfile, rootconfiguratie of gedeelde code kunnen bredere checks vereisen.
- Keep workflows readable
- Review third-party actions
- Remove obsolete logic carefully
- Test recovery
Vragen
Waarvoor gebruik je github actions?
Voor geautomatiseerde checks, tests, builds, geplande taken en deployments vanuit repository-events.
Production bij iedere push deployen?
Meestal niet. Gebruik gecontroleerde branches, tags, environments of approvals.
Waar bewaar je secrets?
In encrypted secrets of kortlevende identity met minimale scope.
Wat bewaart een betrouwbare pipeline?
Het gevalideerde commit of artifact, duidelijke logs, deploymenthistorie, gescheiden environments en een herstelpad.