지라를 처음 쓰는데 commit 할 때마다 JIRA 이슈번호 넣는 건 고역이었습니다.
계속되는 반복작업 이걸 프로젝트 기간 내내 실수 없이 지속하기에는 불가능에 가까워 보였습니다.
이때 사용할 수 있는게 바로 Git Hook 입니다.
📌 Git Hooks란 ?
Git Hooks는 특정 Git 이벤트가 발생할 때 자동으로 실행되는 스크립트입니다. 예를 들어, 커밋을 할 때마다 코드 스타일을 검사하거나, 코드가 푸시될 때 자동으로 테스트를 실행하는 등 다양한 작업을 자동화할 수 있습니다. 이 스크립트는 GIt 저장소 내의 .git/hooks 디렉토리에 저장됩니다.
📌 Git Hooks의 종류
Git hooks는 크게 클라이언트 사이드와 서버 사이드로 나뉩니다.
1️⃣ 클라이언트 사이드 Hooks
클라이언트 사이드 hooks는 사용자의 로컬 저장소에서 실행됩니다. 이 hooks는 주로 커밋, 병합 등의 이벤트에서 동작합니다.
- pre-commit: 커밋이 만들어지기 전에 실행됩니다. 여기서 코드 스타일 검사나 테스트 실행을 통해 품질을 보장할 수 있습니다.
- prepare-commit-msg: 커밋 메시지가 만들어지기 전에 실행됩니다. 기본 커밋 메시지를 수정하는 데 사용할 수 있습니다.
- commit-msg: 커밋 메시지가 입력된 후, 커밋이 완료되기 전에 실행됩니다. 커밋 메시지 형식을 검사하는 데 유용합니다.
- post-commit: 커밋이 완료된 후에 실행됩니다. 커밋 후에 실행하고 싶은 작업(예: 알림 전송)을 수행할 수 있습니다.
- pre-rebase: 리베이스가 시작되기 전에 실행됩니다. 리베이스를 중지시키는 작업을 할 수 있습니다.
- post-rewrite: 커밋이 리베이스 또는 앰엔드된 후에 실행됩니다.
2️⃣ 서버 사이드 Hooks
서버 사이드 hooks는 원격 저장소에서 실행되며, 주로 push와 관련된 이벤트에서 동작합니다.
- pre-receive: 원격 저장소에 push가 들어오기 전에 실행됩니다. 이 단계에서 push를 검증하고 거부할 수 있습니다.
- update: 특정 브랜치에 대한 push가 들어오기 전에 실행됩니다. pre-receive와 유사하지만, 브랜치 별로 다르게 동작할 수 있습니다.
- 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
'정보' 카테고리의 다른 글
CI CD 세팅 (1) | 2024.06.02 |
---|---|
[Query dsl]hibernate.query.SemanticException : Could not interpret path expression (0) | 2024.05.21 |
[에러 해결] cannot resolve class or package 'cj' (0) | 2024.05.03 |
[Effective java] 🚀 item 13. clone 재정의는 주의해서 진행해라 (0) | 2024.04.17 |
[Effective java] 🚀 item 12. 항상 toString을 재정의하라 Always override toString (0) | 2024.03.31 |