メインコンテンツまでスキップ

GitHub Actions上でのキャッシュの利用

· 約6分
Yuga Inamura

こんにちは、SREチームの稲村です。

みなさんはGitHub Actionsでキャッシュを使っていますでしょうか。基本的にGitHub Actionsはビルドが走る度に新たなインスタンスが作成される為、毎回ビルドに必要なライブラリをダウンロードしてしまいます。

最近私もJenkinsでビルドしていたアプリケーションをGitHub Actionsに移行するタスクを行なった際に、キャッシュを使ってビルド時間の短縮させました。

その時に学んだ事を共有します。

Actions一覧


Actionsは GitHub Marketplace から探しましょう。
https://gitHub.com/marketplace?type=actions

GitHub Actions 公式からは次の Actions が出ています。
https://gitHub.com/marketplace/actions/cache

Cache先


Cache先は次の選択肢があります。

  • GitHub Actionsキャッシュストレージ
  • S3などの外部ストレージ

Storageの選択肢が無いActionsは基本的にはGitHub Actionsのキャッシュストレージを使用していると考えて良いでしょう。

actions/cache を使ってみた


Cache先はGitHub Actions Storageのみです。

- name: cache vendor
uses: actions/cache@v2
with:
path: vendor
key: ${{ runner.os }}-vendor-${{ hashFiles('Gemfile.lock') }}
restore-keys: |
${{ runner.os }}-vendor-

キャッシュ使用前後でのbundler install時間の比較です。

before Docusaurus Plushie

after Docusaurus Plushie

50秒掛かっていたパッケージのインストールが0秒まで短縮されました。

ただし、キャッシュの取得にも時間がかかっている事に留意してください。
今回の場合は15秒使っているため、実際には35秒間の短縮です。

Docusaurus Plushie

actions/cache の説明

上記を記述した場合、restore/saveの2つのステップが作成されます。
restoreは記述した箇所で実行され、saveは全てのステップが終了後に実行されます。

なお、v3以降のバージョンであれば、saveステップを自由に挿入できます。

parameters説明

  • path
    • キャッシュしたいファイルパス
  • key
    • キャッシュエントリーから完全に一致したファイルを探すためのキー
  • restore-keys
    • キャッシュエントリーから曖昧に一致したファイルを探すためのキー
    • 前方一致したファイルを取得します

ストレージの選択


上記でストレージの選択肢はGitHub Actionsストレージか外部ストレージと書きましたが、こちらについてメリデメを記載します。
必要に応じて使用するストレージは変更してください。

GitHub Actionsキャッシュストレージ

メリット

  • 外部ストレージへのアクセスのための設定をする必要がないため、簡潔に記載できる
  • 無料で利用できる

デメリット

  • 容量に制限があり、dockerイメージなどのサイズの大きいファイルをキャッシュすると、古いキャッシュが削除され、キャッシュミスが発生しやすくなる
    • 容量は10GB
    • ブランチ(+デフォルトブランチ)毎にキャッシュを管理する為、ブランチを大量に作成するとキャッシュミスが発生しやすくなる

外部ストレージ

メリット

  • 容量に制限が無い為、古いキャッシュが勝手に削除される心配が無く、キャッシュミスも起こりづらい

デメリット

  • 外部にアクセするための認証と認可が必要であり、設定が煩雑になる
  • 有料での利用になる

外部ストレージを使う場合のActionsの選択


目的などに合わせてActions Marketplaceから探してください。

例えば公式のキャッシュアクションと同じ感覚で使えて、S3を保存先としたい場合は、次のActionsなどが存在します。
https://gitHub.com/marketplace/actions/s3-cache

最後に


GitHub ActionsなどのマネージドCIサービスでのキャッシュの使用は難しいですが、それでも工夫をすれば毎回ダウンロードやアップロードを挟みつつも、キャッシュの利用は可能でした。

また、セルフホステッドランナーについてのドキュメント1に次の記述があり、うまく使いこなせればキャッシュアクションを使う必要もない可能性があります。

Don't need to have a clean instance for every job execution.

Actions Marketplace では2023年11月現在、Cacheで検索すると281件ヒットします。今後も新たなActionsが作成されていくにつれて、使いやすいものも増えていくでしょう。使いやすいActionsや最新情報などがあれば、また紹介させていただきます。