Yappli Tech Blog

株式会社ヤプリの開発メンバーによるブログです。最新の技術情報からチーム・働き方に関するテーマまで、日々の熱い想いを持って発信していきます。

GitHub Actionsのsetup-go@v4が変えるGoのCI/CD: 依存関係キャッシュを理解する

GitHub Actions は CI/CD パイプラインの自動化に不可欠なツールで、Go の開発者にも大変便利です。特に、依存ライブラリのキャッシュはプロジェクトの CI/CD 時間を短縮し、開発効率を向上させるために重要な機能です。最近リリースされた GitHub Actions のactions/setup-go@v4では、キャッシュ機能が組み込まれるようになりました。

この記事では setup-go の v3 と v4 におけるキャッシュ方法の違いに焦点を当てて紹介します。

setup-go@v3 におけるキャッシュ方法

v3 では以下のようにactions/cacheと組み合わせる必要がありました。

steps:
  - uses: actions/checkout@v3
  - uses: actions/setup-go@v3
    with:
      go-version: "1.20"
  - name: Cache Go modules
    id: cache-go
    uses: actions/cache@v3
    with:
      path: ~/go/pkg/mod
      key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
      restore-keys: |
        ${{ runner.os }}-go-
  - name: Download Go modules
    shell: bash
    if: ${{ steps.cache-go.outputs.cache-hit != 'true' }}
    run: go mod download

キャッシュがヒットしたかどうか知りたい場合は actions/cache を使う部分に id を指定して後続の処理で steps.ID.outputs.cache-hit を見ることで条件分岐ができます。

キャッシュの Key や Path などを正しく理解して設定してあげる必要があり、GitHub Actions に慣れていないと何をやっているのか見ただけで理解するのは難しいと思います。すべての開発者が CI/CD に興味があるわけではないので、ついメンテナンスが滞ってしまったり間違った設定でキャッシュされないまま運用されていたりすることもあります。

では v4 ではどのように改善されたのでしょうか?

setup-go@v4 におけるキャッシュ方法

v4 からはtoolkit/cacheを組み込むようになったので actions/cache を使う必要がなくなりました。

steps:
  - uses: actions/checkout@v3
  - uses: actions/setup-go@v4
    id: setup-go
    with:
      go-version-file: "go.mod"
  - name: Download Go modules
    shell: bash
    if: ${{ steps.setup-go.outputs.cache-hit != 'true' }}
    run: go mod download

キャッシュ機構が組み込みになったことでかなりスッキリしました。cache-hit についても提供されているため、従来通りキャッシュの有無に応じて処理を変えることも可能です。

詳細は setup-go のREADMEaction.ymlをご確認ください。

まとめ

簡単ではありますが setup-go の v4 からキャッシュ機構が組み込まれたことを紹介させていただきました。v3 までは「キャッシュをする」と意識して明示的に記述しなければいけませんでしたが、v4 からは意識せずにキャッシュが組み込まれるようになりました。CI/CD はどうしても属人化しやすい分野だと感じているので推奨設定がデフォルトで有効になるというのは非常に嬉しいです。

この記事をきっかけに放置気味になってしまっている CI/CD の設定を見直す機会になれば幸いです。