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](iOS で carthage を使用していたとします。) 通りに記述しています。
- 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
が 途中でなんらかのエラー 2 →Carthage/
フォルダ内は不完全
※ 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-
-
7日以上キャッシュにアクセスしないなど、削除された場合はこの限りではありません。 ↩
-
本文中には記述してありますが、環境変数
GITHUB_ACCESS_TOKEN
を記載しないと GitHub の API 利用制限に引っかかる可能性が高いです。この場合 exit status は 0 となります。
参照: http://yudoufu.hatenablog.jp/entry/2016/06/09/011754 ↩ -
--cache-builds
を指定しているので。 ↩