概要
Node.jsの必要なパッケージをインストールする際はワークフローを実行するたびに新しいrunnerを使用する関係でパッケージを1からインストールします
パッケージが少ないうちはいいものの、プロジェクトが大きくなるにつれてパッケージが多くなるとパッケージのインストール時間分ワークフローの実行時間が長くなってしまいます
そこでパッケージをインストールする際はCacheを使うとパッケージがどんなに多くてもインストール作業を数秒以内に終わらせることができます
今回はGitHubの公式で公開されている
- actions/cache
- actions/setup-node
について解説していきます
actions/cache
公式が出しているActionで今回使用するNode.js以外の言語やDockerのCacheも扱うことができます
詳細は以下の公式ドキュメントに記載されています
以下を例に説明します
- name: Cache dependencies
uses: actions/cache@v3
with:
path: '**/node_modules'
key: node-modules-${{ hashFiles('**/package-lock.json') }}
- name: Install dependencies
run: npm ci
path
今回Cacheするのはnode_modulesで**
をつけるとソースコード内にある全てのnode_modulesのCacheを作成します
**
をつけることでnode_modulesのパスが変更したとしてもCacheを作成してくれるので便利です
key
Cacheを参照する際に一意のkeyが必要です
key: node-modules-${{ hashFiles('**/package-lock.json') }}
node-modules
の箇所はどんなCacheか判別できさえすれば任意の値で大丈夫なのですが
${{ hashFiles('**/package-lock.json') }}
で一意のkeyを作成します
package-lock.jsonを指定しているので必ずGit管理下に置く必要があります
hashFiles関数
ワークフロー内で使用できるGitHub Actions独自のメソッドです
path パターンに一致するファイル群から単一のハッシュを返します。
この関数はマッチしたそれぞれのファイルに対するSHA-256ハッシュを計算し、それらのハッシュを使ってファイルの集合に対する最終的なSHA-256ハッシュを計算します。
簡単に説明するとpackage-lock.jsonの内容をもとに一意のハッシュ値を作成しています
以下のようにnode-modules-<package-lock.jsonのハッシュ値>
がCacheを参照する際のkeyとして使用されます
2回目以降のパッケージのインストールはkeyをもとに該当するCacheを探します
該当するCacheがあればそれを使用するのでパッケージのインストールが高速化されます
新たなパッケージがインストールされるとpackage-lock.jsonが変更、つまりkeyの値が変わるのでインストール作業を1から行い、新たなkeyをもとにCacheを生成します
そのため、package-lock.jsonなど頻繁に変更されないファイルを使ってCacheを生成するのが一般的です
詳細は以下の公式ドキュメントに記載されています
npm ci
CI/CDではパッケージをインストールする際はnpm installではなく、npm ciを使用します
npm ciを使用するとパッケージの依存関係の解消は行わずに常に package-lock.json を見てnode_modulesを削除してからパッケージのインストールを行います
仮に依存関係が間違っている場合はnpm installのように依存関係を解決せずに実行するのでエラーを出してくれます
そのため、actions/cacheの公式ドキュメントでもnpm installではなく、npm ciを推奨しています
actions/setup-node
setup-nodeでも同様のことができます
- name: Cache Dependencies
uses: actions/setup-node@v3
with:
node-version: '16'
cache: 'npm'
- name: Install dependencies
run: npm ci
actions/cacheと比べて記述が楽な上にNode.jsのセットアップも同時にできます
しかし、複数ワークフローで使用するとワークフローの数だけCacheが生成されてしまうのでactions/cacheの使用を推奨しています
setup-nodeの詳細は以下の公式ドキュメントに記載されています
参考