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: pokudtarnedokáže zabalit předaný seznam, release se zastaví, protože archiv zabalený jinak není archiv, který cokoli ověřilo.scripts/release-verifykontroluje 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.