🪟

【GitHub Actions】 pnpm v10でCI/CDが突如失敗しました

に公開

はじめに

こんにちは、がんがんです。GitHub ActionsでESLint jobが突如失敗するというケースに遭遇しました。

原因を調査すると ESLint ではなく pnpm のアップデートが何やら絡んでそうでした。
現在CI/CDも復旧しており、本件の調査備忘録を残しておきたいと思います。

3行まとめ

  • pnpm v9.7 以降は corepack の仕様が少し変わります
  • GitHub Actions に pnpm のセットアップを追加することで解決します
  • バージョンの固定、リリースノートの観測は大事

エラーが発生していた箇所

エラーが発生していたのは setup/node ジョブでした。今まで通っていたセットアップでコケており、あまり身に覚えのないエラーでした。

以下のようなエラーが発生していました。 Renovate bot のマージ以外はマージしてなかったので「なんでやろ? 🤔🤔🤔」となりました。

Error: /usr/local/lib/node_modules/corepack/dist/lib/corepack.cjs:21535
  if (key == null || signature == null) throw new Error(`Cannot find matching keyid: ${JSON.stringify({ signatures, keys })}`);

https://github.com/shinGangan/nuxt-nuxtui-templates/actions/runs/13851782833/job/38760198412

原因は corepack enable でした

原因を調査すると pnpm v9.7のバージョンアップ が原因でした。
pnpm v9.7のリリースノートに以下のような記載があります。

Added pnpm version management. If the manage-package-manager-versions setting is set to true, pnpm will switch to the version specified in the packageManager field of package.json #8363.

どうやら corepack 有効にするだけでは pnpm を利用できず、あらかじめ pnpm のインストールが必要になったようです。



以下の記事が非常に分かりやすくまとめられていました。バージョンアップの対応策はこちらの記事を見ていただいた方が分かりやすいです。

https://zenn.dev/euxn23/articles/399a6815ddac93



pnpm v10 のドキュメントではmanage-package-manager-versions = trueがデフォルトと記述されています。

https://pnpm.io/settings#managepackagemanagerversions

対応した内容

GitHub Actions から corepack を剥がし、pnpm を別途インストールするように変更しました。

    steps:
      - uses: actions/checkout@v4
-     - run: corepack enable
-     - uses: actions/setup-node@v4
+     - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
+     - uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
        with:
          node-version-file: 'package.json'
          cache: 'pnpm'

おわりに

今回はGitHub Actions + pnpm v10 で発生したエラーについての調査備忘録を書きました。

ユーンさんの「pnpm v10 で corepack 不要で pnpm 自身のバージョン管理が可能に」は公開日に観測しており「CI/CDからcorepack剥がす必要ありか。後で詳細調べよう」と思ったことを記憶しています。
調べることをすっかり忘れ、忘れていた頃に急遽叩かれた気持ちでした。定期的なリリース確認、バージョンの固定は大事だなって改めて思いました。明日は我が身です。

pnpm v10対応はDockerfile作成時にも同様の対応が必要になります。こちらは別途備忘録を残せたらと思っています。

Discussion