6. CI plánované z jednoho modelu toho, co co ovlivňuje, kontroly jako skripty vlastněné repozitářem a web nasazený z běhu, který ho ověřil
Kontext
Validace běžela jako dva workflow. validate.yml spouštěl dvě matice operačních systémů každé kontroly při každém pushi a znovu při každém pull requestu téhož commitu a pages.yml spouštěl behaviorální sadu a prohlížečovou sondu potřetí nad každým commitem masteru před nasazením. Sada spouštěla své případy jeden po druhém, sonda spouštěla prohlížeč pro každou trasu a šířku a behaviorální případy sestavovaly crate v Rustu za studena uvnitř sady, bez cache. Měření jsou zaznamenána v .ai/repo/ci/baseline.json (scripts/ci-baseline --table): nasazení na Pages trvalo lepší část hodiny, doby ve frontě dosahovaly desítek minut kvůli duplikaci a macOS sada byla na masteru červená kvůli dvěma konstrukcím, které standardní shell macOS zpracovává jinak. Nic nebylo povinné, takže nic nečekalo, a master také nic nechránilo.
Rozhodnutí
- Jeden workflow, adaptér.
.github/workflows/validate.ymlorchestruje a nic neimplementuje: každá kontrola je skript, který člověk spouští (scripts/ci/shell-lint,scripts/ci/core-check,test/run.sh,scripts/rust-check,scripts/site-build,scripts/site-check,scripts/site-probe), a úloha Rustu sama spouštíscripts/rust-checkv režimu, který zvolil plán, místo druhého seznamu svých kroků. Opakované nastavení jsou dvě složené akce (.github/actions/setup-rust,.github/actions/setup-site).pages.ymlje pryč; jeho záruka je úlohapagestéhož běhu, která nasazuje bajty, jež úlohasitesestavila, zkontrolovala a otestovala sondou. - Jeden model, jeden plánovač.
.ai/repo/ci/gates.yamldeklaruje kontroly a třídy cest s kontrolami, které každá může ovlivnit;scripts/ci-planz něj a ze změněných cest vypočítá plán; joby workflow jsou podmíněny výstupy plánu a nenesou žádný seznam cest. Změna pipeline nebo cesta, kterou model nezná, spustí všechno. Model jsou data vedle politiky měření výkonu, testovanátest/cases/94_ci_plan.sh, a shoda workflow s nímtest/cases/26_ci_wiring.sh. - Jeden požadovaný stav.
scripts/ci/verdict, v úloze, která běží vždy a potřebuje všechny ostatní, je zelený, jen když plánování uspělo a uspěla úloha každé vybrané kontroly; prázdný výběr je červený. Workflow filtrovaná podle cest, které nechávají požadovanou kontrolu čekat, když nikdy nezačnou, se odmítají. - Omezený paralelismus, nezměněná sémantika.
test/run.shspouštíMJ_TEST_JOBSpřípadů najednou přesxargs -P, vykresluje verdikty v pořadí jmen z logů jednotlivých případů, případy, které zapisují do checkoutu (deklarované# majordomus-exclusive:), spouští samostatně a selže, když se checkout pod poolem změnil.scripts/site-probeměří jednu route na proces prohlížeče se třemi šířkami jako iframes,SITE_PROBE_JOBSnajednou, a vykresluje nálezy v pořadí routes. Ani jedno nemění žádné tvrzení. - Spustitelný soubor jako výstup buildu.
scripts/rust-check --artifact DIRpublikuje ladicí spustitelný soubor s jeho proveniencí; každý případ v Rustu i launcher respektujíMAJORDOMUS_BIN. V rámci běhu sada staví z teplé cache místo čekání na úlohu Rust, protože čekání se ukázalo dražší než build. - Spouštěče a souběžnost. Pull requesty, pushe do masteru, týdenní plán a ruční spuštění; žádný spouštěč pushem na jiných větvích, protože tentýž commit se validuje jako jeho pull request. Běhy pull requestu nahrazuje jeho další commit; každý jiný běh je vlastní skupina, na nic nečeká a nic neruší, a nasazení se řadí ve skupině jobu pages.
- Platformy. Linux je blokující cesta pro to, co je nezávislé na platformě. macOS spouští behaviorální sadu pod standardním shellem a sady cratu, když se k nim změna může dostat a v každém plném plánu, a kontrolu benchmarku tam, kde je commitnutá základní linie. Defekty bash 3.2, které držely sadu na macOS červenou, byly opraveny v téže změně.
Zamítnuté alternativy
- Filtry cest u workflow (
on.push.paths): nejlevnější způsob, jak přeskočit práci, a způsob, jak povinná kontrola zůstane navždy ve stavu čekání; a druhá kopie mapy závislostí v YAML. - Samostatné workflow Pages spotřebovávající artefakt běhu validace přes
workflow_run: dvě workflow, které je třeba držet v souladu, a druhý běh, na který čekat, pro nic, co jobpagesjednoho běhu nedává. - Sharding sady nebo sondy přes několik runnerů: více runnerů za malý zisk, jakmile jeden runner spouští případy po čtyřech; změřeno v baseline.
- Nechat sadu čekat na Rust artefakt: serializace stojí víc než build s teplou cache, který by ušetřila.
- Vypustit macOS nebo kontrolu měření výkonu kvůli červené: červená kontrola je důkaz, ne šum k odstranění; chyby shellu byly opraveny a kontrola měření ponechána tam, kde je její základní linie.
Důsledky
Model se musí udržovat pravdivý: nový konzument cesty je úprava třídy, reviewovaná s případem, který jmenuje reprezentativní cesty. Kontrola se přidává přidáním skriptu, položky kontroly a jobu a zapojovací případ odmítne kontrolu bez jejího jobu. Jak rychlé CI je, říkají měření, ne tento záznam: scripts/ci-baseline zaznamenává, co GitHub pozoroval, každý job zapisuje své shrnutí a .ai/repo/ci/baseline.json je soubor, s nímž se porovnává pozdější regrese. Ochrana větve zůstává nastavením repozitáře; stav k vyžadování je ci.