diff --git a/documents/etc/16-pre-commit.md b/documents/etc/16-pre-commit.md new file mode 100644 index 0000000..5085f59 --- /dev/null +++ b/documents/etc/16-pre-commit.md @@ -0,0 +1,74 @@ +# ENTB-XXX-XXXX: 빌드 검증 및 커밋 메시지 포맷 검증 기능 개발 + +--- +## 요약 +`pre commit`을 활용하여 빌드 실패 시와 커밋 메시지 포맷이 잘 못 되었을 시 커밋이 안되도록 검증 기능을 개발하였습니다. + +--- +## 동기 +- 협업 중 빌드에 실패하는 코드나 잘못된 형식의 커밋 메시지가 main 브랜치에 올라가는 일이 반복되었습니다. +- 이를 방지하기 위해 사전에 검증할 수 있는 자동화된 체계가 필요하였습니다. +- 개발자가 실수로 잘못된 코드를 커밋하지 않도록 막아 코드 품질과 협업 효율을 높이고자 했습니다. +- 팀 내 커밋 메시지 규칙을 지키도록 강제하여, 커밋 로그의 일관성과 가독성을 유지하고자 했습니다. + +### 목표 +- 커밋 전에 코드가 빌드 가능한지 자동으로 확인하여 빌드 오류가 있는 커밋을 방지합니다. +- 커밋 메시지가 정해진 포맷에 맞는지 검증하여 일관된 커밋 로그를 유지합니다. +- 위 조건이 만족되지 않으면 커밋 자체를 막도록하여 실수로 인한 문제를 사전에 차단합니다. +- pre-commit 훅을 통해 개발자의 로컬 환경에서 자동 실행되도록 구성하여 별도의 수동 확인 없이도 자동화되도록 합니다. + +### 목표가 아닌 것 +- 빌드 오류의 원인을 상세히 분석하거나 자동으로 수정하지 않습니다. +- 커밋 메시지를 자동으로 수정하거나 생성하지 않습니다. +- 로컬 외의 환경에서의 검증은 포함하지 않습니다. +- 특정 프레임워크나 프로젝트 구조에 종속되지 않도록 범용적으로 설계되어 있으나, 모든 종류의 프로젝트에서 완벽하게 동작함을 보장하지 않습니다. + + + +--- +## 제안 +- `commit-msg` + - 커밋 메시지가 다음과 같은 규칙을 따르는지 정규표현식으로 검증합니다. + - `커밋타입 ( #이슈번호 ) : 커밋메시지` +- `pre-commit` + - 커밋 전에 자동으로 Gradle 빌드를 수행하여 빌드가 성공적으로 진행되면 커밋이 되도록 구현하였습니다. + +### 기술 설계 +- `.git/hooks/` 위치에 `commit-msg`와 `pre-commit`을 작성하였습니다. +- `commit-msg`와 `pre-commit`에 각 목표에 맞는 스크립트 코드를 작성하였습니다. + + + +`commit-msg` +```shell +#!/bin/bash +# .git/hooks/commit-msg + +msg_file="$1" +commit_msg="$(<"$msg_file")" + +regex="^(feat|fix|chore|docs|style|refactor|test|perf|ci|build|revert) \\( #[0-9]+ \\) : .+$" + +if [[ ! $commit_msg =~ $regex ]]; then + echo "❌ 메시지 형식 에러: 타입 ( #이슈 ) : 설명" + exit 1 +fi + +echo "✅ 커밋 메시지 형식 OK" +``` + +`pre-commit` +``` +#!/bin/bash +# .git/hooks/pre-commit + +echo "🔨 Gradle 빌드 검증…" + +if ! ./gradlew clean build --no-daemon; then + echo "❌ 빌드 실패—커밋 중단" + exit 1 +fi + +echo "✅ 빌드 성공" + +``` \ No newline at end of file