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.

Archiv release nese každou cestu jednou a nenese nic než soubory a adresáře

Tar, který release publikuje, obsahuje běžné soubory a adresáře a nic jiného: žádné

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

Balič čte zpět, co zapsal, a smaže archiv s opakovanou cestou nebo položkou, která není soubor ani adresář; ověřovač zkontroluje tytéž dvě vlastnosti znovu na runneru, který archiv sestavil. Žádný záložní balič neexistuje, protože archiv zabalený jinak není tím, který byl ověřen.

Co to znamená

Tar, který release publikuje, obsahuje běžné soubory a adresáře a nic jiného: žádný pevný odkaz, žádný symbolický odkaz, žádný uzel zařízení, žádnou duplicitní cestu. Instalátor, který jej rozbaluje, rozbaluje strom, ne následuje graf.

Princip

Dvě nezávislá odmítnutí, a první je u zdroje:

  • scripts/release-package čte zpět archiv, který právě zapsal, a smaže ho, místo aby vrátil takový, který nese opakovanou cestu nebo položku, jež není souborem ani adresářem. Záložní packer záměrně neexistuje: pokud tar nedokáže zabalit předaný seznam, release se zastaví, protože archiv zabalený jinak není archiv, který cokoli ověřilo.
  • scripts/release-verify kontroluje tytéž dvě vlastnosti archivu, který dostane, v build jobu workflow release, na runneru, který jej postavil.

Instalátor se pro vlastní bezpečnost spoléhá na druhou vlastnost: odmítne archiv obsahující odkaz dřív, než cokoli rozbalí, a to brání archivu zapisovat mimo adresář, o kterém tvrdí, že jej používá.

Jak to vidět

bash test/run.sh 87b_release_archive_shape

Ten případ zabalí skutečný archiv ze stromu, ve kterém běží, a ověří obě jeho vlastnosti, pak reprodukuje balič, který je porušil — tar na PATH s odstraněným --no-recursion — a ověří, že balič odmítne vlastní výstup a nenechá po sobě žádný archiv.

Co nepokrývá

Bitově shodné rebuildy. Dva buildy jednoho tagu vytvoří funkčně shodné archivy se stejnými položkami ve stejném pořadí; není zaručeno, že budou shodné bajt po bajtu, protože to vyžaduje reprodukovatelné vyvolání kompilátoru, které zdejší toolchain nepřipíná.

Proč existuje

Release v0.2.0 byl otagován a nikdy nepublikován. Balicí nástroj předal úplný seznam souborů tar, které do něj navíc rekurzivně sestoupilo, takže každá cesta byla archivována dvakrát; GNU tar zapisuje druhou kopii cesty jako hard link; verifikátor odmítl všech 931; build job skončil kódem 10; fail-fast zrušil ostatních pět cílů; a publikace se nikdy nespustila. Půldruhého dne inzerovaný jednořádkový instalátor odpovídal „no stable release is published yet“ — správná zpráva o stavu, který vytvořil tichý fallback v jednom shellovém skriptu. Vlastnost se nyní kontroluje tam, kde se archiv zapisuje, takže stejná třída selhání stojí sekundu, ne release.

Detail vykreslený z docs/claims/release-archive-shape.md.

Od tvrzení k důkazu

  1. 1 · veřejné tvrzení

    Archiv release nese každou cestu jednou a nenese nic než soubory a adresáře

    Vytvořeno na Projection.

  2. 2 · kanonické tvrzení

    release-archive-shapedeklarovaný stav: zaručeno v docs/CLAIMS.yaml

    Definováno v přečtěte si to na tomto webu · docs/DISTRIBUTION.md

  3. 3 · implementace

    scripts/release-package

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

    Test: test/cases/87b_release_archive_shape.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 87b_release_archive_shape

Kde se toto tvrzení používá

pokryté odpovědnosti

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