🐢 복붙의 늪에 빠지다…
이전 프로젝트에서 효율적인 프로젝트 관리를 위해 Jira를 도입했다. 원래는 PM/디자이너는 노션에 할 일을 적어두고 개발자는 GitHub 이슈와 프로젝트를 통해 할 일을 관리했는데, 이렇게 하니 각 팀의 진행상황을 한번에 보기 힘들었다. 또 요구사항도 노션에 적어두었는데 체계적으로 적혀있지 않아서 확인이 조금 불편했다.
Jira 도입 이후에는 이슈 관리가 확실히 편해졌다. 백로그에는 해야할 일, 앞으로 할 일을 쭉 적어두고 칸반보드에는 현재 진행 상황을 한 눈에 볼 수 있게 구성했다. 또 다른 팀원에게 요구사항이 있을때도 하위 이슈, 담당자 설정을 통해 더 명확하게 작성할 수 있어서 좋았다. 처음에는 복잡했는데 익숙해진 후에는 만족스럽게 사용하고 있다.
하지만 단점도 뚜렷하게 존재했다. Jira에서는 커밋 목록과 PR도 볼 수 있는데 이 기능을 사용하려면 Jira 이슈에 있는 티켓을 커밋 메시지에 작성해야 한다. 문제는 이 티켓이 자동으로 붙는게 아니라서 커밋메시지를 작성할때 일일이 입력해야한다. 브랜치를 여러 개 만든 경우에는 기억하기 힘들어서 티켓을 복사-붙여넣기 했는데, 하루에 커밋을 한 번만 하는게 아니다보니 매번 복붙 하기가 너무 너무 귀찮았다.
👉 이런식으로 티켓을 커밋 메시지에 작성하면 Jira에서도 커밋 목록을 볼 수 있다.
😕 어떻게 해결하지?
프로젝트 관리는 편해졌지만 반대로 개발할때는 귀찮은 일이 늘어났다. 분명 다른 사람들도 이런 문제를 겪고 있을거라 생각해서 찾아봤는데 Git Hooks로 지라 티켓을 자동으로 붙일 수 있다고 한다.
🪝Git Hooks란?
Git Hooks란 Git 리포지토리에서 특정 이벤트가 생겼을 때 특정 스크립트를 실행할 수 있도록 하는 기능이다. Git에서 제공하는 기능이기 때문에 따로 설치할 필요는 없고 프로젝트에서 Git을 사용해 버전 관리를 한다면 바로 사용할 수 있다.
훅은 크게 클라이언트 훅, 서버 훅으로 나눌 수 있다. 클라이언트 훅은 커밋, 머지할 때 실행되고 서버 훅은 푸시 할 때 서버에서 실행된다.
프로젝트의 .git/hooks
디렉토리로 가면 아래 사진과 같이 .sample
확장자가 붙어있는 Git이 자동으로 넣어준 스크립트 예제 파일이 있다. 예제는 쉘, Perl 스크립트로 작성되어 있는데 실행할 수만 있으면 다른 언어로 만들어도 된다고 한다. 사용할 때는 .sample
확장자를 제거해야 한다.
어떤 상황에서 각 스크립트가 실행되는지 자세히 알고싶으면 Git Hooks 문서(영문, 한글)를 참고하면 된다.
이제 Git Hooks가 무엇인지 알았으니 커밋 메시지에 Jira 티켓을 붙이는 스크립트를 작성하려고 했다. 하지만 .git 폴더는 원격 저장소에 올라가지 않기 때문에 모든 팀원이 동일한 설정을 해줘야해서 번거롭고, 설정 과정도 까다롭기 때문에 이 문제를 해결할 방법을 찾아다녔다. 그래서 찾은 방법은 Husky와 jira-prepare-commit-msg를 사용하는것이다.
🐾 Husky란?
Modern native git hooks made easy
Husky는 Git Hooks 설정을 쉽게 할 수 있도록 도와주는 패키지다. 사용 사례를 찾아보니 Git Hooks 설정 뿐만 아니라 다른 팀원에게 동일한 훅 설정을 적용시키기 위해서도 많이 사용하는것 같다. 공식 문서를 보니 의존성이 하나도 없고 가볍다는것을 장점으로 내세우고 있다.
🔗 Husky 공식 문서: typicode.github.io/husky
🤓 jira-prepare-commit-msg
jira-prepare-commit-msg는 Jira 티켓을 커밋 메시지에 자동으로 삽입해주는 Husky 명령어 패키지다. npm을 사용하고 있다면 설치 후 간단한 설정을 하면 바로 사용할 수 있다.
Jira 티켓은 현재 브랜치 이름에서 가져온다고 한다. 현재 팀의 브랜치 작명 룰도 브랜치에 Jira 티켓을 꼭 포함해야 하기 때문에 써도 괜찮겠다는 판단을 했다.
참고로 Git Hooks에서 prepare-commit-msg는 커밋 메시지를 생성한 후 커밋을 최종 완료하기 전에 실행한다. 사람이 커밋 메시지를 수정하기 전에 먼저 프로그램으로 수정하고 싶을때 사용한다.
👉 설정 방법
Husky와 jira-prepare-commit-msg를 사용하는 목적은 1) 커밋 시 자동으로 Jira 티켓 붙이기, 2) 모든 팀원이 npm install 받은 후 별다른 설정 없이 바로 해당 훅을 사용할 수 있게 만들기 두 가지이다.
그럼 이 두가지 목적을 달성하기 위한 설정 방법을 알아보자.
먼저 Husky를 설치한다. 개발환경에서만 필요하기 때문에 devDependencies로 설치한다.
npm install husky --save-dev
Husky에서 Git Hooks 사용 설정을 한다. (처음 세팅하는 사람만 하면 됨)
npx husky install
package.json으로 가서 script에 아래 코드를 추가한다. clone 받아서 사용하는 사람들은 npm install 후 자동으로 husky install이 될 수 있도록 하는 설정이다.
{ "scripts": { "postinstall": "husky install", ... } }
jira-prepare-commit-msg을 설치한다. Husky와 동일하게 devDependencies로 설치한다.
npm install jira-prepare-commit-msg --save-dev
아래 명령어를 입력해서 훅 설정을 한다. Husky 버전이 5 이상이면 여기까지만 하면 되고, 2~4 버전이라면 package.json에 script를 추가해야 한다.
npx husky add .husky/prepare-commit-msg 'npx jira-prepare-commit-msg $1'
여기까지 하고 프로젝트 폴더를 보면 .husky
폴더가 생겼고, .husky
폴더 내부에 prepare-commit-msg
파일이 생긴다.
이렇게하면 설정은 끝이다. 그럼 이제 지금까지 변경사항을 커밋해보자. git commit -m “커밋 메시지”
이렇게 작성하고 커밋하면 자동으로 제일 앞에 Jira 티켓이 붙는다. 그리고 터미널에서도 prepare commit msg 스크립트가 실행되는 것을 확인할 수 있다.
커밋 메시지를 보면 제일 앞에 Jira 티켓이 잘 붙어있다. (참고: 커밋 메시지에 이미 티켓이 있으면 안붙음)
참고로 기본 설정도 바꿀 수 있다. 우리 팀 브랜치 룰은 기본 설정과 동일해서 그대로 사용했지만, 만약 다르다면 package.json에서 변경하면 된다. 또한 1.3버전 부터는 다양한 설정 방법을 지원한다고 하니 꼭 package.json에서 설정하지 않아도 된다.
{
"jira-prepare-commit-msg": {
"messagePattern": "[$J] $M",
"jiraTicketPattern": "([A-Z]+-\\\\d+)",
"commentChar": "#",
"isConventionalCommit": false,
"conventionalCommitPattern": "^([a-z]+)(\\\\([a-z0-9.,-_ ]+\\\\))?!?: ([\\\\w \\\\S]+)$",
"allowEmptyCommitMessage": false,
"gitRoot": "",
"allowReplaceAllOccurrences": true,
"ignoredBranchesPattern": "^(master|main|dev|develop|development|release)$",
"ignoreBranchesMissingTickets": false
}
}
👉 (example) package.json에서는 이런식으로 작성한다.
🔽 더 자세한 설정 방법은 아래 문서 참고
🫂 드디어 복붙에서 벗어났다!
그동안 Jira 티켓 복붙하느라 너무 귀찮았는데 드디어 복붙에서 벗어날 수 있게 되었다. 이 소식을 이전에 함께 개발했던 다른 팀원에게도 알려드렸고 다음 프로젝트때 사용하기로 결정했다. Git Hooks와 Husky는 처음 설정해보는데 잘 사용하면 정말 편리하게 개발할 수 있을것 같다. 다른 사용 사례를 보니 prettier, ESLint와 함께 코드 규칙을 강제할때도 쓰던데 기회가 된다면 이 설정도 해보고싶다.