Git pre-push フックでリントチェック後のプッシュ失敗条件を変更する

2025年3月11日火曜日

作業の背景

我々のチームのプロジェクトでは、importの並び替えまでを強制する厳しいリントルールが適用されています。 おかげでコードスタイルの統一が図られていますが、PRを生成した後にCIでリントエラーが発生する問題も時々あります。

頻繁ではないものの、リントエラーが発生すると、ローカルでスクリプトを実行してリントエラーを修正し、再びコードをプッシュする必要があります。 非常に手間のかかる作業で、コードレビューの時間が長引く大きな原因の一つでもありました。そのため、他のチームメンバーにpre-pushフックでリントチェックを導入することを提案しました。

他のメンバーの同意を得た上で、既存のlint-fix:globalスクリプトを活用して、以下のようにpre-pushフックを作成しました。

echo "🔍 リント修正を実行中..."
pnpm run lint-fix:global

# 変更があるか確認
if ! git diff --quiet; then
  echo "❌ リントがいくつかのファイルを修正しました。プッシュする前に変更をコミットしてください。"
  exit 1
fi

しかし、次の日には以下のようなフィードバックがありました。一部の方は上記のコードでの問題点がすぐにお分かりかと思います。

lint-fix:globalの実行とは無関係に、一部のファイルをステージ状態でプッシュしようとすると、Gitプッシュが失敗してしまうのです。🤦

最終的には、リント修正よりも単純にリントエラーチェックを行う方が適切だと考え、以下のようにコードを修正しました。

echo "🔍 リントを実行中..."

if ! pnpm run lint -- --quiet; then
  echo "❌ リントエラーが検出されました。"
  echo "👉 エラーを自動で修正するには: pnpm run lint-fix:global"
  exit 1
fi

上記のコードでいうlintスクリプトは、実際にはnext lintを実行するスクリプトです。 --quietオプションを加え、エラーのみを出力させ、エラーが発生した場合にはエラーメッセージを表示して、プッシュを阻止します。 また、折角なので他のチームメンバーのためにもエラーメッセージ表示をさらに親切に変更しました。

今後はCIでリントエラーにより時間を浪費することがないことを願っています。🙏