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

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

ワークフロー開始

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

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

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

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

テスト実行など

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

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

設定手順

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

ymlファイル例

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

my-ts-modules/node-app.yml at main · masayan1126/my-ts-modules
Contribute to masayan1126/my-ts-modules development by creating an account on GitHub.

ポイント

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

  • キャッシュの対象を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をコピーしました