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.shwharfy status で drift 表示にならない。

入れ方

brew upgrade wharfy / scoop update wharfy / go install github.com/ShiroDoromoto/wharfy/cmd/wharfy@latest。Linux は apt / yum リポジトリから。