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 の記事が流れて来た為、追記しました。

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy