git

Git 팀 작업을 자동화하는 방법 [ Hooks와 커스텀 스크립트 ]

임베디드 친구 2024. 12. 14. 10:54
728x90
반응형

Git 팀 작업을 자동화하는 방법 (Hooks와 커스텀 스크립트)

Git은 소스 코드 버전 관리의 표준 도구로 자리 잡았으며, Git의 많은 기능 중 Git Hooks는 매우 유용한 도구입니다. Git Hooks는 특정 Git 이벤트에 자동으로 실행되는 스크립트를 의미하며, 팀 작업의 효율성을 높이고 일관성을 유지하는 데 큰 도움을 줍니다. 이 글에서는 Git Hooks의 개요와 사용법, 커밋 메시지 규칙 자동화, 팀 작업 흐름에 Git Hooks를 적용하는 방법에 대해 알아보겠습니다.

1. Git Hooks 개요 및 사용법

Git Hooks란?

Git Hooks는 Git에서 제공하는 자동화 기능으로, 다양한 Git 작업(예: 커밋, 푸시, 머지 등)이 수행될 때 특정 스크립트를 실행할 수 있는 기능입니다. 이러한 스크립트를 통해 코드 품질을 유지하거나 개발자들이 일관된 규칙을 따르도록 강제할 수 있습니다. Hooks는 크게 로컬 훅과 서버 훅으로 나눌 수 있습니다.

  • 클라이언트 훅(Client-side Hooks): 로컬 저장소에서 커밋, 머지 등 개발자의 작업에 반응하여 실행됩니다.
  • 서버 훅(Server-side Hooks): 서버 저장소에서 푸시, 머지 등이 발생할 때 실행됩니다.

Git Hooks의 종류

Git은 다양한 이벤트에 대응하는 여러 종류의 Hooks를 제공합니다. 주요 Hooks는 다음과 같습니다.

  • pre-commit: 커밋이 생성되기 전에 실행됩니다. 코드 스타일 검사, 테스트 수행 등에 활용됩니다.
  • commit-msg: 커밋 메시지가 작성된 후, 커밋이 완료되기 전에 실행됩니다. 메시지 형식 검사 등에 사용됩니다.
  • pre-push: 푸시하기 전에 실행됩니다. 테스트 결과 확인, 코드 리뷰 등 푸시 전 검사를 위해 사용됩니다.

Git Hooks 설정하기

Git Hooks를 설정하려면 .git/hooks 디렉토리에서 원하는 훅 파일을 작성하거나 수정하면 됩니다. 기본적으로 Git은 .sample 확장자가 붙은 템플릿 파일을 제공하며, 이 파일을 수정하여 사용할 수 있습니다. 다음은 간단한 예제입니다.

#!/bin/sh
# pre-commit 훅 예제

# 코드 스타일 검사 예시
npm run lint

if [ $? -ne 0 ]; then
  echo "Lint 오류가 발생했습니다. 커밋을 중단합니다."
  exit 1
fi

위 스크립트는 pre-commit 훅에서 코드 스타일 검사 도구인 lint를 실행하며, 오류가 발생하면 커밋을 중단합니다.

2. 커밋 메시지 규칙 적용 자동화

팀 작업을 할 때 커밋 메시지의 일관성을 유지하는 것은 매우 중요합니다. 잘 구성된 커밋 메시지는 변경 이력을 이해하기 쉽게 만들며, 코드 리뷰나 문제 해결 과정에서도 큰 도움이 됩니다. Git Hooks를 활용하여 커밋 메시지 규칙을 자동으로 적용하는 방법을 알아보겠습니다.

commit-msg 훅을 이용한 메시지 규칙 검사

commit-msg 훅을 사용하면 커밋 메시지가 규칙에 맞는지 자동으로 검사할 수 있습니다. 예를 들어, 모든 커밋 메시지가 특정 형식을 따르도록 강제할 수 있습니다. 다음은 commit-msg 훅을 이용하여 커밋 메시지의 형식을 검사하는 스크립트 예제입니다.

#!/bin/sh

# 커밋 메시지 규칙: 제목은 50자 이하, 대문자로 시작, 마지막에 마침표 금지
commit_message=$(cat "$1")

if ! echo "$commit_message" | grep -Eq '^[A-Z].{0,49}[^\.]$'; then
  echo "커밋 메시지는 대문자로 시작하고 50자 이하여야 하며, 마지막에 마침표가 없어야 합니다."
  exit 1
