Co to znamená
Záznamník neměří vlastní checkout. Měří ho běh, když skončí, pomocí majordomus evidence stamp, a záznamník toto měření přenese do provedení zprávy, kterou pojmenovává:
- commit a strom, s nimiž je provedení zaznamenáno, jsou ty, které uvedlo razítko běhu, ať vypadá checkout zapisovače při zápisu jakkoli;
- strom ignoruje ledger důkazů a vylučuje jen vlastní nesledované výstupy běhu; změna sledovaného souboru je vždy změna;
- když byl strom běhu čistý, otisk testu se bere z commitu, z bajtů, které běh provedl;
- lokální report zaznamenaný bez měření nese strom
unknowna nikdy nečteproven.
Zapisovač odmítne, dřív než cokoli zapíše, měření jiného commitu, měření jiných bajtů než report, měření pro report, který nebyl zadán nebo byl vázán na jiného producenta, lokální nebo release měření, které nejmenuje žádný report, a CI report bez měření.
Princip
evidence::stamp v apps/majordomus-cli/src/evidence/provenance.rs přečte HEAD, zkontroluje každý --exclude (odmítnut, když je to vzor, jmenuje celý checkout, není cestou repozitáře nebo drží sledované soubory, na což odpovídá git ls-files), vytvoří digest reportu a změří strom přes git::working_tree_excluding, jediné měření stromu, které skryje vyloučenou cestu jen tehdy, dokud není sledována. Výsledkem je EvidenceProvenance: commit, strom, co bylo vyloučeno, čas, toolchain producenta, verze zapisovače, cesta reportu (relativní vůči repozitáři nebo název souboru, nikdy cesta stroje) a digest, hostitel a běh CI.
evidence record --provenance [<producer>=]<file> přiřadí každý soubor k reportu, který měří, a evidence::record v apps/majordomus-cli/src/evidence/record.rs ověří každé měření proti HEAD a proti bajtům reportu, než report přečte nebo zapíše ledger. Každé provedení bere měřený strom svého reportu, nebo unknown, pokud žádný nemá, a řádek čerstvosti A1 čte strom, který není clean, jako inputs_unchanged.
Jak to vidět
MJ_TEST_REPORT=suite.tsv bash test/run.sh
majordomus evidence stamp --producer suite --report suite.tsv --out suite.provenance.json
majordomus evidence record --suite suite.tsv --provenance suite.provenance.json
majordomus evidence claim evidence-tree-is-measured-by-the-run
bash test/run.sh 505_a_recording_carries_what_its_run_measured
Případ orazítkuje fixture s vyloučenými výstupy svého běhu i bez nich, odmítne vyloučení, která by skryla sledovanou úpravu, zaznamená špinavé razítko nad čistým záznamníkem i čisté razítko nad špinavým, vezme digest čistého běhu z commitu a ověří, že každé odmítnutí nechá účetní knihu, jak byla.
Co nepokrývá
Razítko měří checkout v okamžiku, kdy je pořízeno, po zapsání zprávy, a ne strom v době běhu: běh na špinavém stromu, který se před razítkem vyčistí, se čte jako čistý. Pozdější řez měří na začátku a na konci lokálního běhu sady.
Dokud CI neopatřuje razítkem svůj report, je měřením CI soubor stromu produkujícího jobu, který žádný report nejmenuje, takže je vázán na commit, ne na bajty reportu.
Runner, jehož prostředí lže o svém commitu, a člověk, který ručně upravuje ledger, leží mimo to, co měření vidí.
Monotónní pravidlo, které dovoluje záznamu běhu zadržet proven, zatím neaplikuje žádný povrch.
Proč existuje
Recorder označoval každé provedení stromem, který viděl při zaznamenávání, a ručil tak za strom, který neviděl: CI zaznamenává v čerstvém checkoutu, takže strom, který označil, byl konstanta, ne měření, a lokální běh mohl být zaznamenán poté, co se jeho checkout změnil. ADR 0087 (navrženo), rozhodnutí 6, uvádí pravidlo, které toto provádí: běh měří, recorder nese a strom, který nikdo neměřil, není čistý.