はじめに
※6月26日に投稿予定でしたが、GitHub Actions のコードを変更したことで投稿できていなかったので、まとめて投稿します
こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。
GitHub ActionsでCIを回すたびに bundle install
や npm install
を毎回実行して時間がかかっていませんか?
その悩み、キャッシュ機能(actions/cache
)を使えば解決できます。
この記事では、GitHub Actionsにおけるキャッシュの基本的な仕組みから、Rubyプロジェクトでの使い方(bundler-cache: true
を含む)を解説します。
キャッシュとは?
GitHub Actionsのキャッシュとは、依存ファイルなどの重い処理結果を保存して、次回以降のワークフローで再利用する仕組みです。
Rubyプロジェクトであれば、vendor/bundle
にインストールされたgemをキャッシュすることで、次回の bundle install
を大幅に高速化できます。
基本構文(手動でキャッシュを使う)
- name: Cache Ruby gems
uses: actions/cache@v3
with:
path: vendor/bundle
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
${{ runner.os }}-gems-
各項目の意味
項目 | 説明 |
---|---|
uses: actions/cache@v3 |
GitHub提供のキャッシュアクションを使う |
path |
キャッシュしたいディレクトリ。ここでは vendor/bundle
|
key |
キャッシュを識別するための固有キー。Gemfile.lock のハッシュで依存変更を検出 |
restore-keys |
key にマッチしなかったときに、部分一致で使える予備キャッシュ |
キャッシュの流れ
-
key
で完全一致するキャッシュがあれば復元 - 見つからなければ、
restore-keys
の接頭一致キーを使う - ジョブが成功した場合、現在の
key
でキャッシュを保存
bundler-cache: true
の便利さ
Ruby用の ruby/setup-ruby
アクションには、Bundler用キャッシュを自動で行ってくれるオプションがあります。
- uses: ruby/setup-ruby@v1
with:
ruby-version: 3.3
bundler-cache: true
これがやってくれること
-
bundle config
の設定 -
bundle install
の実行 -
vendor/bundle
のキャッシュ -
Gemfile.lock
をキーにしたキャッシュキーの自動生成 -
actions/cache
を内部で使う
どちらを使えばいい?
比較項目 | bundler-cache: true |
手動で actions/cache
|
---|---|---|
記載量 | 少ない(1行で完結) | 多め(key , path など手動指定) |
メンテナンス性 | 高い | 精粋な調整が必要 |
カスタマイズ性 | 低め | 高い |
デバッグ性 | 見えにくい | 分かりやすい |
基本的には bundler-cache: true
を使うのが便利ですが、複数キャッシュを使いたい場合や、動作分析したい場合は手動で指定すると良いでしょう。
実践例:Ruby on Rails CI
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ruby/setup-ruby@v1
with:
ruby-version: 3.3
bundler-cache: true
- run: bin/rails db:schema:load
- run: bin/rake
注意点
-
Gemfile.lock
を必ずコミットする - キャッシュの保存はジョブ成功時のみ
- Freeプランは1リポジトリのキャッシュ上限が10GB
まとめ
項目 | ポイント |
---|---|
キャッシュとは | 重い処理結果を保存して再利用する機能 |
actions/cache@v3 |
手動でキャッシュパスやキーを指定する自由度の高い方法 |
bundler-cache: true |
Ruby特化の簡潔なキャッシュ設定 |
使い分けのコツ | 簡易なCIなら bundler-cache: true 、カスタマイズしたいなら手動設定 |
CIを高速化し、開発体験を良くするためにも、キャッシュは非常に重要な要素です。
まずは bundler-cache: true
から始め、必要に応じて手動設定へ発展していきましょう。