Hiratake Web ロゴ

actions/setup-node v4 から v5 へ移行する

投稿した日
更新した日
書いたひと
icon
ひらたけ

GitHub Actions のワークフローで使用している、Node.js の設定などを行う actions/setup-node の v5 が出ていたので更新 しました。一応リポジトリに導入している Renovate によって、actions/setup-node を更新するプルリクエストは自動的に作成されていましたが、更新後の状態でのワークフローの実行に失敗していて手動で修正が必要な状態に。

これから他のリポジトリで作業するとき用に、備忘録的な感じで更新時に変更した箇所について書いておこうかなと思います。


更新前のワークフローは以下の通り。使用していた actions/setup-node のバージョンは v4.2.0、パッケージマネージャーは pnpm を利用しています。

# CI
name: CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
  workflow_dispatch:

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.event.number || github.sha }}
  cancel-in-progress: ${{ github.event_name != 'push' }}

jobs:
  # Lint
  lint:
    name: Lint
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest]
        node: [22]
    timeout-minutes: 10

    steps:
      - name: Checkout
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8

      - name: Setup Node.js
        uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a
        with:
          node-version: ${{ matrix.node }}

      - name: Setup pnpm
        uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda
        id: pnpm-install
        with:
          run_install: false

      - name: Get pnpm store directory
        id: pnpm-cache
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT

      - name: Setup pnpm cache
        uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809
        with:
          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-

      - name: Install dependencies
        run: pnpm install

      - name: Run lint
        run: pnpm lint

このワークフローのままで、actions/setup-node を v5 へと更新しようとすると、ワークフロー実行時に以下のエラーが出力されて失敗してしまいました。

Error: Unable to locate executable file: pnpm. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.

v5 では、package.jsonpackageManager が設定されている際に自動的にキャッシュの処理が実行されるようになり、その関係でエラーが発生しているらしい。package.json に「pnpm を使うよ!」と記述があるにも関わらず、pnpm のセットアップを行う pnpm/action-setup は actions/setup-node の後に記述されているので、pnpm が存在しないとして怒られが発生しているっぽい。

actions/setup-node の Issues を漁って見つけた以下の Issue でも、actions/setup-node を呼び出す前に pnpm が利用できるようにするか、package-manager-cache: false を指定して自動キャッシュの機能を無効化するかしてね的なことが書かれていました。

というわけで、actions/setup-node と pnpm/action-setup の順番を入れ替えて、pnpm が利用可能な状態で実行してあげると、うまく動作しました。

# (省略)
    steps:
      - name: Checkout
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8

      - name: Setup pnpm
        uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda
        id: pnpm-install
        with:
          run_install: false

      - name: Setup Node.js
        uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444
        with:
          node-version: ${{ matrix.node }}
          cache: 'pnpm'
# (省略)

また、本当に actions/setup-node の前に pnpm/action-setup を実行して良いのか不安だったので、pnpm の方のドキュメントを読みにいったのですが、pnpm/action-setup の README では pnpm/action-setup を先に実行していて、私は一体何を参考にワークフローを書いていたんだ…?となりました。

あと pnpm/action-setup の後に書いていたキャッシュ云々の処理が README から 削除されていた ので、ついでにこちらも対応。ワークフロー、一度書いたら他のところでもコピペで使いまわしをしがちなので、ちゃんとたまにはメンテナンスをしないといけないなと思いました。