fi

위 스크립트는 커밋 메시지가 대문자로 시작하고, 50자 이내여야 하며, 마지막에 마침표가 없는지 확인합니다. 규칙에 맞지 않으면 커밋을 중단하고 오류 메시지를 출력합니다.

커밋 메시지 예시

  • 올바른 예시: "Add new feature to handle user input"
  • 잘못된 예시: "added new feature.", "this is a very long commit message that exceeds the character limit..."

3. 팀 작업 흐름에 Git Hooks 적용하기

Git Hooks는 팀 전체의 작업 흐름에 적용하여 일관된 코드 품질을 유지하고, 공통 규칙을 강제하는 데 매우 유용합니다. 이 섹션에서는 팀 작업 흐름에 Git Hooks를 적용하는 몇 가지 방법을 살펴보겠습니다.

3.1 로컬 훅 공유하기

Git Hooks는 기본적으로 로컬 저장소에만 존재하므로, 팀원들과 공유하기 위해서는 별도의 설정이 필요합니다. 일반적으로는 다음과 같은 방법으로 공유합니다.

  1. Hooks 스크립트를 저장소에 포함: Git Hooks 스크립트를 프로젝트의 특정 디렉토리(예: .githooks/)에 저장합니다.
  2. 설치 스크립트 제공: 프로젝트를 클론한 후 팀원들이 로컬 훅을 설정할 수 있도록 설치 스크립트를 제공합니다.

예를 들어, 다음과 같이 설치 스크립트를 작성할 수 있습니다.

#!/bin/sh
# Git Hooks 설치 스크립트

HOOKS_DIR=$(pwd)/.githooks
git config core.hooksPath $HOOKS_DIR

위 스크립트를 실행하면, Git은 .githooks 디렉토리에 있는 훅을 로드하여 사용하게 됩니다.

3.2 CI/CD 파이프라인에서 Git Hooks 활용하기

Git Hooks는 로컬 환경에서뿐만 아니라 CI/CD 파이프라인에서도 유용하게 사용될 수 있습니다. 예를 들어, pre-push 훅을 활용하여 코드가 리모트 저장소에 푸시되기 전에 테스트가 통과했는지 확인할 수 있습니다.

이렇게 하면, 개발자들이 테스트를 무시하고 코드를 푸시하는 일을 방지할 수 있으며, 문제 있는 코드가 메인 브랜치에 병합되는 것을 막을 수 있습니다.

3.3 팀을 위한 커스텀 훅 작성하기

팀의 요구에 맞는 커스텀 훅을 작성하여 사용하면 팀원들이 일관된 방식으로 작업을 진행하도록 도울 수 있습니다. 예를 들어, 코드 리뷰를 요청하기 전에 특정 브랜치로의 푸시를 막거나, 모든 커밋에 이슈 번호를 포함하도록 요구할 수 있습니다.

다음은 특정 브랜치(main)로의 푸시를 막는 pre-push 훅의 예시입니다.

#!/bin/sh

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

if [ "$branch_name" = "main" ]; then
  echo "직접 main 브랜치에 푸시할 수 없습니다. PR을 생성해주세요."
  exit 1
fi

위 스크립트는 현재 브랜치가 main일 경우 푸시를 막고, Pull Request(PR)를 생성하도록 안내합니다. 이를 통해 팀의 작업 흐름을 강제하고, 실수를 방지할 수 있습니다.

4. 결론

Git Hooks는 개발자들이 실수를 줄이고, 팀의 코드 품질을 유지하는 데 매우 유용한 도구입니다. 이 글에서는 Git Hooks의 개요와 사용법, 커밋 메시지 규칙 자동화, 그리고 팀 작업 흐름에 Git Hooks를 적용하는 방법에 대해 살펴보았습니다. Git Hooks를 통해 개발 프로세스를 자동화하고, 일관된 규칙을 적용함으로써 효율적이고 신뢰할 수 있는 팀 작업 환경을 구축해 보세요.

Git Hooks를 처음 사용하는 경우 간단한 스크립트부터 시작하여 점차 팀의 요구에 맞는 커스텀 훅을 작성해 나가는 것을 추천합니다. 이를 통해 Git을 더 강력한 도구로 활용하고, 개발 워크플로우를 더욱 효율적으로 만들 수 있을 것입니다.

728x90
반응형