Pull Requestの初回だけpackage.jsonが原因でフォーマットチェックCIが失敗する問題
公開日:
- #DevOps
- #Yarn
- #Node.js
- #Formatter
- #Prettier
- #Tips
Yarn Berry(v4)はyarn install時にpackage.jsonの一部のメタデータフィールドを複数行に正規化する仕様になっていて、CIのフォーマットチェックで初回だけ転ける原因になることがあります。
発生する事象
Yarn: 4.x (Berry)
Prettier: 3.x
Node.js: 24.x
PullRequestを立てると、なぜか初回だけフォーマットチェックが落ちて、Re-runすると通る。そんな妙な挙動に遭遇しました。
Botや開発者がPRを作成
CIで
yarn install --immutableが実行されるフォーマットチェックが 失敗 する
Re-runすると 成功 する
Checking formatting...
[warn] package.json
Code style issues found in the above file. Run Prettier with --write to fix.原因
- "keywords": ["yarn", "prettier", "ci"],
+ "keywords": [
+ "yarn",
+ "prettier",
+ "ci"
+ ],なんとyarn install自体がpackage.jsonをフォーマットすることが原因でした。immutableとは一体…?
なお、この挙動にオプトアウトする設定は存在しないようです[1]。
こうした背景があるため、依存キャッシュの有無でyarn installの実行可否が分岐するCI構成では、初回とRe-runで次のように結果が変わるようです。
初回実行:
yarn install --immutableが実行されるpackage.jsonが書き換わるフォーマットチェック失敗
Re-run:
キャッシュ読み込み
yarn install処理をスキップフォーマットチェック成功
解決策
フォーマッターの設定でpackage.jsonに対するprintWidthを1に設定するだけです。
overrides: [
{
// Yarn Berryがinstall時にpackage.jsonの配列を複数行に正規化するため、
// prettierの出力をYarnと一致させてフォーマットチェックの不整合を防ぐ
files: ['package.json'],
options: {
printWidth: 1,
},
},
],もともとが改行する設定になっていれば問題ないですが、1行にできるなら1行にしたい!という現場だと、なかなかエッジケースな落とし穴ですね🪤
脚注
- [^1]:Yarnのissue #6282とissue #6298はいずれも"not planned"でクローズされていて、機能リクエストであるissue #2712は数年間大きな動きがない。