LoginSignup
5
2

More than 3 years have passed since last update.

GitHub Actions でキャッシュされない罠

Posted at

GitHub Actions の「beta」が取れ、キャッシュもできるようになったので、色々遊んでいます。
キャッシュの中で思わぬ罠に囚われてしまっていたので、共有しておきます。

結論

key が同じだと、キャッシュ対象のファイルに変更があったとしても、キャッシュが上書きされないという点です。
つまり、一度正常で無い状態で保存されると、それ以降は更新(保存)されません。 1

当たり前といえば当たり前ですが、公式にある examples 通りに使用すると、この問題に気づかずに引っかかってしまうような気がします。

actions/cache を使用すると、job の最後に保存処理が行われますが、そのログを見ると下記のように書いてあります。

# 通常の保存処理
Post job cleanup.
/usr/bin/tar -cz -f <キャッシュ保存パス> -C <キャッシュ対象パス> .
Cache saved successfully

# 既に同一キーのキャッシュが存在する場合
Post job cleanup.
Cache hit occurred on the primary key <KEY>, not saving cache.

具体例

前提

iOS で carthage を使用していたとします。
GitHub Actions で下記のような step を実行するとします。
キャッシュに関しては、公式に書いてある example 通りに記述しています。

- uses: actions/cache@v1
  with:
    path: Carthage
    key: ${{ runner.os }}-carthage-${{ hashFiles('**/Cartfile.resolved') }}
    restore-keys: ${{ runner.os }}-carthage-

- run: carthage bootstrap --platform iOS --cache-builds
  env:
    GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}

実行の流れ

1度目 の実行

  • 最初はキャッシュがないのでリストアされない
  • $ carthage bootstrap途中でなんらかのエラー 2Carthage/ フォルダ内は不完全
    ※ exit status は 0 とする
  • 不完全な Carthage/ ディレクトリを保存

2度目 の実行

  • キャッシュをリストア
  • $ carthage bootstrap は有効なキャッシュがあれば使用する 3 が、今回は無いので、ゼロからすべてインストール。
    つまり Carthage/ ディレクトリ内は完全な状態。
  • 同一のキーで既にキャッシュ済みなので 保存は行わないCarthage/ フォルダ内は不完全なまま!

3度目 以降

「2度目の実行」と全く同じ処理になる。
つまり、キャッシュを使用して $ carthage bootstrap の処理を早めたいのに、毎回ゼロから実行しているのと同じことになる。キャッシュ機能を利用していないのと同じことになる。

解決策

ようはキーが毎回変わればいいわけです。
自分は下記のように -${{ github.sha }} を付け足しました。

注意すべきは、key は毎回変わるので正しくリストアされるように restore-keys を指定することです。
また、キャッシュが毎回上書きされるということは、正常な状態のキャッシュを不正常なファイルで上書きしてしまう可能性があるということも念頭に置くべきです。

- uses: actions/cache@v1
  with:
    path: Carthage
    key: ${{ runner.os }}-carthage-${{ hashFiles('**/Cartfile.resolved') }}-${{ github.sha }}
    restore-keys: ${{ runner.os }}-carthage-

  1. 7日以上キャッシュにアクセスしないなど、削除された場合はこの限りではありません。 

  2. 本文中には記述してありますが、環境変数 GITHUB_ACCESS_TOKEN を記載しないと GitHub の API 利用制限に引っかかる可能性が高いです。この場合 exit status は 0 となります。
    参照: http://yudoufu.hatenablog.jp/entry/2016/06/09/011754 

  3. --cache-builds を指定しているので。 

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2