wharfy 0.12.0 — publish が誤った checksum を出せない
何が問題だったか
CLI の Formula と Linux パッケージ(あるいは GUI の Cask)を一緒に配るプロジェクトで、Formula の sha256 が、その URL の指すファイルと一致しないことがあった。manifest の archive 一覧が実体の .tar.gz に絞られておらず、同じ os/arch の .deb / .rpm——あるいは .dmg——が 自分の ハッシュを渡してしまう。Homebrew は全 artifact を checksum 不一致で弾き、tap を手で直すまで brew install が全ユーザーで失敗した。
手がかりは単純で、URL は …_linux_amd64.tar.gz を指すのに、記録された sha は .rpm のものだった。
| linux/amd64 のファイル | sha256 |
|---|---|
wharfy_…_linux_amd64.tar.gz(URL が配る実体) |
54b85e… |
wharfy_…_linux_amd64.rpm(記録されていた値) |
393d5c… |
どう直したか
manifest は実体の .tar.gz archive だけを引くようにした。パッケージは apt / yum、バンドルは Cask が扱い、どちらも Formula に折り込まない。種別(kind)でなく .tar.gz で絞るのが要点で、GoReleaser の Linux パッケージは kind を持たず archive と同じ os/arch を持つため、kind だけでは紛れ込んでいた。
書く前に、自分で照合する
多層防御として、publish は manifest の各エントリを「その URL が指す資産」の sha と突き合わせ、食い違えば書き込みを拒む。
✗ publish failed at homebrew
! sha256 mismatch for wharfy_0.12.0_linux_amd64.tar.gz:
manifest records 393d5c… but the uploaded artifact is 54b85e…
誤った checksum は、利用者に届く前に publish を止める。0.12.0 が自分自身のこのバグを捕まえたのも、まさにこの検査だった。
0.12.0 のもう一点
wharfy release が、すでにアップロードしている script チャネルを台帳にも記録するようにした。更新した install.sh が wharfy status で drift 表示にならない。
入れ方
brew upgrade wharfy / scoop update wharfy / go install github.com/ShiroDoromoto/wharfy/cmd/wharfy@latest。Linux は apt / yum リポジトリから。