ghir で過去の GitHub Releases も Immutable にする
過去の GitHub Releases を Immutable にする ghir というツールを紹介します。
導入
先日 GitHub の Immutable Releases に関する記事を書きました。
Immutable Releases はセキュリティ的に極めて重要な機能であり、みなさんが管理していて GitHub Releases を使っている全リポジトリで有効化してほしい機能です。
ただ、有効化しても有効化前に作られた GitHub Releases は mutable なままです。
そのため、古いバージョンの assets は改竄されるリスクがあり、有効化しても片手落ち感が否めません。
そこで、古いバージョンも全て Immutable にする CLI を作りました。
使い方
使い方は非常に簡単です。
- ghir をインストール
- 対象のリポジトリで Immutable Releases を有効化
- ghir を実行
ghir "$REPO_FULL_NAME"
引数はリポジトリの full name です。
ghir suzuki-shunsuke/tfcmt
GitHub Releases を更新するので contents:write
権限のある GitHub Access Token が必要です。
環境変数 GITHUB_TOKEN
か GHIR_GITHUB_TOKEN
にセットしてください。
あるいは ghtkn とのインテグレーションに対応しているので、 ghtkn を使ってる人は GHIR_ENABLE_GHTKN
に true
をセットするのでも良いです。
例: tfcmt
tfcmt の Releases を見てみましょう。
最新バージョンは勿論、初期のリリースも含めてすべて Immutable になっています。
tfcmt v0.1.0 (2021/01/05 リリース)
仕組み
ghir がやってることは極めて単純です。
- GitHub API で GitHub Releases のリストを取得
- draft release や immutable release を除外
- body parameter を空にして Update Release API を実行し、 Release を Immutable にする
GitHub Blog では以下のように書いてあります。
Existing releases remain mutable unless you republish them.
この republish
が何を指しているのかが曖昧で、当初自分は release を作り直す必要があるのかと思っていましたが、 description を更新するだけで Immutable になることに気づきました。
そこで以下のような手順を踏もうと考えました。
- Release の description を取得
- description の末尾に空行を追加して release を更新
- 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 にしましょう。
Discussion