💾

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秒
GitHubで編集を提案

Discussion