배경
- TDD로 개발하다가, 기능 단위 커밋을 할 때 해당 커밋의 기능이 테스트를 통과하는지 확실하게 검증하기 위해 커밋 이전에 테스트를 돌리고 통과 시에만 커밋을 할 수 있도록 하고 싶었다.
- 또한 커밋 메시지 컨벤션을 따르기 위해 커밋 메시지 검증이 필요했다.
구현
git hooks 설정하기
- 외부 라이브러리를 사용할 수 없었기에, 평소 사용했던 husky로 설정은 불가능해서 .git/hooks에서 설정을 해주기로 했다.
1. cd .git/hooks 해서 지원하는 훅 확인
2. 해당 위치에서 필요한 훅의 .sample 확장자를 지운 이름의 파일을 만들기
vi pre-commit
3. 실행하고 싶은 명령어 작성
# .git/hooks/pre-commit
npm test
4. 권한부여
chmod ug+x .git/hooks/*
- chmod 파일의 권한을 변경해라.
- ug 사용자와 그룹에게
- +x 실행 권한을 부여하도록
- .git/hooks/ 디렉토리에 있는 모든 파일을 대상으로
커밋 메시지 컨벤션
AngularJS 커밋 메시지 컨벤션을 사용하라는 규칙이 있어서, 해당 규칙을 살펴보았다.
<type>(<scope>): <short summary>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
허용되는 <type>
feat(기능 추가)
fix(버그 수정)
docs(문서)
style(포맷팅, 세미콜론 누락, …)
refactor
test(테스트 추가)
build(빌드 관련 파일 수정)
ci (CI 설정 파일 수정)
perf (성능 개선)
chore(그 외 자잘한 수정)
허용되는 <scope>
커밋 변경 위치를 명시하는 모든 것
규모가 작은 프로젝트인만큼, 커밋 메시지 헤더만 작성하는 것으로 규칙을 정하고 아래와 같이 .git/hooks/commit-msg를 작성해 주었다.
message="$(cat $1)"
requiredPattern="^(feat|fix|docs|style|refactor|test|build|ci|perf|chore)\([a-zA-Z\,]+\):.*$"
if ! [[ $message =~ $requiredPattern ]];
then
echo "=========================================================================="
echo "================= 🚨 커밋 메시지를 수정해 주세요 🚨 =================="
echo "=========================================================================="
echo "== 커밋 컨벤션 ⏩ [prefix]([scope]): [작업 내용] =="
echo "== 허용되는 접두사 ⏩ feat, fix, docs, style, refactor, test, build, ci, perf, chore =="
echo "=========================================================================="
exit 1
fi
결과
이제 테스트를 통과하지 못한 코드는 커밋되지 않는다.
커밋 메시지 컨벤션을 지키지 않으면 작성한 경고를 출력하고 커밋되지 않는다.
배운 점
- 그저 husky 를 git hooks 설정을 편하게 해주는 도구라고 생각했는데, .git 폴더는 원격에 저장하지 않으므로 팀 프로젝트에서 해당 설정을 공유하기 위한 역할이 크다는 것을 알게 되었다.
- 우테코는 철저하게 개인프로젝트이므로 적합한 설정을 잘 해준 것 같다!
'TIL > Git' 카테고리의 다른 글
[CI/CD] Github Action을 이용한 자동화와 브랜치 전략 (1) | 2023.09.24 |
---|