公開日

不要なGitHub Actionsのキャッシュを削除するdelete-action-cacheを作った

(image)不要なGitHub Actionsのキャッシュを削除するdelete-action-cacheを作った

TL;DR

不要なGitHub Actionsのキャッシュを簡単に削除できるtoshimaru/delete-action-cacheというActionを作った。

GitHub Actions Cacheの容量制限

GitHub Actionsのキャッシュの保持容量は10GBまでという制限がある。

GitHubは、7日間以上アクセスされていないキャッシュエントリを削除します。 保存できるキャッシュの数に制限はありませんが、リポジトリ内のすべてのキャッシュの合計サイズは制限されています (最大 10 GB)。

ref. 依存関係をキャッシュしてワークフローのスピードを上げる - GitHub Docs

キャッシュが超過している・超過しそうだと下記のような警告が表示される。

Least recently used caches will be automatically evicted to limit the total cache storage to 10 GB. Learn more about cache usage.

cache超過の警告

キャッシュ容量制限で困るケース

比較的小さいプロジェクトであれば、この制限に引っかかることは少ないだろう。

しかし下記のようなケースで、この10GBという制限が足かせになることがある。

  • 巨大な Monorepo を運用している
  • docker/build-push-actionなどを使って大きいdockerイメージをレイヤーキャッシュしている

10GBを超えると古いキャッシュから削除されていくため、キャッシュスラッシングが発生してビルドが遅くなったり、場合によってはビルドが壊れることもある。

最近だとこちらの記事が話題になっていた:やんないほうがいいかも、GitHub Actions の setup-xxx での依存キャッシュ保存 - 誰かの役に立てばいいブログ

不要なキャッシュを削除するActionを作った

そういった問題を解決するため、不要なGitHub Actionsのキャッシュを簡単に削除できるActionを作った

toshimaru/delete-action-cache: Delete GitHub Actions Cache with ease.

具体的には下記のようなことが簡単にできるようになる。

  • Pull Request のマージ後、トピックブランチに紐づくキャッシュを削除
  • workflow_dispatch イベントをトリガーに、特定ブランチのキャッシュを削除
  • scheduleイベントをトリガーに、特定ブランチのキャッシュを削除

工夫したところ

今回のActionを作るにあたり、下記のような工夫をした。

自動リリース

r7kamura/bump-requestを使い、workflow_dispatchからPRマージでリリースできるように自動化を行った。

リリース自動化に関してはbump-requestの作者が解説記事を上げているので、そちらを参照するとよい。

メジャーバージョンリリースの自動化

GitHub Actions には v1.1, v1.2, v1.3… のようなリリースを v1 とメジャーバージョンに丸めて扱う慣習がある。

このへんのリリースは actions/checkout でやっている半自動アプローチを採用した。手動でworkflow_dispatchからリリース対象バージョンとタグを指定してリリースする方法である。

詳しくは下記の.github/workflows/update-main-version.ymlワークフローの内容を参照するとよい。

checkout/.github/workflows/update-main-version.yml at main · actions/checkout

おわり

もしGitHub Actionsのキャッシュ容量制限にお困りの方はお試しください。

余談

このActionを作るにあたり、gh cache listコマンドにオプションが欲しくなったので、付けておいた。

参考文献