들어가며
사이드 프로젝트를 진행하면서, 효율적인 일정 관리의 필요성을 느끼면서 JIRA를 적극적으로 도입했습니다. JIRA를 처음 써보면서, JIRA를 어떻게 하면 효율적으로 사용할 수 있을까 알아보던 중, 회사에서는 JIRA의 이슈 번호를 PR과 Commit에 적극적으로 활용한다는 것을 알 수 있었습니다. 저희 팀에서도 적극적으로 활용해보고자, JIRA를 제대로 활용하는 방법에 대해 글을 작성하고자 합니다. JIRA를 사용하면서 편하게 사용하는 첫 번째는 바로 JIRA의 이슈 번호를 커밋 메시지에 git hooks을 이용해서 추가하는 것입니다. 지금부터 JIRA 이슈 번호를 어떻게 Commit 메시지에 추가하는지 살펴보겠습니다.
귀찮은 Jira 이슈 번호 작성
현재 사용하고 있는 커밋 메시지는 제가 예전에 작성했던 글의 형태로 커밋 메시지를 작성하고 있습니다. 이제는 JIRA를 도입했으므로, 커밋 메시지 또한 JIRA의 이슈 번호에 트래킹 될 수 있도록 설정할 필요성을 느꼈습니다. 하지만 커밋을 할 때마다 커밋 메시지 앞에 Jira의 이슈 번호를 작성하는 것은 상당한 에너지 낭비였습니다. 협업을 하는 과정에서, 잊어버리고 이슈 번호를 작성하지 않는 일도 생기고, 다른 이슈 번호를 작성하는 경우도 생겼습니다. 커밋하는 과정에서 커밋 메시지에 Jira의 이슈 번호가 자동으로 작성된다면, 위와 같은 불편함을 해결할 수 있을 것이라 생각했습니다.
Git Hook을 이용하자
위에서 말한 불편함을 Git Hook을 이용한다면, 문제를 해결할 수 있었습니다. git hook은 특정 상황에 특정 스크립트를 실행할 수 있도록 제공합니다. 터미널에서 아무 repository에 접근해서 cd .git/hooks/를 하면 아래와 같이 나올 것입니다.
위의 목록에서 .sample 확장자로 되어 있는 파일이 11개 있는데, 이게 모두 Git에서 지원하는 Hook입니다. 여기서 .sample 확장자를 제거하면 바로 적용됩니다. 여기서 pre commit, post commit, pre push 등 다양한 Hook이 있는데, 이들은 어떤 역할을 할까요?
- pre-commit: 커밋하기 전에 실행(주로 Lint 돌리거나 검증 작업할 때 사용)
- post-commit: 커밋한 뒤에 실행
- pre-push: 커밋을 remote로 push 하기 전에 실행
간단하게 살펴보면 위와 같습니다. Jira 이슈 번호를 커밋 메시지에 작성하기 위해서는 prepare-commit-msg를 사용하겠습니다. prepare-commit-msg은 pre-commit과 비슷하지만 커밋 메시지를 만들고 나서 실행됩니다.
그럼 다시 돌아가서, 터미널의 경로가 hooks으로 되어있을 텐데, 여기서 저는 prepare-commit-msg를 생성해서, 아래와 같이 작성했습니다.
#!/usr/bin/env bash
if [ -z "$BRANCHES_TO_SKIP" ]; then
BRANCHES_TO_SKIP=(master develop release hotfix)
fi
PROJECT_ID=ASA
BRANCH_NAME=$(git symbolic-ref --short HEAD)
BRANCH_NAME="${BRANCH_NAME##*/}"
JIRA_ID=`echo $BRANCH_NAME | egrep -o "$PROJECT_ID-[0-9]+"`
BRANCH_EXCLUDED=$(printf "%s\n" "${BRANCHES_TO_SKIP[@]}" | grep -c "^$BRANCH_NAME$")
COMMIT_MSG_HEAD=$(head $1 -n 1)
BRANCH_IN_COMMIT=$(grep -c $COMMIT_MSG_HEAD)
if [ -n $JIRA_ID ] && ! [[ $BRANCH_EXCLUDED -eq 1 ]] && ! [[ $BRANCH_IN_COMMIT -ge 1 ]]; then
sed -i.bak -e "1s/^/$JIRA_ID /" $1
fi
위 스크립트는 이곳에서 작성됐는데, 위의 스크립트는 아래와 같은 흐름으로 동작하도록 설계됐습니다.
- feature 브랜치에서 작업할 때만 이 작업이 되어야 한다
: 현재 브랜치가 master, develop, release, hotfix인 경우 SKIP 한다. - 브랜치 이름으로부터 Jira이슈 번호 가져온다.
: feature/POG-1000-xxxx-yyyy 인경우 POG-1000만 가져온다. - 커밋 메시지에 이미 Jira이슈 번호가 적혀있다면 SKIP 한다.
- 위의 경우를 다 검증한 뒤, 커밋 메시지 앞에 Jira 이슈 번호를 추가한다.
여기서 위 스크립트를 우리 프로젝트에 적용하기 위해서는 9번째 줄의 "$PROJECT_ID" 부분을 본인의 Jira 프로젝트 이름으로 변경하면 됩니다. 그리고 저 같은 경우 sample은 놔두고, 새롭게 파일을 생성해서 스크립트를 넣었기 때문에, 파일의 권한 설정을 해야 했습니다.
chmod ug+x .git/hooks/*
권한 설정을 위해 다음의 코드를 입력했고, 테스트 용으로 feature/POG-21-test라는 branch를 만들어서, 깃허브 레포지토리에 커밋을 푸시했을 때, 아래와 같이 출력되는 모습을 볼 수 있었습니다.
마치며
협업을 위해 JIRA를 활용하면서, 팀의 발전을 위해서 도움이 될 수 있는 것들을 모두 적용해보고 싶다고 생각했습니다. 조금이라도 효율이 생길 수 있다면, 열심히 배워서, 팀원들에게 나눌 수 있는 팀원이 되고 싶습니다. 아직 Jira를 완벽하게 알지 못하더라도, 조금씩 만지다 보면 익숙해질 것이라 생각합니다. 다음에는 Jira를 깃허브에 연동하는 글을 작성해 보도록 하겠습니다.
출처
'Project > 개발 협업' 카테고리의 다른 글
[협업] 협업을 위한 파이어베이스 셋팅 및 호스팅 설정하기 (feat node.js) (1) | 2021.08.16 |
---|---|
[협업] 협업을 위한 푸시알림 설정하기 (feat node.js) (0) | 2021.07.31 |
[협업] 협업을 위한 swagger 설정하기 (feat node.js) (0) | 2021.04.18 |
[협업] 협업을 위한 VScode 설정하기 (0) | 2021.02.21 |
[협업] 협업을 위한 Git 명령어 가이드 (1) | 2020.12.20 |