Nodejsプロジェクトで使用しているGithub Actionsのjobを並列実行するように組み替えて実行時間を短縮した

最近Next.jsを用いたアプリケーション開発で、LintかけたりStorybookのビルドをしたりテストをしたりといくつかのjobを直列で走らせていたのですが、結構時間がかかるようになってきたので並列実施に切り替えてみました。

ざっくり構成

  1. setup
  2. 各種チェック系の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が複数本走るような動きになってしまいます。
この場合はおそらくうまくキャッシュ参照ができない(ケースが多い)ため、パッケージの更新があればそれぞれでパッケージインストールが走ってしまうのでやめました。

やってみるとシンプルですが、もう少しスッキリかけてもいいのになと思ってみてました。
また気が向いたら探ってみようと思います。