작업의 맥락
우리 팀의 프로젝트에서는 import 정렬까지 강제하는 강력한 린트 규칙이 적용되어 있다. 덕분에 코드 스타일이 통일되는 장점이 있지만, PR을 생성한 후 CI에서 린트 에러가 간간히 발생하는 문제가 있었다.
자주 발생하는 사항은 아니었지만 린트 에러가 발생하게 되면 로컬에서 스크립트를 돌려 린트 에러를 수정하고, 커밋 후 다시 코드를 푸시해야하는 과정을 밟아야 했다. 무척 번거로운 작업이거니와 결국 코드 리뷰의 시간을 늘리는 하나의 주요 원인이었기에, 다른 팀원들에게 pre-push훅에 린트 체크를 넣는 것을 제안했었다.
다른 팀원들의 동의를 구하고 기존에 존재하던 lint-fix:global
스크립트를 활용해, 아래와 같이 pre-push 훅을 작성했다.
echo "🔍 Running lint fix..."
pnpm run lint-fix:global
# 변경 사항이 있는지 확인
if ! git diff --quiet; then
echo "❌ Linting fixed some files. Please commit the changes before pushing."
exit 1
fi
그러나 다음날이 되자 아래와 같이 피드백을 받게 되었다. 어떤분들은 위의 코드에서 바로 문제를 발견하시리라 생각된다.

lint-fix:global
실행 여부와 관련없이 일부 파일을 staged 상태로 둔 채 푸시하고자 하면, 깃 푸시가 실패되는 것이었다. 🤦
결국 lint fix보단 단순히 lint error check를 하는 것이 맞다는 생각을 하였고, 아래와 같이 코드를 수정하였다.
echo "🔍 Running lint..."
if ! pnpm run lint -- --quiet; then
echo "❌ Lint 에러가 감지되었습니다."
echo "👉 에러를 자동으로 수정하려면: pnpm run lint-fix:global"
exit 1
fi
위의 코드에서 lint
스크립트는 실제로 next lint
를 실행하는 스크립트이다.
여기에 --quiet
옵션을 주어서 에러만 출력하도록 하고, 에러가 발생하면 에러메세지를 출력하고 푸시를 막도록 하였다.
그리고 기왕 하는 김에 다른 팀원들을 위해서 에러메세지 출력도 좀 더 친절하게 변경하였다.
이제 앞으로는 CI에서 린트 에러로 인해 시간을 허비하는 일이 없게 되길 기대해본다. 🙏