Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions documents/etc/16-pre-commit.md
Original file line number Diff line number Diff line change
@@ -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 "✅ 빌드 성공"

```