Immutable Release
Repository の設定であった
General
Organization の設定にもあった
Repository > General
User の設定にはない気がする
API はまだないが、将来的に公開される。
Existing releases remain mutable unless you republish them.
なので既存の Release は mutable なまま
Immutable Release
- Release asset の削除が禁止
- tag を削除はできるが、同じ名前の tag を作成することはできない
- Release は削除できるが、同じ tag を使って Release の再作成はできない
Once you publish a release as immutable, its assets can’t be added,
って書いてあるけど add できなかったら asset リリースできないから、そんなはずなくない?
Release の作成と asset の upload は API 別だし。
gh release create
で release の作成と asset の upload ができた。
しかし、コードを見ると release の作成と asset の upload は別々のリクエストである。
ということはもしかすると時間間隔を開けずに create と upload をやればいけるのか?と思い、
gh release create と gh release upload を時間を開けずに実行したが失敗した。
gh release create -t v0.10.0 -n "" v0.10.0
gh release upload v0.10.0 README.md
HTTP 422: Cannot upload assets to an immutable release. (https://uploads.github.com/repos/szksh-lab-2/test-github-action/releases/244716146/assets?label=&name=README.md)
もっと時間間隔が短ければいけるのか?
gh release create では create release API の response にある upload URL を使っている。
これを使えば upload できるということなのか?
"upload_url": "https://uploads.github.com/repos/octocat/Hello-World/releases/1/assets{?name,label}",
この upload_url に有効期限があるのだろうか?ないんだとしたら immutable とは?という話になってしまう。
試しに curl したら失敗した。
$ curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer $(ghtkn get)" \
-H "X-GitHub-Api-Version: 2022-11-28" \
-H "Content-Type: application/octet-stream" \
"https://uploads.github.com/repos/szksh-lab-2/test-github-action/releases/***/assets?name=README.md" \
--data-binary "@README.md"
{"message":"Cannot upload assets to an immutable release.","request_id":"***","documentation_url":"https://docs.github.com/rest"}
shell script で時間を開けずにやったが失敗した。
ごく短い時間ならセーフということなんだろうか?
あー、わかった
- draft で作る
- upload する
- draft でなくする
ということをやっているらしい。
Web UI から Release 作成しようとしたら pop up 出た。
Confirm to publish
As an immutable release, you will only be able to edit the release title and notes after publishing.
You can save a draft of this release if you're not ready to publish.
assets を upload できないように読める。
UI から immutable であることがわかる。
release 作ったあとに upload しようとしたら失敗した。
$ gh release upload v0.7.0 README.md
HTTP 422: Cannot upload assets to an immutable release. (https://uploads.github.com/repos/szksh-lab-2/test-github-action/releases/244643600/assets?label=&name=README.md)
これは Release 作ったあとに asset upload する CI が動かなくなる。
gh relese create で release 作成と同時に upload すれば大丈夫
gh release create v0.8.0 README.md
go-release-workflow は SLSA Provenance 以外はまとめて upload している
SLSA Provenance は slsa-github-generator で独立した job であとから upload する設計になっているので困る。
upload-assets を false にすれば Provenance の生成だけできたりするのだろうか?
その場合 Release の作成前にできる?
できた
Q. immutable Release によって今後は full length commit sha で pinning しなくて良くなるのか?
結論は No かなと思います。
ただ、 full length commit sha で pinning してても asset の改竄は防げないので、 immutable release の価値は当然あります。
なぜ No かというと
- 過去の release は immutable にならない
- workflow で使ってるすべての action で immutable release が有効になってるとは限らない
- immutable release な action しか使わない、 CI で immutable release じゃなければ落とすとかまでやるなら pinning は不要と言える
Immutable Release は素晴らしいし、 checkbox (select box) で有効化するだけで非常に簡単。
しかし、ネックなのは User の repository を一括で有効にできないこと。
これが普及の妨げになると言っても過言ではない。
GitHub では Organization では使えるけど User では使えない機能が幾つかあるのがとても残念。
例えば Organization Secrets はあるけど User Secrets はない。