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.

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ý jej ověřil

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ý jej ověřil

majordomus://adr/adr-0006přijato cinasazení

odkazuje na

Nic. Tento objekt nedeklaruje žádný odkaz.

odkazuje na něj

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.yml orchestruje 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-check v 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.yml je pryč; jeho záruka je úloha pages téhož běhu, která nasazuje bajty, jež úloha site sestavila, zkontrolovala a otestovala sondou.
  • Jeden model, jeden plánovač. .ai/repo/ci/gates.yaml deklaruje kontroly a třídy cest s kontrolami, které každá může ovlivnit; scripts/ci-plan z 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ím test/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.sh spouští MJ_TEST_JOBS případů najednou přes xargs -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-probe měří jednu route na proces prohlížeče se třemi šířkami jako iframes, SITE_PROBE_JOBS najednou, a vykresluje nálezy v pořadí routes. Ani jedno nemění žádné tvrzení.
  • Spustitelný soubor jako výstup buildu. scripts/rust-check --artifact DIR publikuje 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 job pages jednoho 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.

Odkud to pochází

kanonický soubor
.ai/repo/adrs/0006-ci-planned-from-one-model-and-the-site-deployed-from-its-verified-run.md
identity
adr-0006
dostupné také jako
Zdroj MCP majordomus://adr/adr-0006 · majordomus entity show adr/adr-0006 · GET /api/v1/entity?uri=majordomus://adr/adr-0006
v Cockpitu
/cockpit/objects/adr/adr-0006

Tato stránka je generována z výše uvedeného souboru pomocí scripts/generate-site-data; úprava stránky nic nemění, úprava souboru změní všechna rozhraní. Výše uvedené vztahy jsou hrany docs/generated/graph.json, které spustitelný program zapisuje ze stejného indexu.

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