こんにちは、2025/02からAndroidエンジニアとして入社したid:matsudamperです。
GitHub Actionsで外部のactionを使用する時に、どのようにバージョンを指定していますか?
バージョンの指定方法とメリット、デメリット
よく使われるactions/checkoutのREADMEのUsageでは以下のように書かれています。これでv4
のタグが使用され、最新のv4.x.x
に入った改善が使用側のコードの更新なしに使用する事ができます。
- uses: actions/checkout@v4
この書き方のメリットとデメリットは以下です。
- メリット
- v4の間は勝手に更新され、新しいバージョンに書き換える手間が無い
- デメリット
- ビルドに再現性が無くなる
- 不具合が混入した場合、突然動かなくなる。後でRe-Runすると直っている。
- actions/checkoutでもこれが発生した事がありました
- 悪意のあるコードが混入した場合も、知らない間にそれが混入される
- ビルドに再現性が無くなる
actions/*
のようなGitHubが管理しているものなら悪意のあるコードの混入を考えても仕方ないと思いますが、その他の外部Actionはどうでしょうか。リポジトリの命運をどの程度自社でコントロールしたいか、そのレベルに応じて対策を取りましょう。
一番安全を取るのであれば、フォークをした上で内部で使用されているActionのタグ指定を全てhashに変えてしまいましょう。
便利さと安全性のバランスを取るのであれば、使用するActionをhash指定にしましょう。そのActionの内部で使用されているActionをhash指定に変えるPull Requestを出せるのであれば尚良いですね!
RenovateとDependabotの挙動について
hash指定をした場合、バージョンアップが面倒になると思いますが、バージョンアップのPull Requestを作成してくれるRenovateとDependabotではどのような挙動をするのか見ていきましょう。
Renovateにはドキュメントがあり、以下の、末尾にコメントを記述する形式に対応しています。
- uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0
https://docs.renovatebot.com/modules/manager/github-actions/#additional-information
Dependabotはドキュメントが見つからなかったのですが、以下のPull Requestで導入されていました。
https://github.com/dependabot/dependabot-core/pull/5951
最新の動作を確認するには、以下のテストファイルを参照するのが良いでしょう。Renovateと同じ形式に対応しているので、DependabotでもRenovateの形式にしておけば移行したりする時にも便利でしょう。
https://github.com/dependabot/dependabot-core/blob/4c807ce8645bebabf98ca914ed58ff2dd0ed14ae/github_actions/spec/fixtures/workflow_files/pinned_sources_version_comments.yml
ここからは、バージョンの指定方法による違いを見ていきます。
バージョンのフル指定
バージョンをフルで指定すると、RenovateとDependabot共に意図した通りにバージョンが上がり、リリースノートも出力されます
- - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + - uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
バージョンの省略指定
バージョンの指定をメジャーだけにすると、RenovateとDependabot共にhashだけ更新されます。
- - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5 + - uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5
しかし、Pull Requestでは違いが出ます。
Dependabotではどのバージョンからどのバージョンにアップデートされたかがわかりますし、リリースノートも出力されます。
しかし、Renovateでは更新されるhashの情報しか出ません。
特にメリットも無いと思うので、この記述ではなく、バージョンをフルで指定する事をおすすめします。
まとめ
hash指定をしたら、依存の自動更新も入れてバージョンアップを楽にしましょう!
おわりに
外部に公開するActionもhash指定を広げていき、業界全体で安全を広げていきましょう。
はてなで公開されているActionで使用されている物もバージョンを固定していきます。
https://github.com/hatena/hatenablog-workflows/pull/94
2025/03/18追記
Renovateの場合、自働でバージョンをhashで書き換えてくれる設定があるようです。但し、v4
をv4.1.0
のように置き換えてはくれないようなので、そこを変える場合は手動で対応する必要があります。
https://docs.renovatebot.com/presets-helpers/#helperspingithubactiondigests
https://github.com/hatena/renovate-config/pull/90 のPullRequestと https://techblog.kayac.com/2025-actionspin の記事が流れて来た為、追記しました。