ワークフローとキャッシュの流れ
ワークフロー開始
↓
ステップ:node_modulesのキャッシュが存在するか、キャッシュのキーをもとに確認
- 初回ワークフロー実行時もしくは、package-lock.jsonに変更があった場合はキャッシュが存在しない判定になる
↓
ステップ:依存関係のインストール
- キャッシュがなければ、npm install実行して依存関係をインストールしnode_modulesディレクトリ生成
- キャッシュがあれば、キャッシュからリストアして、このステップを飛ばす
↓
テスト実行など
↓
ステップ:キャッシュのポスト
- キャッシュを生成する。生成の際は一意のキーを持たせるため、package-lock.jsonをハッシュ化した値とOS環境情報などを組み合わせる
- 初回ワークフロー実行時または、package-lock.jsonの値に変更があれば、キャッシュのポストが実行され、lockファイルに変更がなければ実行されないようになっている(依存関係に変更がなければ同じキャッシュを使用する)
設定手順
actions/cacheという専用のアクションがあるので、こちらを使用する
ポイント
重要なポイントのみ抜粋します
- キャッシュの対象をpathに指定
- keyには、osの情報や環境情報とpackage-lock.jsonのキャッシュファイルを組み合わせた値を指定する
- idは後ほど、依存関係のインストールを行うか行わないかの判定の際に使用する
jobs:
test:
steps:
- name: Cache dependenciesuses
uses: actions/cache@v3
id: node_modules_cache_id
env:
cache-name: cache-node-modules
with:
path: node_modules
key: ${{ runner.os }}-npm-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
- actions/cacheの結果はcache-hitというキーに真偽値としてセットされるので、これを使用して、npm installを実行するか、スキップするかを分岐させる
・・・
- name: Install npm package
if: ${{ steps.node_modules_cache_id.outputs.cache-hit != 'true' }}
run: npm install
- name: Run test
run: npm run test
- キャッシュありの場合は、npm installがスキップされ、キャッシュがヒットするので、ワークフローの最後でポストされない
- キャッシュなしの場合は、npm installが実行され、キャッシュがヒットしないので、ワークフローの最後でポストされる
まとめ
いかがでしたでしょうか。本記事では、GitHub Actionsでnode_modulesのキャッシュしてワークフローを高速化する方法について具体的なymlファイルの書き方を例に挙げながら、紹介しています。ぜひ参考にしてみて下さい