概要
- Node.jsを使用しているCI/CD環境(今回はGitHub Actions)を高速化させたい
- 高速化のために
npm ciと.npmをCIでキャッシュする手法を用いる
npm ci とは
-
npm ciはpackage-lock.jsonを参照して依存関係をインストールするコマンド - 既に
node_modulesが存在する場合は一旦削除してからインストールが走る - とはいえ
package.jsonとpackage-lock.jsonのバージョン指定が食い違っている場合にはエラーを出してくれる- e.g. あるパッケージをバージョン
0.9.9でインストール後にpackage.jsonのバージョンだけ1.0.0に書き換えた場合等
- e.g. あるパッケージをバージョン
- 通常の
npm installの場合、package.jsonとpackage-lock.jsonの両方を見て、依存関係の解決とnode_modulesへのインストールと、場合によってはpackage-lock.jsonの更新も行われる -
npm ciを使うことで、開発時と運用時のパッケージのバージョンの差異を無くすことができる他、インストールにかかる時間もある程度短縮できる - npmではなくYarnを利用する場合は
yarn install --immutable --immutable-cache --check-cacheで近い挙動が実現できる
.npm とは
-
.npmはnpmのパッケージのキャッシュ - 通常はホームディレクトリ配下に設置されている
- インストール時に目当てのパッケージのキャッシュが
.npm配下に残っていると、ネットワークへのアクセス無しにインストールすることが可能となり、結果としてネットワークレイテンシが削減できる - このキャッシュをCIのキャッシュに含んでやることでさらなる速度向上が期待できる
- ちなみに
node_modules自体をキャッシュしていても、npm ciを使うと毎回削除されてしまうので意味がない - npmではなくYarnを利用している場合は、
~/.yarn-cacheにキャッシュが保存される
GitHub Actionsにおける設定
- 実際には以下のような設定をしてやると良い
.github/workflows/main.yml(抜粋)
...
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout master branch
uses: actions/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: 18.13.0
+ - name: Cache npm directory
+ uses: actions/cache@v3
+ with:
+ # CIでキャッシュするディレクトリやファイルのパス
+ path: ~/.npm
+ # キャッシュを保存・復元する際のキー
+ key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
+ # キーで指定したキャッシュがヒットしなかった際に代理として使用されるキー
+ restore-keys: ${{ runner.os }}-npm-
+ - name: Install node modules
+ run: npm ci
- name: Build app
run: npm run build
...