uga.dev - A Front-end Engineer's shed

現在のテーマは「ライトモード」です。

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すると通る。そんな妙な挙動に遭遇しました。

  1. Botや開発者がPRを作成

  2. CIでyarn install --immutableが実行される

  3. フォーマットチェックが 失敗 する

  4. 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で次のように結果が変わるようです。

初回実行:

  1. yarn install --immutableが実行される

  2. package.jsonが書き換わる

  3. フォーマットチェック失敗

Re-run:

  1. キャッシュ読み込み

  2. yarn install処理をスキップ

  3. フォーマットチェック成功

解決策

フォーマッターの設定でpackage.jsonに対するprintWidth1に設定するだけです。

.prettierrc.jsの例
overrides: [
  {
    // Yarn Berryがinstall時にpackage.jsonの配列を複数行に正規化するため、
    // prettierの出力をYarnと一致させてフォーマットチェックの不整合を防ぐ
    files: ['package.json'],
    options: {
      printWidth: 1,
    },
  },
],

もともとが改行する設定になっていれば問題ないですが、1行にできるなら1行にしたい!という現場だと、なかなかエッジケースな落とし穴ですね🪤

脚注