|
| 1 | +# ENTB-XXX-XXXX: 빌드 검증 및 커밋 메시지 포맷 검증 기능 개발 |
| 2 | + |
| 3 | +--- |
| 4 | +## 요약 |
| 5 | +`pre commit`을 활용하여 빌드 실패 시와 커밋 메시지 포맷이 잘 못 되었을 시 커밋이 안되도록 검증 기능을 개발하였습니다. |
| 6 | + |
| 7 | +--- |
| 8 | +## 동기 |
| 9 | +- 협업 중 빌드에 실패하는 코드나 잘못된 형식의 커밋 메시지가 main 브랜치에 올라가는 일이 반복되었습니다. |
| 10 | +- 이를 방지하기 위해 사전에 검증할 수 있는 자동화된 체계가 필요하였습니다. |
| 11 | +- 개발자가 실수로 잘못된 코드를 커밋하지 않도록 막아 코드 품질과 협업 효율을 높이고자 했습니다. |
| 12 | +- 팀 내 커밋 메시지 규칙을 지키도록 강제하여, 커밋 로그의 일관성과 가독성을 유지하고자 했습니다. |
| 13 | + |
| 14 | +### 목표 |
| 15 | +- 커밋 전에 코드가 빌드 가능한지 자동으로 확인하여 빌드 오류가 있는 커밋을 방지합니다. |
| 16 | +- 커밋 메시지가 정해진 포맷에 맞는지 검증하여 일관된 커밋 로그를 유지합니다. |
| 17 | +- 위 조건이 만족되지 않으면 커밋 자체를 막도록하여 실수로 인한 문제를 사전에 차단합니다. |
| 18 | +- pre-commit 훅을 통해 개발자의 로컬 환경에서 자동 실행되도록 구성하여 별도의 수동 확인 없이도 자동화되도록 합니다. |
| 19 | + |
| 20 | +### 목표가 아닌 것 |
| 21 | +- 빌드 오류의 원인을 상세히 분석하거나 자동으로 수정하지 않습니다. |
| 22 | +- 커밋 메시지를 자동으로 수정하거나 생성하지 않습니다. |
| 23 | +- 로컬 외의 환경에서의 검증은 포함하지 않습니다. |
| 24 | +- 특정 프레임워크나 프로젝트 구조에 종속되지 않도록 범용적으로 설계되어 있으나, 모든 종류의 프로젝트에서 완벽하게 동작함을 보장하지 않습니다. |
| 25 | + |
| 26 | + |
| 27 | + |
| 28 | +--- |
| 29 | +## 제안 |
| 30 | +- `commit-msg` |
| 31 | + - 커밋 메시지가 다음과 같은 규칙을 따르는지 정규표현식으로 검증합니다. |
| 32 | + - `커밋타입 ( #이슈번호 ) : 커밋메시지` |
| 33 | +- `pre-commit` |
| 34 | + - 커밋 전에 자동으로 Gradle 빌드를 수행하여 빌드가 성공적으로 진행되면 커밋이 되도록 구현하였습니다. |
| 35 | + |
| 36 | +### 기술 설계 |
| 37 | +- `.git/hooks/` 위치에 `commit-msg`와 `pre-commit`을 작성하였습니다. |
| 38 | +- `commit-msg`와 `pre-commit`에 각 목표에 맞는 스크립트 코드를 작성하였습니다. |
| 39 | + |
| 40 | + |
| 41 | + |
| 42 | +`commit-msg` |
| 43 | +```shell |
| 44 | +#!/bin/bash |
| 45 | +# .git/hooks/commit-msg |
| 46 | + |
| 47 | +msg_file="$1" |
| 48 | +commit_msg="$(<"$msg_file")" |
| 49 | + |
| 50 | +regex="^(feat|fix|chore|docs|style|refactor|test|perf|ci|build|revert) \\( #[0-9]+ \\) : .+$" |
| 51 | + |
| 52 | +if [[ ! $commit_msg =~ $regex ]]; then |
| 53 | + echo "❌ 메시지 형식 에러: 타입 ( #이슈 ) : 설명" |
| 54 | + exit 1 |
| 55 | +fi |
| 56 | + |
| 57 | +echo "✅ 커밋 메시지 형식 OK" |
| 58 | +``` |
| 59 | + |
| 60 | +`pre-commit` |
| 61 | +``` |
| 62 | +#!/bin/bash |
| 63 | +# .git/hooks/pre-commit |
| 64 | +
|
| 65 | +echo "🔨 Gradle 빌드 검증…" |
| 66 | +
|
| 67 | +if ! ./gradlew clean build --no-daemon; then |
| 68 | + echo "❌ 빌드 실패—커밋 중단" |
| 69 | + exit 1 |
| 70 | +fi |
| 71 | +
|
| 72 | +echo "✅ 빌드 성공" |
| 73 | +
|
| 74 | +``` |
0 commit comments