GitHub Actions の cache アクションでキャッシュヒットしない時はスコープを確認してみる

2 min読了の目安(約1800字TECH技術記事

環境

はじめに

GitHub Actions で actions/cache を使っていて、キャッシュがヒットせず困っていた。

ワークフローの終わりに以下のようなメッセージが表示されている。

Cache saved successfully

にも関わらず、次にワークフローが開始すると以下のようなメッセージが出て、キャッシュヒットしていない。

Cache not found for input keys: Linux-gradle-ハッシュ値, Linux-gradle-

調べたら actions/cache には「スコープ」という概念があるのでまとめておく。

運用

デフォルトブランチが main で、変更は PR を作り、レビュー後 main ブランチにマージするという運用をしている。
この PR の内容で CI が通るかを確認したいので、PR のブランチで GitHub Actions のワークフローを走らせていた。
逆に main ブランチでは CI を走らせていなかった。これは、 GitHub Actions の実行時間を節約したいと考えていたため。

GitHub Actions の yaml ファイルでいうと以下のような設定をしていた。

.github/workflows/ci.yml
name: CI

on: pull_request

この運用だと、PR に追加でコミットするとちゃんとキャッシュヒットするが、新しく PR を作った時にはキャッシュヒットしないという現象が発生していた。

actions/cache のスコープ

actions/cache のマニュアルを読むと以下のようにある。

https://docs.github.com/en/actions/guides/caching-dependencies-to-speed-up-workflows#restrictions-for-accessing-a-cache

A workflow can access and restore a cache created in the current branch, the base branch (including base branches of forked repositories), or the default branch (usually main)

つまり、キャッシュは単にキーのマッチングを見るだけではなく、以下から探すという動きをする。

  • 現在のブランチ
  • ベースブランチ
  • デフォルトブランチ

言い方を変えれば、上記に含まれない別のブランチで作られたキャッシュはたとえキーが一致してもキャッシュとしては使われない。

上記のように PR の作成時にのみ GitHub Actions のワークフローを実行するような運用だと、PR 作成時のベースブランチやデフォルトブランチにはキャッシュがないため、キャッシュヒットしない。

修正する

原因がわかったので、 yaml ファイルを以下のように修正した。

.github/workflows/ci.yml
on:
  pull_request:
  push:
    branches:
      - master

これで無事に PR の作成時にもキャッシュヒットするようになった。
私の環境では GitHub Actions 合計実行時間も結果的には短縮された。

まとめ

  • GitHub Actions でキャッシュが効くはずなのに効かない時にはスコープを確認してみる
  • キャッシュのスコープは以下
    • 現在のブランチ
    • ベースブランチ
    • デフォルトブランチ