article thumbnail image
Published 2025. 2. 5. 22:17
728x90

Git Hooks 도입 배경

팀 내에서 git 브랜치를 생성할 때 개발 배포용 브랜치를 부모로 잘못 생성하여 문제가 되는 상황이 발생하였다.

다시 같은 상황이 발생하지 않도록 merge를 위한 개발 배포용 브랜치를 제외하고는 생성할 수 없도록 패턴을 지정하기로 했다.

해당 패턴을 간단하게 체크하고 자동화할 수 있도록 Git hooks 기능을 사용했다.


Git Hooks 란?

Git Hooks는 특정 Git 이벤트가 발생할 때 자동으로 실행되는 스크립트

이를 활용하면 커밋, 푸시, 머지 등의 과정에서 특정 작업을 자동화가 가능하다.

예를 들어, 커밋 전에 코드 스타일을 검사하거나 푸시 전에 테스트를 실행할 수도 있다.


Git Hooks의 종류

Git Hooks는 실행 시점에 따라 클라이언트 훅(Client-side Hooks), 서버 훅(Server-side Hooks) 으로 나뉜다.

1. 클라이언트 훅(Client-side Hooks)

개발자의 로컬 환경에서 실행되는 훅임. 주로 코드 품질 유지, 자동화 작업 등에 사용됨.

  • pre-commit: git commit 실행 전에 호출
    • 코드 스타일 검사, 린트(lint), 포맷팅 자동화 등에 활용
  • prepare-commit-msg: 커밋 메시지가 생성되기 전에 실행
    • 자동으로 메시지를 추가하거나 수정할 때 사용
  • commit-msg: 커밋 메시지를 입력한 후 실행
    • 메시지 규칙을 검증할 때 활용
  • pre-push: git push 실행 전에 호출
    • CI/CD 테스트 실행이나 코드 검증 등에 사용

2. 서버 훅(Server-side Hooks)

Git 원격 저장소에서 실행되는 훅으로, 주로 푸시 검증, 배포 자동화 등에 사용

  • pre-receive: 서버에서 푸시를 받기 전에 실행
    • 특정 브랜치로의 푸시를 막거나, 커밋 메시지 검증 등에 활용
  • update: 브랜치 업데이트 전에 실행
    • 특정 브랜치에 대한 정책 적용 가능
  • post-receive: 푸시가 완료된 후 실행
    • 자동 배포, 알림 전송 등의 작업 수행 가능

Git Hooks 설정

회사의 형상관리 환경은 Bitbucket으로 구성되어 있다.

Bitbucket Cloud에서는 서버 훅을 직접 지원하지 않기 때문에 파이프라인을 사용해서 설정해야 하는데

팀원도 4명뿐이고 간단한 패턴만 적용하는 게 목적이라 배보다 배꼽이 큰 느낌에 클라이언트 훅으로 진행하기로 결정.

 

설정 방법은 생각보다 간단하다.

적용하고자 하는 프로젝트의 .git/hooks 경로 하위에 파일을 수정하면 된다.

간혹 폴더 자체가 없는 경우가 있는데 그냥 생성해 주면 된다.

이벤트를 적용하고 싶은 시점의 파일에 내용을 변경하고 실행권한을 주면 끝.

팀 내에서 다 같이 사용할 수 있도록 스크립트 파일로 만들었다.

 

#!/bin/bash

# Git Hook 디렉토리 확인
HOOKS_DIR=".git/hooks"

if [[ ! -d $HOOKS_DIR ]]; then
  echo "Error: This script must be run from the root of a Git repository."
  exit 1
fi

# pre-push 파일 생성
cat <<'EOF' > $HOOKS_DIR/pre-push
#!/bin/bash

current_branch=$(git rev-parse --abbrev-ref HEAD)

# develop 브랜치와 현재 브랜치의 공통 조상 확인
base_branch=$(git merge-base develop $current_branch)

if [[ -n $base_branch ]]; then
  # 공통 조상이 develop 브랜치의 현재 커밋과 동일한지 확인
  if [[ $(git rev-parse develop) == $base_branch ]]; then
    # "feature/DT-숫자-dev" 패턴과 일치하는지 확인
    if [[ ! $current_branch =~ ^feature/DT-[0-9]+-dev$ ]]; then
      echo "develop 브랜치에서 생성된 경우 feature/DT-숫자-dev 패턴의 브랜치만 push가 가능합니다."
      exit 1
    fi
  fi
fi
EOF

# pre-push 실행 권한 부여
chmod +x $HOOKS_DIR/pre-push

echo "pre-push hook 설정이 완료되었습니다."
728x90
복사했습니다!