actions/setup-node v4 から v5 へ移行する
- 投稿した日
- 更新した日
- 書いたひと
- ひらたけ
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.json
で packageManager
が設定されている際に自動的にキャッシュの処理が実行されるようになり、その関係でエラーが発生しているらしい。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 から 削除されていた ので、ついでにこちらも対応。ワークフロー、一度書いたら他のところでもコピペで使いまわしをしがちなので、ちゃんとたまにはメンテナンスをしないといけないなと思いました。