[pre-commit] pre-commit 기능 및 사용법 정리

ℹ Info! pre-commit에 대한 더 자세한 내용은 공식 문서에 정리되어 있다.

pre-commit 이란

대표적인 버전 컨트롤 시스템인 Git을 사용하다보면 훅(hook)이 필요할 때가 있다. Git 훅은 Git에서 발생하는 특정 이벤트(commit, push 등)에 사용자 지정 스크립트를 실행할 수 있게 하는 기능이다. 주로 특정 작업 또는 검사를 자동화하여, 코드의 일관성을 유지하거나 품질을 향상시키기 위해 사용한다.

그러나 직접 훅을 위한 스크립트를 작성하거나 이를 지속적으로 관리 및 업데이트하는 것은 쉽지 않은 일이고, 특히 같은 프로젝트에 참여하는 사람의 수가 많을수록 동일한 훅을 사용하도록 유도하는 것에 어려움이 따른다. pre-commit은 이러한 문제를 해결하기 위한 도구로, 훅을 조금 더 쉽게 관리 및 실행할 수 있도록 도와주는 도구이다.

🗒 Note! 이름과 달리 pre-commit은 pre-commit 훅 뿐만 아니라 모든 스테이지의 훅을 관리하는데 사용할 수 있다.

일반적으로 pre-commit 혹은 정적 코드 분석을 통한 버그 발견, 포맷(스타일) 위반, 테스트 실패 등을 검사하기 위해 사용한다.

pre-commit 설치 및 사용법

pre-commit은 아래의 명령어로 설치할 수 있다.

pip install pre-commit

pre-commit을 실행하는 방법은 크게 2가지가 있다. 하나는 자동으로 실행하는 방법이고, 다른 하나는 수동으로 실행하는 방법이다.

  1. 자동 실행
    아래 명령어를 이용하면 특정 이벤트가 발생했을 때 훅이 자동으로 실행되도록 한다.
     pre-commit install
    

    이 명령어는 .git/hooks 폴더에 훅 스크립트를 설치하는 일을 수행한다.

  2. 수동 실행
    아래 명령어를 이용하면 전체 코드에 대해서 훅을 한 번 실행한다.
     pre-commit run -a
    

    여기서 한 가지 중요한 점은 이 명령어는 코드 전체에 대해서 실행한다는 것이다. 자동 실행의 경우, commit 하고자 하는 코드(즉, 수정된 부분)에 대해서만 훅을 실행하기 때문에 수동 실행하는 것과 차이가 있다.

🗒 Note! 따라서, 처음 pre-commit을 설정할 때는 수동 명령어를 통하여 코드 전체에 대해서 훅을 실행할 필요가 있다.

설정 파일 생성

pre-commit은 설정 파일에 리스트된 훅들을 실행하기 때문에 실행하고자 하는 훅을 설정 파일에 정리해두는 작업이 필요하다. 프로젝트 루트 디렉터리에 .pre-commit-config.yaml 파일을 생성하고 사용하려는 훅들을 정의할 수 있다.

아래는 일반적으로 사용되는 2가지 훅을 정의한 설정 파일의 예시이다. 흔히 사용되는 훅은 pre-commit-hooks에 정의되어 있다.

repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.5.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer

서버/로컬 훅을 정의하는 법

훅은 서버에서 실행되도록 할 수도 있고, 로컬에서 실행되도록 할 수도 있다. 그렇다면 어떤 스크립트를 어디에서 실행되도록 해야 할까?

서버 훅

서버에서 실행되는 훅은 서버로 들어오는 모든 커밋에 대해서 실행할 수 있기 때문에, 훅을 강제할 수 있다는 장점이 있다. 특정 테스트를 통과하지 못하는 커밋을 거부하는 방법 등으로 품질 기준에 부합하지 않는 코드가 서버에 들어오지 못하도록 막을 수 있다. 다만, 서버에서 많은 양의 스크립트가 실행된다면 서버 운용에 필요한 비용이 증가될 수 있다.

로컬 훅

로컬 환경에서 실행되는 훅은 버전 컨트롤 되지 않기 때문에 서버 훅과는 달리 강제할 수 없다. pre-commit 도구는 설정파일을 버전 컨트롤 범위에 넣을 수 있어, 조금 더 구성원 간의 통일성을 가질 수 있지만, 여전히 훅을 실행할지 말지는 사용자의 선택이다.

일반적으로는 아래의 규칙에 따라 정의한다.

  • 권장사항에 해당하는 훅은 로컬에서, 강제하고자 하는 내용은 서버에서 실행되도록 한다.
  • 시간이 적게 걸리는 것은 로컬에 시간이 오래 걸리는 테스트들은 서버에서 실행되도록 한다.

댓글남기기