💾
GitHub ActionsでGoのキャッシュが効かなかった話
1. はじめに
GitHub Actionsを使ってGoプロジェクトのCI/CDを構築している際に、Goのビルドキャッシュがうまく機能せず、毎回依存関係のダウンロードとビルドが実行されてしまい、CIの実行時間が長引いてしまう問題に直面しました。
この記事では、その原因と解決策についてまとめます。
2. 問題が発生したコード
当初、以下のように actions/cache アクションを使用して、キャッシュを効かせようとしていました。
といっても、これはAIが提案してくれたものです。(と、自分が考えたわけじゃないよという言い訳)
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
go-version: [1.22, 1.23]
steps:
- uses: actions/checkout@v4
- name: Set up Go ${{ matrix.go-version }}
uses: actions/setup-go@v4
with:
go-version: ${{ matrix.go-version }}
- name: Cache Go modules
uses: actions/cache@v4
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ matrix.go-version }}-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-${{ matrix.go-version }}-
${{ runner.os }}-go-
しかし、この設定だと以下のようなメッセージが出て、キャッシュが効いていないようでした。
Error: /usr/bin/tar: ../../../go/pkg/mod/golang.org/x/text@v0.24.0/transform/examples_test.go: Cannot open: File exists
Error: /usr/bin/tar: ../../../go/pkg/mod/golang.org/x/text@v0.24.0/transform/transform_test.go: Cannot open: File exists
Error: /usr/bin/tar: ../../../go/pkg/mod/golang.org/x/text@v0.24.0/transform/transform.go: Cannot open: File exists
Error: /usr/bin/tar: ../../../go/pkg/mod/golang.org/x/text@v0.24.0/search/index.go: Cannot open: File exists
Error: /usr/bin/tar: ../../../go/pkg/mod/golang.org/x/text@v0.24.0/search/pattern_test.go: Cannot open: File exists
3. 原因
考えられる原因は以下の通りです。
パスが正しく展開されていない可能性
~/ ではなく $HOME/… や $(go env GOMODCACHE) を使う方が確実です。
setup-goとの二重管理
setup-go が後段でキャッシュを書き換え、次のジョブでキーが不一致となり、キャッシュミスヒットが起こるケースが考えられます。
4. 解決策
ドキュメントを読むのが良いだろうということで、actions/setup-goを確認しました。
actions/setup-go はv5から、標準でキャッシュが効くため、actions/cache は不要です。
以下のように .github/workflows/ci.yml を修正しました。設定がとてもシンプルになりました。
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
go-version: [1.22, 1.23]
steps:
- uses: actions/checkout@v4
- name: Set up Go ${{ matrix.go-version }}
uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go-version }}
cache-dependency-path: |
**/go.sum
5. CI時間の変化
以下のように若干時間が短縮されました。劇的というわけではありませんが、短いことは良いことです。
- 変更前:1分38秒
- 変更後:1分14秒
Discussion