Okamžik
Všechno je zelené. Testy procházejí, linter mlčí a čtyři commitnuté soubory generované z kódu popisují kód tak, jak byl před poslední změnou. Nic v pipeline se na ně nedívá, protože to není kód a nejsou to testy.
Proč k tomu dochází
Generované soubory, které jsou commitnuté, tvoří nepříjemnou kategorii: recenzují se jako zdroj a vznikají jako výstup. Jejich regenerace je krok a krok, který nespouští totéž, co spouští testy, přeskočí ten, kdo spěchá — což je čím dál častěji pracovník, kterému bylo řečeno změnit zdroj, a on udělal přesně to.
Proč to lepší model nevyřeší
Regenerace je krok buildu, ne úsudek. Pracovník, který ji nespustil, nezklamal v uvažování; nikdo mu to neřekl, a říkat mu to pokaždé je ruční synchronizace, kterou měla generace odstranit.
Co to stojí
Recenzenti čtou zastaralý artefakt a schválí ho. Konzumenti artefaktu — web, generátor klientů, jiný nástroj — servírují loňskou pravdu. A strom už není reprodukovatelný: spuštění generátoru vyrobí diff, který se každý naučí ignorovat.
Co Majordomus dělá
Graf odvozování je zapsán jednou, v pořadí závislostí, takže člověk a CI spouštějí totéž ve stejné posloupnosti. Každý commitnutý odvozený artefakt má kontrolu, která jej regeneruje a porovná: generate --check pojmenuje každý soubor, který se liší nebo chybí, a skončí nenulově, a data webu mají tutéž kontrolu proti hashi svých vstupů. Dvojí spuštění celého odvození nic nemění, což je to, s čím kontrola porovnává.
Před a po
before tests: green docs/generated/*.json: from two commits ago
after $ scripts/derive-check
stale: docs/generated/openapi.json (differs)
site/data/registry/registry.json (differs)
exit 10Co nedělá
Nerozhoduje, co se má generovat, a během kontroly nic tiše nepřegeneruje — kontrola, která zapisuje, není kontrola. Pojmenuje, co je zastaralé, a příkaz, který to opraví.