본문으로 바로가기

[husky] husky를 이용하여 commit-message validation 하기

◆ 참고

해당 게시글은 시리즈로 이루어져 있습니다.

이전 게시글 프로젝트 설정하는 방법을 보지 않았으면 잘 동작하지 않을 수 있습니다.

이전 게시글 보러가기 : 이동하기

 

이번 게시글에서는 husky를 이용하여 commit message를 검사하는 방법을 알아보자.

팀(+ 회사)마다 commit message convention이 있는 경우가 있다.

그러나 convention만 정하고 지키지 않으면 의미가 없다.

 

각각의 개발자를 믿고 맡겨도 되지만 사람이 하는 일이라 실수가 있기 마련이다.

이러한 실수를 사전에 방지하는 방법을 알아보자.

 

commit-msg

commit-msg hook을 이용하면 commit을 할 때 작성한 message를 얻어올 수 있다.

이 말은 commit convention을 검사할 수 있다는 것이다.

즉, 잘못된 commit message를 방지해줄 수 있다.

 

◆ 예시 commit message convention

회사마다 다를 수 있으니 하나 가상으로 정해서 구현해보자.

commit message convention이 아래와 같다고 해보자.

 

제목 
Blank 
본문 (옵션)
Blank 
푸터 (Jira Ticket)

 

◆ 상세 convention

제목(필수) : (feat|fix|docs|style): 50글자 내

본문(옵션) : 텍스트

푸터(필수) : Jira Ticket으로 [영어-숫자] 로 작성 ex) [ABCD-1234]

 

위 각각의 문단 사이에는 줄바꿈이 필수적으로 있어야 한다.

위와 같은 convention이 있다고 가정해보고 구현해보자.

 

◆ 구현하기

먼저 제목을 구현해보자.

feat, fix, docs, style 중 1개로 시작하며 :가 붙고 뒤에 텍스트가 50글자 내여야 한다.

예를들면 아래와 같아야 한다.

feat: add warning dialog

 

위 규칙을 테스트 할 수 있는 정규식을 작성하면 된다.

commit_msg_title_regex='^(feat|fix|docs|style): .{1,50}'</span >

위 정규식으로 간단하게 테스트 할 수 있다.

 

본문은 옵션이니 테스트할 필요가 없다.

 

푸터는 Jira Ticket을 작성해주어야 한다.

Jira Ticket의 규칙을 보면 [로 시작하며 ]로 끝나고 그 사이에는 영어-숫자로 되어 있다.

이것도 테스트 할 수 있도록 정규식을 작성하면 된다.

commit_msg_jira_regex="\[[A-Z]+-[0-9]+\]$"

 

제목, 본문, 푸터 convention validation 코드를 모두 구현했다.

이제 각 사이에 줄바꿈이 있는 지 검사해야한다.

이 부분이 어려울 수 있는데 쉽게 생각하면 된다.

 

commit message convention에 맞게 경우의 수를 작성해보자.

아래 2가지 경우의 수가 나온다.

 

- 경우 1

제목 

본문 

푸터

 

- 경우 2

제목 

푸터

 

위 경우의 수를 자세히 살펴보면 공통점이 있다.

제목 아래 1칸, 푸터 위에 1칸줄바꿈이다.

이 부분만 검사하면 된다는 것이다.

 

commit message 위에서 2번째 줄을 얻어오는 방법은 아래와 같다.

second_line=$(echo "$commit_msg")

 

commit message 아래 2번째 줄을 얻어오는 방법은 아래와 같다.

last_second_line=$(echo "$commit_msg" | tail -n 2 | head -n 1)</span >

 

이제 변수가 빈 문자열인지 확인하면 된다.

이 부분은 shell script 내용이므로 밑에 최종 스크립트를 보고 이해해보자.

 

◆ 최종 스크립트

commit_msg_file=$1
commit_msg=$(cat $1)
second_line=$(echo "$commit_msg" | sed -n '2p')
last_second_line=$(echo "$commit_msg" | tail -n 2 | head -n 1)

commit_msg_title_regex='^(feat|fix|docs|style): .{1,50}'
commit_msg_jira_regex="\[[A-Z]+-[0-9]+\]$"

# 제목
if ! grep -qE "$commit_msg_title_regex" "$commit_msg_file"; then
  echo "COMMIT REJECTED: Please write according to the commit message rule."
  exit 1
fi

# 2번째 줄 
if ! [ -z "$second_line" ]; then 
  echo "COMMIT REJECTED: The 2nd line should be blank."
  exit 1
fi

# 마지막 2번째 줄
if ! [ -z "$last_second_line" ]; then 
  echo "COMMIT REJECTED: The 2nd last line should be blank."
  exit 1
fi

# Jira ticket 
if ! tail -n +1 "$commit_msg_file" | grep -qE $commit_msg_jira_regex; then
  echo "COMMIT REJECTED: Please check jira ticket."
  exit 1
fi



결과

git commit을 해보면서 잘 동작하는 지 확인해보면 좋을 것 같다.

이렇게 하나 하나 씩 프로젝트에 필요한 내용을 추가하면 된다.

 

마지막

틀린 부분이 있다면 댓글로 말씀 부탁드리겠습니다.

반응형