💾

GitHub ActionsでGoのキャッシュが効かなかった話

に公開
2026/07/24

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