Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

Změna spouští kontroly, které její cesty mohou ovlivnit, podle jednoho modelu toho, co co ovlivňuje, a změna samotné pipeline nebo cesty, kterou model nezná, spouští všechny kontroly

Pull request nespouští každou kontrolu jen proto, že existuje; spouští kontroly, kterých může změna pod jeho cestami dosáhnout, 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 tohoto modelu a změněných cest vypočítá výběr. Kontroly always (shell lint, strukturální kontroly) jsou v každém plánu. Cesta, kterou nezná žádná třída, nebo cesta v samotném pipeline eskaluje na plný plán a plán jmenuje cestu, která to způsobila.

deklarovaný stavdeklarovaný stav: zaručeno Deklarováno jako deterministické a blokující, implementováno a s uvedeným behaviorálním testem, který to má dokázat. Zda to zaznamenaný běh podporuje, říká verdikt důkazů zobrazený vedle.

zaznamenané důkazyzaznamenané důkazy: nespuštěno Deklarováno jako zaručené, ale nepodložené zaznamenaným během: test je pojmenován, ale žádný úspěšný běh nad současnými vstupy zaznamenán není. jak se zaznamenávají důkazy

Kontroly, které běží vždy, jsou v každém plánu; změněná cesta vybírá kontroly každé třídy, které odpovídá, jako sjednocení; třída může eskalovat; kontrola přináší, co implikuje a co vyžaduje; plán je deterministický a pro každou kontrolu říká, proč běžela či neběžela. Workflow čte výstupy plánu a nenese vlastní seznam cest; test/cases/26_ci_wiring.sh dokazuje, že úloha každé kontroly existuje, je podmíněna plánem a verdikt ji potřebuje.

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_plan

Co 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í.

Detail vykreslený z docs/claims/ci-planned-gates.md.

Od tvrzení k důkazu

  1. 1 · veřejné tvrzení

    Změna spouští kontroly, které její cesty mohou ovlivnit, podle jednoho modelu toho, co co ovlivňuje, a změna samotné pipeline nebo cesty, kterou model nezná, spouští všechny kontroly

    Vytvořeno na CI.

  2. 2 · kanonické tvrzení

    ci-planned-gatesdeklarovaný stav: zaručeno v docs/CLAIMS.yaml

    Definováno v .ai/repo/ci/gates.yaml

  3. 3 · implementace

    scripts/ci-plan

  4. 4 · test a scénáře

    Test: test/cases/94_ci_plan.sh

  5. 5 · zaznamenané běhy

    zaznamenané důkazy: nespuštěno jak se zaznamenávají důkazy

Ověřte si to sami

Test běží v jednorázovém dočasném repozitáři a ověřuje chování, ne řetězec ve zdrojovém kódu.

z klonu repozitáře
bash test/run.sh 94_ci_plan

Prohledává názvy a popisy všech stránek, které tento web publikuje.