GitHub Actionsの外部ActionでVersionTagを使ってるものを一括でCommitHashにしたい。

こんにちは。今年からグループ情報部という部署にいる 池田(@mashiike) です。

背景

先日、GitHub Actionsの tj-actions/changed-files にセキュリティインシデントがありました。実は、 reviewdog/action-setup 経由らしいという話が直近の話題です。

nvd.nist.gov

www.wiz.io

サプライチェーン攻撃が本格的に心配になってきた今日このごろです。 さて、このような状況で、GitHub Actionsの外部actionへの攻撃に対する対策はどうしたら良いのでしょうか?

そんなとき、ちょうど次の記事が公開されまして、「へぇーRenovateとDependabotならCommitHash直指定でも自動で上げてくれるんだ〜」と知りました。

developer.hatenastaff.com

やっぱり、対策はCommitHashで直指定して、あとはRenovateやDependabotつくったPRを精査という感じなのでしょう。 これから、たくさんのリポジトリのものを置き換えねば!

実際にやってみたら・・・

試しに1つのリポジトリでやってみました。

しっかりCI/CDを整えていると、48行と地味に差分が多くなります。
さらに、現行で使っているバージョンのコミットハッシュが何なのかを調べる作業が地味にトイルでした。

これを、多数のリポジトリにやるのは面倒だ!と思いました。 そこで、誰かが作ってそうですがシュッと小物を作成しました。

github.com

$ brew install mashiike/tap/actionspin

homebrew tapもあるので、インストールも簡単です。

このツールでは、リポジトリルートで actionspin と実行すると、 .github 配下のワークフローの uses の中で、version tag で参照しているものを見つけて、 commit hash に変換してくれます。

$ actionspin
{"time":"2025-03-18T14:42:20.911018+09:00","level":"INFO","msg":"replace uses","path":"workflows/test.yaml","owner":"actions","repo":"setup-go","ref":"v5","commitHash":"f111f3307d8850f501ac008e886eec1fd1932a34"}
{"time":"2025-03-18T14:42:21.415795+09:00","level":"INFO","msg":"replace uses","path":"workflows/test.yaml","owner":"actions","repo":"checkout","ref":"v4","commitHash":"11bd71901bbe5b1630ceea73d27597364c9af683"}
Replaced uses:
  - actions/setup-go@v5 -> f111f3307d8850f501ac008e886eec1fd1932a34
  - actions/checkout@v4 -> 11bd71901bbe5b1630ceea73d27597364c9af683

Replaced files:
  - .github/workflows/test.yaml

実際に実行してみるとこんな感じですね。

--- a/.github/workflows/test.yaml        2025-03-18 11:41:16
+++ b/.github/workflows/test.yaml        2025-03-18 14:36:32
@@ -20,13 +20,13 @@
     runs-on: ubuntu-latest
     steps:
       - name: Set up Go
-        uses: actions/setup-go@v5
+        uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5
         with:
           go-version: ${{ matrix.go }}
         id: go
 
       - name: Check out code into the Go module directory
-        uses: actions/checkout@v4
+        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
 
       - name: Build & Test
         run: |

これで、一括で commit hash に変換できました。

余談&まとめ

そこで、誰かが作ってそうですがシュッと小物を作成しました。

x.com

ツール作成の告知に、類似ツールがあるそうですというご報告をいただきました。 ちょっとした作業を自動化するときに、100行くらいかーとすぐに書いてしまうのが、エンジニアの性なのかもしれませんね。
このようなツールはいくつかがあるようなので、今回を期にGitHub Actionsの外部Actionはcommit hashでピン留めすることをご検討ください。

カヤックでは、ちょっとしたモノを書くのが好きなエンジニアも募集しています!