GitHub Actionsでnode_modulesのキャッシュしてワークフローを高速化する

ワークフローとキャッシュの流れ

ワークフロー開始

ステップ:node_modulesのキャッシュが存在するか、キャッシュのキーをもとに確認

  • 初回ワークフロー実行時もしくは、package-lock.jsonに変更があった場合はキャッシュが存在しない判定になる

ステップ:依存関係のインストール

  • キャッシュがなければ、npm install実行して依存関係をインストールしnode_modulesディレクトリ生成
  • キャッシュがあれば、キャッシュからリストアして、このステップを飛ばす

テスト実行など

ステップ:キャッシュのポスト

  • キャッシュを生成する。生成の際は一意のキーを持たせるため、package-lock.jsonをハッシュ化した値とOS環境情報などを組み合わせる
  • 初回ワークフロー実行時または、package-lock.jsonの値に変更があれば、キャッシュのポストが実行され、lockファイルに変更がなければ実行されないようになっている(依存関係に変更がなければ同じキャッシュを使用する)

設定手順

actions/cacheという専用のアクションがあるので、こちらを使用する

ymlファイル例

あくまでも一例なので参考程度に。

Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over 330 million projects.

ポイント

重要なポイントのみ抜粋します

  • キャッシュの対象を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が実行され、キャッシュがヒットしないので、ワークフローの最後でポストされる

Git学習におすすめの書籍

Javascript学習におすすめの書籍

 

タイトルとURLをコピーしました