Co to znamená
Pull request nespouští každou kontrolu proto, že kontrola existuje; spouští kontroly, kterých se může změna pod jeho cestami dotknout, a rozhodnutí není odhad. .ai/repo/ci/gates.yaml deklaruje kontroly a třídy cest s kontrolami, které každá třída může ovlivnit, a scripts/ci-plan z toho modelu a změněných cest spočítá výběr. Vždy spouštěné kontroly (shell lint, strukturální kontroly) jsou v každém plánu. Cesta, kterou nezná žádná třída, nebo cesta v samotné pipeline eskaluje na plný plán a plán uvede cestu, která to způsobila.
Princip
Plánovač model zploští, porovná každou změněnou cestu s každým vzorem třídy (** přechází adresáře, * ne), vezme sjednocení kontrol vybraných tříd, přidá, co vybraná kontrola implikuje a vyžaduje, a zapíše plán: režim, důvod, každou kontrolu s její úlohou a zda a proč byla vybrána. Úloha plan v .github/workflows/validate.yml jej spustí nad diffem pull requestu od základu, do kterého bude sloučen, a promění plán ve výstupy úlohy, podle kterých se ostatní úlohy podmiňují; workflow nenese vlastní seznam cest. test/cases/94_ci_plan.sh pohání plánovač vyjmenovanými cestami a ověřuje důležité vztahy: Rust, web, dokumenty, distribuce, pipeline, neznámá cesta, netečná cesta, sjednocení, implikované a vyžadované kontroly a že model s visícím odkazem je odmítnut.
Jak to vidět
just ci-plan # this working tree against master
printf 'docs/DESIGN.md\n' | scripts/ci-plan --files - --format text
printf 'apps/majordomus-cli/src/lib.rs\n' | scripts/ci-plan --files - | jq .selected
scripts/ci-plan --check # the model resolves
just test-shell 94_ci_planCo nepokrývá
Model je výrok o tom, co co čte, psaný lidmi a kontrolovaný případy, které jmenují reprezentativní cesty; nový konzument cesty, kterého nikdo do modelu nepřidal, je mezera, kterou plný plán na masteru uzavře po merge, ne před ním. Plánovač rozhoduje, které kontroly poběží, nikdy jak projdou: každá kontrola je vlastní skript s vlastními důkazy.
Proč existuje
Před modelem každý push a každý pull request spouštěl dvě matice operačních systémů všech kontrol nad každým commitem a samostatný workflow Pages spouštěl sadu a browserovou sondu znovu nad stejným commitem; změna dokumentace čekala na build pokrytí Rustu a změna Rustu na browser. Měření jsou v .ai/repo/ci/baseline.json (scripts/ci-baseline --table). Majordomus preferuje chování řízené daty, takže mapa závislostí žije jednou, jako data, která čtou testy, a ne jako filtry cest rozeseté po souborech workflow, které navíc nechávají povinnou kontrolu čekat navždy, když se filtrovaný workflow nikdy nespustí.