GitHub Actions のワークフローを自動更新する Action を作ってみる(仮)
ふと,renovate の GitHub Actions 版があれば,少しくらい需要があるのではないかと思った。要は uses: actions/setup-node@v2
のようにして使っている外部アクションのバージョンの更新を自動チェックしようというわけだ。
GitHub Actions の公式ドキュメンテーションによれば,uses
で外部のワークフローを呼び出す方法はいくつかあるという。
We strongly recommend that you include the version of the action you are using by specifying a Git ref, SHA, or Docker tag number. If you don't specify a version, it could break your workflows or cause unexpected behavior when the action owner publishes an update.
- Using the commit SHA of a released action version is the safest for stability and security.
- Using the specific major action version allows you to receive critical fixes and security patches while still maintaining compatibility. It also assures that your workflow should still work.
- Using the default branch of an action may be convenient, but if someone releases a new major version with a breaking change, your workflow could break.
これを意訳すると,以下のようになる。
GitHub では,外部のアクションの利用する際に Git ref や SHA あるいは Docker のタグ番号によるバージョン指定を推奨します。バージョンを指定しなかった場合,そのアクションがバージョンアップされた時に予期せぬ動作が発生したり,ワークフロー自体が破損する可能性があります。
- リリースされたアクションの commit ハッシュ値を用いてバージョンを指定する方法は,持続性とセキュリティーの観点から最も安全です。
- メジャーバージョン(注:
v1.2.3
なら1
の部分)だけを指定する方法は,互換性を維持しつつも,アクションの致命的な不具合の修正や,セキュリティーパッチの適用がなされます。また,ワークフローは引き続き動作するでしょう。- 利用するアクションのデフォルトブランチ名で指定する方法は便利ですが,大規模変更を伴うメジャーアップデート時に,ワークフローが破損する可能性があります。
実際のコードだと,このようになる。
steps:
# commit ハッシュで v2.1.5 と指定
- uses: actions/setup-node@46071b5c7a2e0c34e49c3cb8a0e792e86e18d5ea
# メジャーバージョンだけを指定(v2.x.x の最新版が適用される)
- uses: actions/setup-node@v2
# マイナーバージョンまで指定(v2.1.x の最新版が適用される)
- uses: actions/setup-node@v2.1
# デフォルトブランチを指定(使ったことがないので分からないが,常に最新版が適用される?)
- uses: actions/setup-node@main
このように,GitHub は安全のため外部のアクションを利用する際は「commit ハッシュ」でバージョンを指定すべきだという。ただ,そのアクションがアップデートされる度にハッシュ値を手動で書き換えるのはいささか面倒というジレンマを抱える。
そこで,npm パッケージの更新を自動化する renovate が如く,GitHub Actions のアクションを自動更新するものを作ってしまおうと考えた。数時間前に突然思いついただけで,まだ何も出来ていない。
とりあえず,uses
で commit ハッシュ値以外による指定がなされていたら,ハッシュ値で指定し直す PR を作る bot にすれば良い気がする。
手順
- ブランチを切る
-
.github/workflow/*.yml
を読み込む -
uses
の値を取得 - そのワークフローの最新バージョンのコミットハッシュを取得する
-
user/repo@{commit hash}
に書き換える - 反映した PR を作る
renovate bot だとパッケージ単位で PR を出してくれるけれど,あれを GitHub Actions だけで再現するにはどうするべきなんだろうか。.github/workflow/*.yml
の一覧を取得すれば何とかできそう?
数か月前から,renovate が GitHub Actions で使用しているワークフローのバージョン管理を行うようになった。もはや独力で管理法を考える必要はないだろう。