커밋 메시지에 이슈 번호를 강제하는 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 1fi결정: 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 /YMac:
cp -f ./commit-msg ../.git/hooksUnity 프로젝트가 아닌 게임 로직 서버 프로젝트는 자동 배포를 나중으로 미루고, commit-msg 훅 파일과 _GitCommitMsgRestrict.cmd를 저장소에 넣어 두어 각자 실행해 적용하게 했다.
사용자는 업데이트를 pull 받기만 하면 훅이 자동으로 적용된다. 커밋 메시지 형식이 맞지 않으면 커밋 시 에러 팝업이 뜬다. 형식과 관계없이 꼭 커밋해야 할 때는 팝업에서 무시하고 진행하는 버튼으로 커밋할 수 있다.