pnpm v7でrenovateがエラーを吐いたときの話
環境
- pnpm v7.0.0
- renovate v32.36.0(GitHub appで利用)
概要
v7.0.0のpnpmを使用しているプロジェクトで、renovateを用いた依存関係更新を行うと、renovateのプルリクエストに以下のようなエラーが表示され、CIがfailする場合がある。
⚠ Artifact update problem
Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is.
♻ Renovate will retry this branch, including artifacts, only when one of the following happens:
- any of the package files in this branch needs updating, or
- the branch becomes conflicted, or
- you click the rebase/retry checkbox if found above, or
- you rename this PR's title to start with "rebase!" to trigger it manually
The artifact failure details are included below:
File name: pnpm-lock.yaml
npm notice npm notice New minor version of npm available! 8.5.0 -> 8.6.0 npm notice Changelog: <https://github.com/npm/cli/releases/tag/v8.6.0> npm notice Run `npm install -g npm@8.6.0` to update! npm notice
どうやらPRではpnpm-lock.yaml
の更新に失敗し、package.json
のみが更新されているらしい。CIがコケた直接の原因はこれらのファイルの内容の不一致にあるようだ。
解決策
プロジェクトルートの.npmrc
に以下の一行を付加する。
strict-peer-dependencies=false
詳細
関連Issue:
pnpm v7で--strict-peer-dependencies
オプションのデフォルト値がtrue
となったことで、peerDependencies
の警告を無視して運用しているプロジェクトでは、pnpm update <package>
等がエラーコードで終了するようになった。これに伴い、renovate側でもpnpm-lock.yaml
関連の処理がエラー扱いされ、同ファイルが更新対象から外されることになったと思われる。
あくまで仕様変更の問題であるため、該当オプションをfalse
にしてやれば問題なく動作する(試した限り、renovateは.npmrc
を読んでくれるようだ)。