[STK9-06] Branch Protection + PR 템플릿
작업 내용 (설계 의도)
변경 사항
GitHub main 브랜치에 Branch Protection Rules를 설정하고, PR 템플릿을 정비한다. CI 없이는 머지가 불가능하도록 강제해 TBD 원칙을 제도적으로 보장한다.
Branch Protection Rules (gh CLI로 설정):
required_status_checks:test-backend,test-frontend,e2e,build4개 체크 필수required_pull_request_reviews: 직접 머지 불가 (PR 필수)restrict_pushes: main 직접 push 금지 (기존 git hook과 이중 보호)
설정 방법: gh api 또는 GitHub UI (Repository Settings → Branches → Add rule)
.github/pull_request_template.md 갱신: 기존 PR 템플릿에 CI 체크 항목 추가.
기존 git hooks와의 관계:
.githooks/pre-push: 로컬에서 main 직접 push 차단 (1차).githooks/pre-commit: 로컬에서 main 직접 머지 차단 (1차)- GitHub Branch Protection: 서버에서 강제 차단 (2차, 최종 게이트)
두 보호가 겹치는 것은 의도적이다. 로컬 hook을 우회(—no-verify)해도 GitHub에서 차단된다.
다이어그램
보호 레이어
flowchart LR DEV[개발자] --> LP[로컬 pre-push hook] LP -->|fail| BLOCK1[push 차단] LP -->|pass| GH[GitHub] GH --> BP[Branch Protection] BP -->|CI 미통과| BLOCK2[머지 불가] BP -->|CI 통과| MERGE[머지 가능]
PR 체크 흐름
flowchart LR PR[PR 생성] --> CI[GitHub Actions CI] CI --> C1[test-backend ✓] CI --> C2[test-frontend ✓] CI --> C3[e2e ✓] CI --> C4[build ✓] C1 --> MERGE[머지 버튼 활성화] C2 --> MERGE C3 --> MERGE C4 --> MERGE
테스트 케이스
- CI 4개 잡 중 하나라도 실패 시 GitHub UI에서 머지 버튼이 비활성화된다
- CI 모두 통과 시 머지 버튼이 활성화된다
- main 브랜치에 직접 push 시 GitHub 서버에서 거부된다 (로컬 hook 없어도)
- PR 생성 시
.github/pull_request_template.md내용이 자동으로 PR 본문에 채워진다 - PR 템플릿의 CI 체크리스트 항목이 GitHub Status Check와 연동되어 표시된다
- 기존 pre-push hook이 활성화된 상태에서 main push 시 로컬 레벨에서 먼저 차단된다