GitHub 커밋 메세지에 JIRA 이슈번호 자동 연동

커밋 시 항상 앞에 이슈번호를 넣어주어야 하는 번거로움을 자동으로 넣어주도록 처리하는 방법

.git/hooks 디렉토리에 prepare-commit-msg 파일을 생성하면 사용자가 커밋 메시지를 입력하기 전 단계에서 내용을 변경할 수 있다.

prepare-commit-msg 파일 수정

  • 위치: .git > hooks > prepare-commit-msg.sample

기본으로 확장자가 .sample 로 처리되어 있으며 사용하고 싶은 파일에 스크립트를 작성한뒤에 뒤의 확장자 제거

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

if [ -z "$BRANCHES_TO_SKIP" ]; then
BRANCHES_TO_SKIP=(master develop qa release hotfix)
fi

BRANCH_NAME=$(git symbolic-ref --short HEAD)
BRANCH_PREFIX="${BRANCH_NAME%%/*}"
BRANCH_JIRA="${BRANCH_NAME##*/}"
BRANCH_PREFIX_PATTERN="^(issue|feature)$"

if [[ "$BRANCH_PREFIX" =~ $BRANCH_PREFIX_PATTERN ]]; then
JIRA_KEY="${BRANCH_JIRA%%-*}"
JIRA_ID=$(echo $BRANCH_JIRA | egrep -o "${JIRA_KEY}-[0-9]+")
BRANCH_EXCLUDED=$(printf "%s\n" "${BRANCHES_TO_SKIP[@]}" | grep -c "^$BRANCH_JIRA")
BRANCH_IN_COMMIT=$(grep -c "$JIRA_ID" $1)

if [ -n "$JIRA_ID" ] && ! [[ $BRANCH_EXCLUDED -eq 1 ]] && ! [[ $BRANCH_IN_COMMIT -ge 1 ]]; then
sed -i.bak -e "s/^\(.*\)$/* #$JIRA_ID - \1/" $1
fi
fi

플로우

  1. 브랜치 네이밍이 issue/{이슈티켓}, feature/{이슈티켓} 으로 시작하는 특정 브랜치인 경우에만 적용
    a. master, develop, qa, release, hotfix 인 브랜치 경우에는 적용 안되게 스킵
  2. 브랜치 이름으로부터 Jira 이슈 번호 가져오기
    a. 예를 들어 feature/ESFH-1234-xxxx-yyyy 인경우 ESFH-1234 추출
  3. 커밋 메세지에 이미 Jira 이슈번호를 기재했다면 적용 안되게 스킵
  4. 위의 경우를 다 검증한뒤, 커밋메세지 앞에 Jira 이슈번호를 추가

[테스트]

  1. 지라이슈 브랜치 생성
    • feature/ESFH-1
  2. 커밋 명령어 실행:
    1
    $ git commit -m “Core 초기 개발”
  3. 메시지 커밋 결과
    1
    * #ESFH-1 - Core 초기 개발

Hook 레파지토리 연동 (공통화)

기존 저장소에 한 번에 적용할 수 있는 스크립트를 만들어 커스텀 hook 을 공통으로 적용하고 싶은 프로젝트에 아래 터미널 명령어를 사용 (프로젝트 root 에서 커맨드 입력)

Linux

1
2
$ curl -L -H "Authorization: token <TOKEN>" https://api.github.com/repos/<저장소 URL>/tarball/master | tar -xzv --strip-components=1 \
&& bash setup.sh

Windows

1
2
3
4
5
Invoke-WebRequest -Uri 'https://api.github.com/repos/<저장소 URL>/zipball/master' -Headers @{Authorization='token <TOKEN>'} -OutFile 'master.zip';`
Expand-Archive 'master.zip' -DestinationPath 'extended' -Force;`
Get-ChildItem -Path '.\extended\*\*' | Move-Item -Destination '.';`
Remove-Item 'master.zip', '.\extended' -Recurse;`
.\setup.ps1

참조

공유하기