Nodejsプロジェクトで使用しているGithub Actionsのjobを並列実行するように組み替えて実行時間を短縮した
最近Next.jsを用いたアプリケーション開発で、LintかけたりStorybookのビルドをしたりテストをしたりといくつかのjobを直列で走らせていたのですが、結構時間がかかるようになってきたので並列実施に切り替えてみました。
ざっくり構成
- setup
- 各種チェック系のjob
- Lint / Unit Test
- Next Build
- Storybook Build
おかげで実施前に4msほどかかっていたものが、2msくらいに短縮できました
気になったこと
jobごとに違う環境になると思ったので、パッケージインストールをうまく処理する方法に迷いました。
結果的には、最初に実行するjobでパッケージインストールとキャッシュへの保存。後続のjobでキャッシュからのリストアを実施する形で落ち着きました。
setupでキャッシュに保存しているので、後続jobでも参照できるというのがミソですね。
setup:
:
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- uses: actions/cache@v3
id: node_modules_cache_id
env:
cache-name: cache-node-modules
with:
path: '**/node_modules'
key: ${{ runner.os }}-nodejs-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-nodejs-
- name: install node_modules
if: ${{ steps.node_modules_cache_id.outputs.cache-hit != 'true' }}
run: npm ci
lint_n_test:
needs: [setup]
:
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- uses: actions/cache@v3
id: node_modules_cache_id
env:
cache-name: cache-node-modules
with:
path: '**/node_modules'
key: ${{ runner.os }}-nodejs-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-nodejs-
- name: Lint
run: npm run lint
matrix を使った場合、wordflowが複数本走るような動きになってしまいます。
この場合はおそらくうまくキャッシュ参照ができない(ケースが多い)ため、パッケージの更新があればそれぞれでパッケージインストールが走ってしまうのでやめました。
やってみるとシンプルですが、もう少しスッキリかけてもいいのになと思ってみてました。
また気が向いたら探ってみようと思います。