GitHub Actionsの外部Actionのバージョンをhash指定にし、可読性を維持しつつバージョンを上げる

こんにちは、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で書き換えてくれる設定があるようです。但し、v4v4.1.0のように置き換えてはくれないようなので、そこを変える場合は手動で対応する必要があります。
https://docs.renovatebot.com/presets-helpers/#helperspingithubactiondigests

https://github.com/hatena/renovate-config/pull/90 のPullRequestと https://techblog.kayac.com/2025-actionspin の記事が流れて来た為、追記しました。