Closed20

Immutable Release

Shunsuke SuzukiShunsuke Suzuki

https://github.blog/changelog/2025-08-26-releases-now-support-immutability-in-public-preview/
https://github.com/orgs/community/discussions/171210

Repository の設定であった
General

Organization の設定にもあった
Repository > General

User の設定にはない気がする

API はまだないが、将来的に公開される。
https://github.com/orgs/community/discussions/171210#discussioncomment-14237940

Shunsuke SuzukiShunsuke Suzuki

Immutable Release

  • Release asset の削除が禁止
  • tag を削除はできるが、同じ名前の tag を作成することはできない
  • Release は削除できるが、同じ tag を使って Release の再作成はできない
Shunsuke SuzukiShunsuke Suzuki

Once you publish a release as immutable, its assets can’t be added,

って書いてあるけど add できなかったら asset リリースできないから、そんなはずなくない?

Release の作成と asset の upload は API 別だし。
https://docs.github.com/ja/rest/releases/releases?apiVersion=2022-11-28#create-a-release
https://docs.github.com/ja/rest/releases/assets?apiVersion=2022-11-28#upload-a-release-asset

Shunsuke SuzukiShunsuke Suzuki

gh release create で release の作成と asset の upload ができた。
しかし、コードを見ると release の作成と asset の upload は別々のリクエストである。

https://github.com/cli/cli/blob/e40170b263834238489dbcb4fa3a7221a19d8882/pkg/cmd/release/create/create.go#L500
https://github.com/cli/cli/blob/e40170b263834238489dbcb4fa3a7221a19d8882/pkg/cmd/release/create/http.go#L184

https://github.com/cli/cli/blob/e40170b263834238489dbcb4fa3a7221a19d8882/pkg/cmd/release/create/create.go#L537
https://github.com/cli/cli/blob/e40170b263834238489dbcb4fa3a7221a19d8882/pkg/cmd/release/shared/upload.go#L185

ということはもしかすると時間間隔を開けずに 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 できるということなのか?

https://github.com/cli/cli/blob/e40170b263834238489dbcb4fa3a7221a19d8882/pkg/cmd/release/create/create.go#L531

https://docs.github.com/ja/rest/releases/releases?apiVersion=2022-11-28#create-a-release

  "upload_url": "https://uploads.github.com/repos/octocat/Hello-World/releases/1/assets{?name,label}",
Shunsuke SuzukiShunsuke Suzuki

この upload_url に有効期限があるのだろうか?ないんだとしたら immutable とは?という話になってしまう。

Shunsuke SuzukiShunsuke Suzuki

試しに curl したら失敗した。

https://docs.github.com/ja/rest/releases/assets?apiVersion=2022-11-28#upload-a-release-asset

$ 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"}
Shunsuke SuzukiShunsuke Suzuki

shell script で時間を開けずにやったが失敗した。
ごく短い時間ならセーフということなんだろうか?

Shunsuke SuzukiShunsuke Suzuki

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 できないように読める。

Shunsuke SuzukiShunsuke Suzuki

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 が動かなくなる。

Shunsuke SuzukiShunsuke Suzuki

gh relese create で release 作成と同時に upload すれば大丈夫

gh release create v0.8.0 README.md
Shunsuke SuzukiShunsuke Suzuki

go-release-workflow は SLSA Provenance 以外はまとめて upload している

https://github.com/suzuki-shunsuke/go-release-workflow/blob/c4b4959e221bb2666dbaa873c6745698237b2704/.github/workflows/release.yaml#L166-L168

SLSA Provenance は slsa-github-generator で独立した job であとから upload する設計になっているので困る。

upload-assets を false にすれば Provenance の生成だけできたりするのだろうか?
その場合 Release の作成前にできる?

Shunsuke SuzukiShunsuke Suzuki

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 は不要と言える
Shunsuke SuzukiShunsuke Suzuki

Immutable Release は素晴らしいし、 checkbox (select box) で有効化するだけで非常に簡単。
しかし、ネックなのは User の repository を一括で有効にできないこと。
これが普及の妨げになると言っても過言ではない。
GitHub では Organization では使えるけど User では使えない機能が幾つかあるのがとても残念。
例えば Organization Secrets はあるけど User Secrets はない。

このスクラップは2日前にクローズされました