GitHub Actions: spolehlivé CI/CD workflow
Publikováno · Aktualizováno
GitHub actions umožňuje automatizovat validaci, testy, build, packaging, plánované úlohy a deployment z událostí repozitáře. Tento průvodce vysvětluje, jak navrhnout spolehlivé CI/CD, chránit secrets, oddělit prostředí, optimalizovat běh, nasazovat otestované artifacts a řešit chyby i obnovu.
Navrhněte workflow před YAML
Před psaním YAML popište cestu od změny k otestované a nasazené verzi. Určete branches, pull request checks, instalaci, lint, type checking, testy, build, packaging, cíle deploymentu a approvals. Tato mapa odhalí závislosti dříve, než se skryjí v mnoha jobs. Rozhodněte, co běží na každém PR, co až po merge a co zůstává manuální nebo plánované.
Oddělte CI a CD konceptuálně. CI ověřuje, zda lze změnu bezpečně sloučit. CD řeší další kroky: vytvoření package, deployment, migrace, health check a promotion mezi prostředími. Díky tomu je jasné, zda selhal test nebo samotné nasazení.
Definujte vstupy a výstupy každého jobu. Build používá source a lockfile a vytváří artifact. Deployment spotřebuje tento artifact a credentials prostředí. Jasné kontrakty usnadňují cache, reuse a diagnostiku.
- Map release flow
- Separate CI and CD
- Define job inputs
- Document assumptions
Vyberte vhodné triggery
Používejte eventy odpovídající reálnému procesu. pull_request je vhodný před merge, push po merge, schedule pro periodické úlohy a workflow_dispatch pro řízené ruční spuštění. Path filtry mohou šetřit čas, ale nesmí vynechat důležitý test.
Production nemá být nasazována z libovolné feature branch. Určete, které branches nebo tags mohou vytvořit release a co tag znamená. Nejasná pravidla vedou k duplicitním runům nebo nesprávné verzi.
Concurrency navrhujte společně s triggery. Nový commit může učinit starý CI run zbytečným, zatímco deployment často potřebuje jen jeden aktivní run na prostředí.
- Use focused triggers
- Protect release refs
- Manage concurrency
- Avoid duplicate runs
Vybudujte reprodukovatelné CI
Spolehlivé CI potřebuje reprodukovatelné prostředí. Pinujte runtime verze, instalujte z lockfile a nespoléhejte na náhodné nástroje runneru. Lokální a CI příkazy by měly být podobné, aby bylo možné chybu zopakovat.
Rychlé kontroly spouštějte dříve. Format, lint a statická analýza mohou selhat během sekund, zatímco integration testy nebo velký build trvají déle. Paralelizujte tam, kde to má měřitelný přínos.
Kritéria úspěchu musí být jasná. Zelený build, který přeskočil důležité testy, není důkaz kvality. Artifacts musí být ověřené a migrace testované před produkcí.
- Pin runtime
- Fail fast
- Parallelize carefully
- Validate outputs
Chraňte secrets a prostředí
Secrets nepatří do YAML, kódu ani logů. Používejte šifrované repository, organization nebo environment secrets s minimálním scope. Production credentials nemají být dostupné každému pull-request jobu. Krátkodobá identita je často bezpečnější.
Environments oddělují staging a production pomocí vlastních proměnných, approvals a ochranných pravidel. Testovací job tak automaticky nezíská produkční oprávnění. Endpointy, regiony a project ID pojmenovávejte jednoznačně.
Logy mohou citlivá data odhalit. Debug, echo nebo externí action může vytisknout tajnou hodnotu. Kontrolujte výstup, credentials po podezření rotujte a nepoužívané secrets odstraňujte.
- Scope secrets
- Separate environments
- Protect logs
- Rotate credentials
Optimalizujte cache, artifacts a matrix
Cache zrychluje instalaci dependencies, ale není zdrojem pravdy. Cache key musí odpovídat lockfile nebo jiným skutečným definicím. Při podivné chybě musí být snadné job spustit bez cache.
Artifacts předávají výstupy mezi jobs a uchovávají package, test report, coverage nebo screenshoty. Nastavte retention a neukládejte secrets. Deployment má používat přesně artifact, který prošel CI.
Matrix jobs testují runtime, systémy nebo konfigurace. Jsou užitečné, pokud skutečně podporujete více kombinací, ale násobí čas i náklady. Začněte hlavními podporovanými variantami.
- Cache safely
- Use artifacts
- Control retention
- Keep matrices intentional
Automatizujte deployment s kontrolou
Deployment má promotovat známý otestovaný artifact, ne vše znovu buildovat jiným způsobem. Ukládejte commit SHA, verzi, environment a čas, aby bylo možné incident spojit s konkrétní release.
Ochranu přizpůsobte riziku. Staging může být automatický, production může vyžadovat approval nebo release tag. Databázové migrace potřebují zvláštní péči, protože rollback dat je složitější než rollback kódu.
Po deploymentu spusťte smoke test nebo health check proti skutečnému prostředí. Předem určete, zda chyba znamená rollback, ruční zastavení nebo fix forward. Recovery je součást CD návrhu.
- Promote tested artifacts
- Use approvals
- Run health checks
- Plan recovery
Zviditelněte příčiny chyb
Jobs a steps pojmenovávejte výstižně. Test API je jasnější než Run command. Publikujte reporty nebo annotations a u flaky chyb zaznamenejte runtime, dependencies a externí službu.
Rozlišujte chyby kódu a infrastruktury. Assertion, výpadek registry, expirované credentials, rate limit nebo runner problém vyžadují jiný postup. Retry používejte jen u skutečně dočasných chyb.
Sledujte dobu workflow, queue time, failure rate a nejpomalejší jobs. Tato data ukazují čekání a nestabilitu. U deploymentu udržujte historii a spojení s incidenty.
- Name steps clearly
- Classify failures
- Use targeted retries
- Track metrics
Pipeline průběžně udržujte
Workflow soubory udržujte čitelné. Opakovanou logiku přesuňte do reusable workflows, composite actions nebo scripts, pokud to omezuje duplicitu. Externí actions pinujte na důvěryhodné verze a aktualizace kontrolujte jako bezpečnostní dependency.
Pipeline revidujte při změně architektury. Nové služby, monorepo, environments nebo deployment targets mohou vyžadovat jiné jobs. Staré jobs a secrets odstraňte až po ověření závislostí.
Pravidelně testujte recovery. Selhání deploymentu musí být diagnostikovatelné, předchozí artifact obnovitelný, pokud je to vhodné, a credentials musí jít rotovat. Zralé github actions workflow zůstává srozumitelné, reprodukovatelné a pozorovatelné.
Kontrolujte také oprávnění workflow tokenu. Job, který nepotřebuje zapisovat releases, packages nebo obsah repozitáře, nemá tato práva dostat. Explicitní permissions omezují dopad kompromitované externí action. Pull requesty z forků vyžadují zvláštní pozornost, protože secrets jsou tam záměrně omezené.
V monorepu nemusí vždy běžet celá pipeline, pokud se změnil jen nezávislý package, ale detekce ovlivněných částí musí být opatrná. Změna lockfile, root konfigurace nebo sdíleného kódu může vyžadovat širší testy.
Ukládejte release metadata jako verzi, artifact digest, commit, environment a případně migration ID. Incident analýza je pak mnohem přesnější než podle času deploymentu.
Kontrolujte také oprávnění workflow tokenu. Job, který nepotřebuje zapisovat releases, packages nebo obsah repozitáře, nemá tato práva dostat. Explicitní permissions omezují dopad kompromitované externí action. Pull requesty z forků vyžadují zvláštní pozornost, protože secrets jsou tam záměrně omezené.
V monorepu nemusí vždy běžet celá pipeline, pokud se změnil jen nezávislý package, ale detekce ovlivněných částí musí být opatrná. Změna lockfile, root konfigurace nebo sdíleného kódu může vyžadovat širší testy.
- Keep workflows readable
- Review third-party actions
- Remove obsolete logic carefully
- Test recovery
Otázky
K čemu slouží github actions?
K automatizaci checks, testů, buildů, plánovaných úloh a deploymentu z událostí repozitáře.
Deploy production při každém push?
Obvykle ne. Používejte řízené branches, tags, environments nebo approvals.
Kam patří secrets?
Do šifrovaných secrets nebo krátkodobé identity s minimálním scope.
Co má spolehlivá pipeline zachovat?
Ověřený commit nebo artifact, jasné logy, historii deploymentu, oddělená prostředí a recovery postup.