Git pre-push 훅에서 린트 체크 후 푸시 실패 조건 변경하기

2025년 3월 11일 화요일

작업의 맥락

우리 팀의 프로젝트에서는 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에서 린트 에러로 인해 시간을 허비하는 일이 없게 되길 기대해본다. 🙏