Zdůvodnění
CI zaznamenává důkazy spolu se stromem, ve kterém byly změřeny, a důkaz ze špinavého stromu o commitu nic nedokazuje (ADR 0087). Job rust změřil svůj strom poté, co proběhl scripts/rust-check, s vyloučením dvou výstupů, které tento běh jmenuje: souboru časování a adresáře artefaktů. Měřicí krok obě cesty zapsal sám, pod adresář crate, s úvahou, že skript přechází do crate dřív, než zapisuje.
Dělá, pro adresář artefaktů. Soubor s časováním řeší dříve, vůči adresáři, v němž volající stál, takže soubor skončí v kořeni checkoutu. Krok vyloučil cestu, kde nic nebylo, započítal vlastní časování běhu jako špínu a každá větev každého běhu měřila dirty — na masteru, na každém pull requestu, po celý týden, se všemi joby zelenými. Web nemohl publikovat žádné důkazy jako aktuální a úkol, který žádal o čisté změřené stromy, nemohl být uzavřen.
Nikdo nenapsal nic nedbale. Dvě místa každé vědělo, kam jeden program zapisuje, a jedno z nich se mýlilo o řádku, který se mezitím posunul. Seznam vedený vedle svého čtenáře zastarává stejně jako číslo vedené vedle svého zdroje, což je selhání, které pojmenovává project.derived-once.
Požadované chování
- Program, který během měřeného běhu zapisuje uvnitř checkoutu, tyto cesty deklaruje sám, v místě, kde je rozlišuje, relativně ke kořeni checkoutu, jednu na řádek.
scripts/rust-checkto dělá do souboru, který pojmenováváMJ_RUST_OUTPUTS, dřív než cokoli jiného běží, takže běh, který selže, přesto řekl, co po sobě mohl zanechat. - Deklarace je zapsána mimo checkout. Seznam uvnitř stromu by byl další cestou k vyloučení.
- Krok, který měří strom, sestaví své výjimky z této deklarace a z ničeho jiného a stejné cesty zaznamená jako
excludedv měření, které předá dál. - Cesta, kterou producent rozliší mimo checkout, není deklarována: nic tam nemůže strom zašpinit.
- Běh, který nezanechal deklaraci, nevylučuje nic. Cokoli zapsal, je pak špína, což je konzervativní čtení.
Chování při selhání
test/cases/357_ci_records_evidence.sh selže, když měřicí krok jobu rust nese vlastní vyloučení, když krok, který spouští scripts/rust-check, nezapíše deklaraci, kterou měřicí krok čte, když skript jmenuje pro vlastní argumenty workflow cokoli jiného než své dva výstupy a když krok, spuštěný doopravdy ve fixture checkoutu, který drží přesně tyto výstupy, naměří cokoli jiného než clean. Tentýž případ vyžaduje, aby jeden další soubor měřil dirty a aby seznam, který krok dříve nesl, měřil dirty — takže případ selže, jakmile měření přestane odlišovat vlastní výstup běhu od nečistoty.
Co nezachytí, řečeno výslovně, nikoli naznačeno: producent, který zapíše cestu, již nedeklaruje, měří dirty, což je správně a hlásí to běh, ne tento případ; a job sady stále jmenuje svůj jediný výstup, report, v kroku, který jej vylučuje, protože jméno je hodnotou prostředí téhož jobu a nikde jinde se nerozřeší.
Ověření
bash test/run.sh 357_ci_records_evidence
V běhu validate pull requestu nese manifest artefaktu evidence záznam "working_tree": "clean" pro producenta crate, kde excluded jmenuje timings.tsv a apps/majordomus-cli/dist.