콘텐츠로 이동

커밋 메시지에 이슈 번호를 강제하는 commit-msg 훅 배포

커밋 메시지 말머리에 이슈 트래커의 이슈 번호를 붙이는 규칙을 정했다.

[PROJ-xxxx] 내용

다음과 같은 작업이 공유되지 않은 채 빌드에 반영되는 일이 반복됐다.

  • 코드 리팩토링
  • 간단한 이미지 교체
  • 보고되지 않은 오류 수정
  • 수정 이후 공유 누락

소스 코드와 리소스의 수정 사항은 모두 git을 거쳐 빌드에 반영된다. 그래서 커밋할 때 이슈 번호를 반드시 넣도록 제약을 걸어, 아무도 인지하지 못한 작업이 빌드에 들어가지 않게 하려 했다.

커밋 메시지가 규칙에 맞는지 확인하는 방법으로 세 가지를 비교했다.

  • 클라이언트 훅
    • 각자 로컬에 설치해야 하므로 강제하기 어렵다.
    • 훅을 자동 배포하거나 서버에서 확인할 방법이 필요하다.
  • 서버 사이드 훅
    • 저장소 서버에 접근 권한이 없어 적용하기 어렵다.
  • GitLab CI/CD
    • 파이프라인에서 클라이언트 훅과 비슷한 스크립트로 커밋 메시지를 확인할 수 있다.
    • 먼저 로컬 훅 자동 설치 방식을 써 보고, 부족하면 추가로 검토하기로 했다.

클라이언트 훅으로 쓰는 commit-msg 스크립트는 다음과 같다.

#!/bin/bash
# 커밋 메시지가 [PROJ-xxxx] 형식을 가져야 합니다.
RULE="^\[PROJ-[0-9]+\]"
# 커밋 메시지를 파일로부터 읽습니다 (첫 번째 인수로 전달됨).
commit_message=$(cat "$1")
# 메시지를 검사합니다.
if [[ ! $commit_message =~ $RULE ]]; then
echo "commit message : \"$commit_message\""
echo "[Error] commit 메시지는 \"[PROJ-1234] 내용\" 형식을 가져야 합니다."
exit 1
fi

결정: Unity 에디터 시작 시 훅 자동 설치

섹션 제목: “결정: Unity 에디터 시작 시 훅 자동 설치”

Unity 프로젝트에서는 에디터 클래스의 InitializeOnLoad를 이용해, 에디터가 켜질 때마다 로컬 설정 스크립트를 실행하도록 했다. 한 번만 하면 되는 작업이지만 스크립트가 간단하므로 적용 여부를 따로 확인하지 않고 매번 호출한다.

  • _PackageManagerConfiguration: .upmconfig.toml 파일을 복사한다.
  • _GitCommitMsgRestrict: commit-msg 파일을 .git/hooks로 복사한다.
[InitializeOnLoad]
public class EditorMenu
{
// 유니티 에디터 시작시에 해야하는 일
static EditorMenu()
{
// 로컬환경에 각각 설정해야하는 부분을 자동으로 설정될 수 있도록 EditorClass의 InitializeOnLoad를 사용해서 구현한다.
// 한번만 수행하면 되는 작업이긴 하지만, 간단한 스크립트 실행이므로 적용여부를 체크하기 보다는 유니티 에디터 실행시에 매번 호출한다.
// _PackageManagerConfiguration : .upmconfig.toml 파일을 복사한다.
// _GitCommitMsgRestrict : .git/hooks/commit-msg 파일을 복사한다.
var consoleScripts = new string[] { "_PackageManagerConfiguration", "_GitCommitMsgRestrict" };
foreach (var script in consoleScripts)
{
string path = Application.dataPath.Replace("Assets", script);
if (Application.platform == RuntimePlatform.WindowsEditor)
{
// 윈도우에서는 cmd 파일을 실행
path += ".cmd";
}
else if (Application.platform == RuntimePlatform.OSXEditor)
{
// 맥에서는 sh 파일을 실행
path += ".sh";
}
System.Diagnostics.Process.Start(path);
}
}

훅을 복사하는 스크립트는 OS별로 나눈다.

Windows:

터미널 창
xcopy commit-msg ..\.git\hooks /Y

Mac:

터미널 창
cp -f ./commit-msg ../.git/hooks

Unity 프로젝트가 아닌 게임 로직 서버 프로젝트는 자동 배포를 나중으로 미루고, commit-msg 훅 파일과 _GitCommitMsgRestrict.cmd를 저장소에 넣어 두어 각자 실행해 적용하게 했다.

사용자는 업데이트를 pull 받기만 하면 훅이 자동으로 적용된다. 커밋 메시지 형식이 맞지 않으면 커밋 시 에러 팝업이 뜬다. 형식과 관계없이 꼭 커밋해야 할 때는 팝업에서 무시하고 진행하는 버튼으로 커밋할 수 있다.