🐧

ghir で過去の GitHub Releases も Immutable にする

に公開1

過去の GitHub Releases を Immutable にする ghir というツールを紹介します。

https://github.com/suzuki-shunsuke/ghir

導入

先日 GitHub の Immutable Releases に関する記事を書きました。

https://zenn.dev/shunsuke_suzuki/articles/github-immutable-release

Immutable Releases はセキュリティ的に極めて重要な機能であり、みなさんが管理していて GitHub Releases を使っている全リポジトリで有効化してほしい機能です。

ただ、有効化しても有効化前に作られた GitHub Releases は mutable なままです。
そのため、古いバージョンの assets は改竄されるリスクがあり、有効化しても片手落ち感が否めません。

そこで、古いバージョンも全て Immutable にする CLI を作りました。

使い方

使い方は非常に簡単です。

  1. ghir をインストール
  2. 対象のリポジトリで Immutable Releases を有効化
  3. ghir を実行
ghir "$REPO_FULL_NAME"

引数はリポジトリの full name です。

e.g. suzuki-shunsuke/tfcmt に対して実行
ghir suzuki-shunsuke/tfcmt

GitHub Releases を更新するので contents:write 権限のある GitHub Access Token が必要です。
環境変数 GITHUB_TOKENGHIR_GITHUB_TOKEN にセットしてください。
あるいは ghtkn とのインテグレーションに対応しているので、 ghtkn を使ってる人は GHIR_ENABLE_GHTKNtrue をセットするのでも良いです。

例: tfcmt

tfcmt の Releases を見てみましょう。
最新バージョンは勿論、初期のリリースも含めてすべて Immutable になっています。
tfcmt v0.1.0 (2021/01/05 リリース)

仕組み

ghir がやってることは極めて単純です。

  1. GitHub API で GitHub Releases のリストを取得
  2. draft release や immutable release を除外
  3. body parameter を空にして Update Release API を実行し、 Release を Immutable にする

GitHub Blog では以下のように書いてあります。

Existing releases remain mutable unless you republish them.

この republish が何を指しているのかが曖昧で、当初自分は release を作り直す必要があるのかと思っていましたが、 description を更新するだけで Immutable になることに気づきました。
そこで以下のような手順を踏もうと考えました。

  1. Release の description を取得
  2. description の末尾に空行を追加して release を更新
  3. description を元に戻して release を更新

しかし、試しに body parameter になにも指定しないで update a release API を実行してみたところ、 API は成功し release が immutable になりました。
つまり態々 description を取得して一時的に更新するような必要はなく、上述の通り極めてシンプルな形になりました。

Immutable Release を常時有効にするのが難しくても、過去の release は Immutable にできる

基本的には Immutable Releases は有効にすべきだと思っていますが、有効にするには Release Workflow の改修が必要で直ぐにはできないなど、直ぐには有効化できない事情があるケースもなくはないと思います。
しかし、そういった場合でも既にリリースが完了した古いバージョンを immutable にできない理由は基本ないと思います。
そこで一回 Immutable Releases を有効化して ghir を実行し、終わったら Immutable Releases を無効化することでリリース済みの Releases を Immutable にできるはずです。

さいごに

以上、過去の GitHub Releases を Immutable にできる ghir の紹介でした。
是非 Immutable Releases を有効化し、過去のバージョンも含めて Immutable にしましょう。

https://github.com/suzuki-shunsuke/ghir