정보

JIRA 이슈번호 자동으로 커밋메시지에 넣기

개발자성장기 2024. 5. 15. 18:49
반응형

 

지라를 처음 쓰는데 commit 할 때마다 JIRA 이슈번호 넣는 건 고역이었습니다.

 

 

계속되는 반복작업 이걸 프로젝트 기간 내내 실수 없이 지속하기에는 불가능에 가까워 보였습니다.  

 

이때 사용할 수 있는게 바로 Git Hook 입니다.

 

 

📌 Git Hooks란 ?

Git Hooks는 특정 Git 이벤트가 발생할 때 자동으로 실행되는 스크립트입니다. 예를 들어, 커밋을 할 때마다 코드 스타일을 검사하거나, 코드가 푸시될 때 자동으로 테스트를 실행하는 등 다양한 작업을 자동화할 수 있습니다. 이 스크립트는 GIt 저장소 내의 .git/hooks 디렉토리에 저장됩니다.

 

 

📌 Git Hooks의 종류

Git hooks는 크게 클라이언트 사이드와 서버 사이드로 나뉩니다.

 

1️⃣ 클라이언트 사이드 Hooks

클라이언트 사이드 hooks는 사용자의 로컬 저장소에서 실행됩니다. 이 hooks는 주로 커밋, 병합 등의 이벤트에서 동작합니다.

  1. pre-commit: 커밋이 만들어지기 전에 실행됩니다. 여기서 코드 스타일 검사나 테스트 실행을 통해 품질을 보장할 수 있습니다.
  2. prepare-commit-msg: 커밋 메시지가 만들어지기 전에 실행됩니다. 기본 커밋 메시지를 수정하는 데 사용할 수 있습니다.
  3. commit-msg: 커밋 메시지가 입력된 후, 커밋이 완료되기 전에 실행됩니다. 커밋 메시지 형식을 검사하는 데 유용합니다.
  4. post-commit: 커밋이 완료된 후에 실행됩니다. 커밋 후에 실행하고 싶은 작업(예: 알림 전송)을 수행할 수 있습니다.
  5. pre-rebase: 리베이스가 시작되기 전에 실행됩니다. 리베이스를 중지시키는 작업을 할 수 있습니다.
  6. post-rewrite: 커밋이 리베이스 또는 앰엔드된 후에 실행됩니다.

 

2️⃣ 서버 사이드 Hooks

서버 사이드 hooks는 원격 저장소에서 실행되며, 주로 push와 관련된 이벤트에서 동작합니다.

  1. pre-receive: 원격 저장소에 push가 들어오기 전에 실행됩니다. 이 단계에서 push를 검증하고 거부할 수 있습니다.
  2. update: 특정 브랜치에 대한 push가 들어오기 전에 실행됩니다. pre-receive와 유사하지만, 브랜치 별로 다르게 동작할 수 있습니다.
  3. post-receive: 원격 저장소에 push가 완료된 후에 실행됩니다. push 이후에 자동 배포 등의 작업을 수행할 수 있습니다.

 

📌 JARA 이슈번호 자동으로 넣기

 

여기서 우리가 사용해 볼 것은  `prepare-commit-msg`입니다.

우리의 목적은 commit을 할 때 JIRA 이슈번호를 직접 작성하지 않고 자동으로 작성되게 하는 것입니다.

방법은 아래와 같습니다.

(이 방법은 브랜치명에 JIRA 이슈키가 포함되어있어야 합니다.)

 

1️⃣ 폴더명 변경

 처음에는 .git/hooks 폴더 안에 보시면  `prepare-commit-msg.sample` 파일이 존재합니다.  이 파일명을 `prepare-commit-msg`로 변경해 줍니다.

mv prepare-commit-msg.sample prepare-commit-msg

 

2️⃣ 파일 내용 변경

파일 내용을 아래와 같이 변경해 줍니다. 

(세 번째 순서에서 ATR 만 여러분의 JIRA 이슈키로 변경해 주세요)

# 1. 설정되지 않은 경우 건너뛸 분기를 정의합니다.
if [ -z "$BRANCHES_TO_SKIP" ]; then
  BRANCHES_TO_SKIP=(main develop release hotfix)
fi

# 2. 현재 브랜치 이름을 가져옵니다.
BRANCH_NAME=$(git symbolic-ref --short HEAD)
BRANCH_NAME="${BRANCH_NAME##*/}"

# 3. 브랜치 이름에서 JIRA 이슈키를 추출합니다.
JIRA_ID=$(echo $BRANCH_NAME | egrep -o 'ATR-[0-9]+')

# 4. 현재 브랜치가 건너뛸 목록에 있는지 확인합니다.
BRANCH_EXCLUDED=$(printf "%s\n" "${BRANCHES_TO_SKIP[@]}" | grep -c "^$BRANCH_NAME$")

# 5. 커밋 메시지에 이미 JIRA 이슈키가 포함되어 있는지 확인합니다.
BRANCH_IN_COMMIT=$(grep -c "$JIRA_ID" $1)

# 6. 커밋 메시지에 이슈키가 포함되어 있지 않다면 이슈키를 추가합니다.
if [ -n "$JIRA_ID" ] && ! [[ $BRANCH_EXCLUDED -eq 1 ]] && ! [[ $BRANCH_IN_COMMIT -ge 1 ]]; then
  sed -i.bak -e "1s/^/[$JIRA_ID] /" $1
fi

 

 

3️⃣ 권한 설정

chmod +x prepare-commit-msg

 

(방금 ./git/hooks 디렉토리 안에서 해주세요)

 

 

이렇게 설정을 다 하고 commit을 하시면 자동으로 JIRA 이슈키가 commit 메시지에 추가됩니다.  

 

 

 

📢  참고 사항

1. 이슈키를 뒤쪽에 배치하고 싶으면  맨 아래줄 코드만 아래처럼 변경해 주세요

sed -i.bak -e "1s/\$/ [$JIRA_ID]/" "$1"

 

2.  git commit 템플릿을 사용하고 있으시다면  아래 코드를 추가해주세요.

# 5. 커밋 메시지 파일에서 주석 라인을 제거합니다.
sed -i.bak '/^#/d' $1

 

3. 그외 더 커스텀하시고 싶으신 분들은 더 공부하셔서 활용해보세요.

 

📚 Reference

https://gist.github.com/bartoszmajsak/1396344

https://git-scm.com/book/ko/v2/Git%EB%A7%9E%EC%B6%A4-Git-Hooks

https://medium.com/prnd/github-커밋-메세지에-jira-이슈번호-자동으로-넣어주기-779048784037

반응형