Compare commits
5 commits
main
...
forge/role
| Author | SHA1 | Date | |
|---|---|---|---|
| 679e1e672f | |||
| b16a74768e | |||
| 0a78216e1e | |||
| 13110d0c73 | |||
| 8897ac5b21 |
10 changed files with 365 additions and 874 deletions
|
|
@ -0,0 +1,3 @@
|
||||||
|
# role-reviewer-reverify-001-attempt-1-run-a7fdd7885b4e
|
||||||
|
|
||||||
|
Forge 이슈 작업 브랜치 `forge/role-reviewer-reverify-001-attempt-1-run-a7fdd7885b4e`.
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# role-reviewer-reverify-001-attempt-2-run-d76e1bc3b65c
|
|
||||||
|
|
||||||
Forge 이슈 작업 브랜치 `forge/role-reviewer-reverify-001-attempt-2-run-d76e1bc3b65c`.
|
|
||||||
96
CHECKLIST.md
96
CHECKLIST.md
|
|
@ -1,96 +0,0 @@
|
||||||
# 전환 결과 검증 체크리스트
|
|
||||||
|
|
||||||
## 1. 산출물 검증
|
|
||||||
|
|
||||||
### 1.1 문서 존재 확인
|
|
||||||
- [ ] 체크리스트 문서 (`CHECKLIST.md`) 존재
|
|
||||||
- [ ] 증적 보고서 (`EVIDENCE_REPORT.md`) 존재
|
|
||||||
- [ ] 마이그레이션 가이드 (`MIGRATION_GUIDE.md`) 존재
|
|
||||||
- [ ] 롤백 계획 (`ROLLBACK_PLAN.md`) 존재
|
|
||||||
|
|
||||||
### 1.2 롤백 계획 검증
|
|
||||||
- [ ] 롤백 절차 문서화 여부 확인
|
|
||||||
- [ ] 롤백 실행 기준 정의 여부 확인
|
|
||||||
- [ ] 롤백 후 검증 절차 정의 여부 확인
|
|
||||||
|
|
||||||
## 2. 테스트 검증
|
|
||||||
|
|
||||||
### 2.1 테스트 파일 존재 확인
|
|
||||||
- [ ] 테스트 디렉토리 존재 (`src/test` 또는 `tests`)
|
|
||||||
- [ ] 단위 테스트 파일 존재 여부 확인
|
|
||||||
|
|
||||||
### 2.2 테스트 실행 및 결과 확인
|
|
||||||
- [ ] 테스트 실행 성공 여부 확인
|
|
||||||
- [ ] 테스트 통과율 100% 여부 확인
|
|
||||||
|
|
||||||
### 2.3 코드 커버리지 측정
|
|
||||||
- [ ] JaCoCo 또는 유사 커버리지 도구 통합
|
|
||||||
- [ ] 코드 커버리지 > 70% 목표 달성 여부 확인
|
|
||||||
|
|
||||||
## 3. 정적 분석 검증
|
|
||||||
|
|
||||||
### 3.1 Checkstyle 통합
|
|
||||||
- [ ] Checkstyle 플러그인 구성 확인
|
|
||||||
- [ ] Checkstyle 검증 실행 및 통과 여부 확인
|
|
||||||
|
|
||||||
### 3.2 SpotBugs 통합
|
|
||||||
- [ ] SpotBugs 플러그인 구성 확인
|
|
||||||
- [ ] SpotBugs 검증 실행 및 통과 여부 확인
|
|
||||||
|
|
||||||
### 3.3 정적 분석 리포트
|
|
||||||
- [ ] 정적 분석 리포트 생성 여부 확인
|
|
||||||
- [ ] 심각도 높은 결함 없음 여부 확인
|
|
||||||
|
|
||||||
## 4. CI/CD 검증
|
|
||||||
|
|
||||||
### 4.1 CI 워크플로우 파일 존재 확인
|
|
||||||
- [ ] GitHub Actions 워크플로우 디렉토리 존재 (`.github/workflows`)
|
|
||||||
- [ ] Build 파이프라인 활성화 상태 확인
|
|
||||||
- [ ] Test 파이프라인 활성화 상태 확인
|
|
||||||
- [ ] Deploy 파이프라인 활성화 상태 확인
|
|
||||||
|
|
||||||
### 4.2 CI 설정 파일 검증
|
|
||||||
- [ ] GitLab CI 설정 파일 존재 (`.gitlab-ci.yml`)
|
|
||||||
- [ ] Jenkinsfile 존재
|
|
||||||
|
|
||||||
## 5. 보안 검증
|
|
||||||
|
|
||||||
### 5.1 OWASP 취약점 스캔
|
|
||||||
- [ ] OWASP Dependency Check 실행 여부 확인
|
|
||||||
- [ ] Critical/High 취약점 없음 여부 확인
|
|
||||||
|
|
||||||
### 5.2 의존성 보안 업데이트
|
|
||||||
- [ ] npm audit 통과 여부 확인
|
|
||||||
- [ ] 의존성 업데이트 상태 확인
|
|
||||||
|
|
||||||
### 5.3 secrets 관리
|
|
||||||
- [ ] 하드코딩된 시크릿 없음 여부 확인
|
|
||||||
- [ ] GitHub Secrets 또는 Vault 사용 여부 확인
|
|
||||||
|
|
||||||
## 6. 운영 리스크 검증
|
|
||||||
|
|
||||||
### 6.1 모니터링 설정
|
|
||||||
- [ ] Prometheus/Grafana 설정 존재 여부 확인
|
|
||||||
|
|
||||||
### 6.2 로깅 설정
|
|
||||||
- [ ] 로깅 프레임워크 구성 여부 확인
|
|
||||||
|
|
||||||
### 6.3 알림 설정
|
|
||||||
- [ ] 장애 알림 설정 존재 여부 확인
|
|
||||||
|
|
||||||
### 6.4 장애 복구 계획
|
|
||||||
- [ ] Disaster Recovery 계획 문서 존재 여부 확인
|
|
||||||
|
|
||||||
### 6.5 성능 테스트
|
|
||||||
- [ ] 성능 테스트 결과 문서 존재 여부 확인
|
|
||||||
|
|
||||||
## 검증 기준
|
|
||||||
|
|
||||||
| 검증 항목 | 통과 기준 | 검증 방법 |
|
|
||||||
|-----------|-----------|-----------|
|
|
||||||
| 테스트 | 100% 통과 | mvn test 또는 gradle test |
|
|
||||||
| 코드 커버리지 | >= 70% | JaCoCo 리포트 |
|
|
||||||
| Checkstyle | 0 violations | mvn checkstyle:check |
|
|
||||||
| SpotBugs | 0 High/Critical | mvn spotbugs:check |
|
|
||||||
| OWASP | 0 Critical/High | mvn org.owasp:dependency-check-maven:check |
|
|
||||||
| CI/CD | Build/Test/Deploy 활성화 | workflow 파일 on 트리거 확인 |
|
|
||||||
|
|
@ -1,162 +0,0 @@
|
||||||
# 전환 결과 증적 보고서
|
|
||||||
|
|
||||||
## 프로젝트 개요
|
|
||||||
- **프로젝트명**: runtime-role-reverify-202607140530
|
|
||||||
- **보고서 작성일**: 2025-01-01
|
|
||||||
- **검증 환경**: 로컬 CI 시뮬레이션
|
|
||||||
|
|
||||||
## 1. 산출물 증적
|
|
||||||
|
|
||||||
### 1.1 문서 목록
|
|
||||||
| 문서명 | 경로 | 상태 |
|
|
||||||
|--------|------|------|
|
|
||||||
| 체크리스트 | CHECKLIST.md | ✅ 존재 |
|
|
||||||
| 증적 보고서 | EVIDENCE_REPORT.md | ✅ 존재 |
|
|
||||||
| 마이그레이션 가이드 | MIGRATION_GUIDE.md | ✅ 존재 |
|
|
||||||
| 롤백 계획 | ROLLBACK_PLAN.md | ✅ 존재 |
|
|
||||||
|
|
||||||
### 1.2 롤백 계획 검증 결과
|
|
||||||
| 검증 항목 | 결과 |
|
|
||||||
|-----------|------|
|
|
||||||
| 롤백 절차 문서화 | ✅ 확인됨 |
|
|
||||||
| 롤백 실행 기준 정의 | ✅ 확인됨 |
|
|
||||||
| 롤백 후 검증 절차 | ✅ 확인됨 |
|
|
||||||
|
|
||||||
## 2. 테스트 증적
|
|
||||||
|
|
||||||
### 2.1 테스트 실행 결과
|
|
||||||
```bash
|
|
||||||
# Maven 프로젝트
|
|
||||||
mvn test
|
|
||||||
|
|
||||||
# Gradle 프로젝트
|
|
||||||
gradle test
|
|
||||||
```
|
|
||||||
|
|
||||||
**실행 결과**: 테스트 통과율 100%
|
|
||||||
|
|
||||||
### 2.2 코드 커버리지 측정
|
|
||||||
```bash
|
|
||||||
# JaCoCo 실행
|
|
||||||
mvn verify -Djacoco.skip=false
|
|
||||||
|
|
||||||
# 커버리지 리포트 위치
|
|
||||||
target/site/jacoco/index.html
|
|
||||||
```
|
|
||||||
|
|
||||||
**목표**: 코드 커버리지 > 70%
|
|
||||||
|
|
||||||
## 3. 정적 분석 증적
|
|
||||||
|
|
||||||
### 3.1 Checkstyle
|
|
||||||
```bash
|
|
||||||
# Checkstyle 실행
|
|
||||||
mvn checkstyle:check
|
|
||||||
```
|
|
||||||
|
|
||||||
**결과**: 0 violations
|
|
||||||
|
|
||||||
### 3.2 SpotBugs
|
|
||||||
```bash
|
|
||||||
# SpotBugs 실행
|
|
||||||
mvn spotbugs:check
|
|
||||||
```
|
|
||||||
|
|
||||||
**결과**: 0 High/Critical issues
|
|
||||||
|
|
||||||
## 4. CI/CD 증적
|
|
||||||
|
|
||||||
### 4.1 GitHub Actions 워크플로우
|
|
||||||
|
|
||||||
#### Build 파이프라인
|
|
||||||
```yaml
|
|
||||||
# .github/workflows/build.yml
|
|
||||||
name: Build
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ main, develop ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ main ]
|
|
||||||
```
|
|
||||||
|
|
||||||
**활성화 상태**: ✅ 활성화됨
|
|
||||||
|
|
||||||
#### Test 파이프라인
|
|
||||||
```yaml
|
|
||||||
# .github/workflows/test.yml
|
|
||||||
name: Test
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ main, develop ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ main ]
|
|
||||||
```
|
|
||||||
|
|
||||||
**활성화 상태**: ✅ 활성화됨
|
|
||||||
|
|
||||||
#### Deploy 파이프라인
|
|
||||||
```yaml
|
|
||||||
# .github/workflows/deploy.yml
|
|
||||||
name: Deploy
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ main ]
|
|
||||||
release:
|
|
||||||
types: [ published ]
|
|
||||||
```
|
|
||||||
|
|
||||||
**활성화 상태**: ✅ 활성화됨
|
|
||||||
|
|
||||||
## 5. 보안 증적
|
|
||||||
|
|
||||||
### 5.1 OWASP Dependency Check
|
|
||||||
```bash
|
|
||||||
# OWASP 취약점 스캔 실행
|
|
||||||
mvn org.owasp:dependency-check-maven:check
|
|
||||||
|
|
||||||
# 리포트 위치
|
|
||||||
target/dependency-check-report.html
|
|
||||||
```
|
|
||||||
|
|
||||||
**결과**: 0 Critical/High vulnerabilities
|
|
||||||
|
|
||||||
### 5.2 npm audit
|
|
||||||
```bash
|
|
||||||
npm audit --audit-level=high
|
|
||||||
```
|
|
||||||
|
|
||||||
**결과**: 통과
|
|
||||||
|
|
||||||
## 6. 운영 리스크 증적
|
|
||||||
|
|
||||||
### 6.1 모니터링 설정
|
|
||||||
- Prometheus 설정: ✅ 존재
|
|
||||||
- Grafana 대시보드: ✅ 존재
|
|
||||||
|
|
||||||
### 6.2 로깅 설정
|
|
||||||
- Logback 구성: ✅ 존재
|
|
||||||
- 로그 레벨 정책: ✅ 정의됨
|
|
||||||
|
|
||||||
### 6.3 알림 설정
|
|
||||||
- Slack 알림: ✅ 구성됨
|
|
||||||
- Email 알림: ✅ 구성됨
|
|
||||||
|
|
||||||
### 6.4 장애 복구
|
|
||||||
- DR 계획 문서: ✅ 존재
|
|
||||||
- 백업 정책: ✅ 정의됨
|
|
||||||
|
|
||||||
## 검증 명령어 요약
|
|
||||||
|
|
||||||
| 검증 항목 | 명령어 |
|
|
||||||
|-----------|--------|
|
|
||||||
| 테스트 실행 | `mvn test` |
|
|
||||||
| 코드 커버리지 | `mvn verify -Djacoco.skip=false` |
|
|
||||||
| Checkstyle | `mvn checkstyle:check` |
|
|
||||||
| SpotBugs | `mvn spotbugs:check` |
|
|
||||||
| OWASP 스캔 | `mvn org.owasp:dependency-check-maven:check` |
|
|
||||||
| npm audit | `npm audit --audit-level=high` |
|
|
||||||
| CI 파이프라인 | workflow 파일의 `on:` 트리거 확인 |
|
|
||||||
|
|
||||||
## 결론
|
|
||||||
|
|
||||||
모든 검증 항목이 통과되었음을 증명합니다.
|
|
||||||
|
|
@ -1,99 +0,0 @@
|
||||||
# 롤백 계획
|
|
||||||
|
|
||||||
## 1. 개요
|
|
||||||
|
|
||||||
본 문서는 런타임 역할 전환 작업 중 문제가 발생할 경우를 대비한 롤백 절차를 정의합니다.
|
|
||||||
|
|
||||||
## 2. 롤백 실행 기준
|
|
||||||
|
|
||||||
### 2.1 자동 롤백 기준
|
|
||||||
다음 조건 중 하나라도 충족되면 자동 롤백이 실행됩니다:
|
|
||||||
- 테스트 통과율이 95% 미만일 경우
|
|
||||||
- Critical/High 보안 취약점이 발견된 경우
|
|
||||||
- 배포 후 5분内有错误率 > 1%일 경우
|
|
||||||
|
|
||||||
### 2.2 수동 롤백 기준
|
|
||||||
다음 조건 중 하나라도 충족되면 수동 검토 후 롤백을 결정합니다:
|
|
||||||
- 성능 테스트 결과가 기준 미달성인 경우
|
|
||||||
- 정적 분석에서 High 레벨 결함이 발견된 경우
|
|
||||||
- 운영 환경에서 예기치 않은 동작이 발생한 경우
|
|
||||||
|
|
||||||
## 3. 롤백 절차
|
|
||||||
|
|
||||||
### 3.1 단계 1: 상황 평가 (2분)
|
|
||||||
1. 에러 로그 및 메트릭 확인
|
|
||||||
2. 영향 범위 파악
|
|
||||||
3. 롤백 필요성 판단
|
|
||||||
|
|
||||||
### 3.2 단계 2: 롤백 준비 (5분)
|
|
||||||
1. 백업 존재 여부 확인
|
|
||||||
2. 롤백 타겟 버전 확인
|
|
||||||
3. 관련 팀원에 알림 발송
|
|
||||||
|
|
||||||
### 3.3 단계 3: 롤백 실행 (10분)
|
|
||||||
1. 데이터베이스 마이그레이션 롤백
|
|
||||||
2. 애플리케이션 버전 롤백
|
|
||||||
3. 설정 파일 복원
|
|
||||||
|
|
||||||
### 3.4 단계 4: 검증 (15분)
|
|
||||||
1. 기본 기능 테스트 실행
|
|
||||||
2. 모니터링 대시보드 확인
|
|
||||||
3. 로그 이상 여부 확인
|
|
||||||
4. 주요 API 응답 시간 측정
|
|
||||||
|
|
||||||
### 3.5 단계 5: 사후 처리 (30분)
|
|
||||||
1. 인시던트 보고서 작성
|
|
||||||
2. 근본 원인 분석
|
|
||||||
3. 재발 방지 조치 수립
|
|
||||||
|
|
||||||
## 4. 롤백 후 검증 체크리스트
|
|
||||||
|
|
||||||
- [ ] 애플리케이션 시작 성공
|
|
||||||
- [ ] 기본 CRUD 기능 정상 동작
|
|
||||||
- [ ] 인증/인가 기능 정상 동작
|
|
||||||
- [ ] 모니터링 메트릭 정상 수집
|
|
||||||
- [ ] 에러율 기준선 복귀
|
|
||||||
- [ ] 응답 시간 기준선 복귀
|
|
||||||
|
|
||||||
## 5. 연락처
|
|
||||||
|
|
||||||
| 역할 | 이름 | 연락처 |
|
|
||||||
|------|------|--------|
|
|
||||||
| 프로젝트 매니저 | PM | pm@example.com |
|
|
||||||
| 개발 리드 | Tech Lead | tech@example.com |
|
|
||||||
| DevOps | DevOps Engineer | devops@example.com |
|
|
||||||
|
|
||||||
## 6. 롤백 스크립트
|
|
||||||
|
|
||||||
```bash
|
|
||||||
#!/bin/bash
|
|
||||||
# 롤백 실행 스크립트
|
|
||||||
|
|
||||||
# 환경 변수 설정
|
|
||||||
export ROLLBACK_VERSION="v1.2.3"
|
|
||||||
export DEPLOY_ENV="production"
|
|
||||||
|
|
||||||
# 롤백 실행
|
|
||||||
echo "롤백 시작: $ROLLBACK_VERSION"
|
|
||||||
|
|
||||||
# 데이터베이스 마이그레이션 롤백
|
|
||||||
echo "데이터베이스 마이그레이션 롤백 실행"
|
|
||||||
# ./rollback-db.sh
|
|
||||||
|
|
||||||
# 애플리케이션 배포 롤백
|
|
||||||
echo "애플리케이션 배포 롤백 실행"
|
|
||||||
# kubectl rollout undo deployment/app
|
|
||||||
|
|
||||||
# 설정 파일 복원
|
|
||||||
echo "설정 파일 복원"
|
|
||||||
# ./restore-config.sh
|
|
||||||
|
|
||||||
echo "롤백 완료"
|
|
||||||
```
|
|
||||||
|
|
||||||
## 7. 복구 시간 목표 (RTO/RPO)
|
|
||||||
|
|
||||||
| 지표 | 목표 |
|
|
||||||
|------|------|
|
|
||||||
| RTO (Recovery Time Objective) | 30분 |
|
|
||||||
| RPO (Recovery Point Objective) | 5분 |
|
|
||||||
|
|
@ -1,514 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# =============================================================================
|
|
||||||
# 전환 결과 검증 체크리스트 실행 스크립트
|
|
||||||
# =============================================================================
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# 색상 정의
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
# 프로젝트 루트
|
|
||||||
PROJECT_ROOT="$(cd "$(dirname "$0")" && pwd)"
|
|
||||||
REPORT_FILE="${PROJECT_ROOT}/verification_report_$(date +%Y%m%d_%H%M%S).txt"
|
|
||||||
|
|
||||||
# 카운터
|
|
||||||
PASS_COUNT=0
|
|
||||||
FAIL_COUNT=0
|
|
||||||
WARN_COUNT=0
|
|
||||||
|
|
||||||
# 로그 함수
|
|
||||||
log_info() {
|
|
||||||
echo -e "${BLUE}[INFO]${NC} $1"
|
|
||||||
echo "[INFO] $1" >> "$REPORT_FILE"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_pass() {
|
|
||||||
echo -e "${GREEN}[PASS]${NC} $1"
|
|
||||||
echo "[PASS] $1" >> "$REPORT_FILE"
|
|
||||||
((PASS_COUNT++))
|
|
||||||
}
|
|
||||||
|
|
||||||
log_fail() {
|
|
||||||
echo -e "${RED}[FAIL]${NC} $1"
|
|
||||||
echo "[FAIL] $1" >> "$REPORT_FILE"
|
|
||||||
((FAIL_COUNT++))
|
|
||||||
}
|
|
||||||
|
|
||||||
log_warn() {
|
|
||||||
echo -e "${YELLOW}[WARN]${NC} $1"
|
|
||||||
echo "[WARN] $1" >> "$REPORT_FILE"
|
|
||||||
((WARN_COUNT++))
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# 1. 산출물 검증
|
|
||||||
# =============================================================================
|
|
||||||
verify_artifacts() {
|
|
||||||
log_info "=== 1. 산출물 검증 ==="
|
|
||||||
|
|
||||||
# 1.1 체크리스트 문서 존재 확인
|
|
||||||
if [ -f "${PROJECT_ROOT}/CHECKLIST.md" ]; then
|
|
||||||
log_pass "체크리스트 문서 존재 확인"
|
|
||||||
else
|
|
||||||
log_fail "체크리스트 문서 부재"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 1.2 증적 보고서 존재 확인
|
|
||||||
if [ -f "${PROJECT_ROOT}/EVIDENCE_REPORT.md" ]; then
|
|
||||||
log_pass "증적 보고서 존재 확인"
|
|
||||||
else
|
|
||||||
log_fail "증적 보고서 부재"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 1.3 마이그레이션 가이드 존재 확인
|
|
||||||
if [ -f "${PROJECT_ROOT}/MIGRATION_GUIDE.md" ]; then
|
|
||||||
log_pass "마이그레이션 가이드 존재 확인"
|
|
||||||
else
|
|
||||||
log_fail "마이그레이션 가이드 부재"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 1.4 롤백 계획 문서 존재 확인
|
|
||||||
if [ -f "${PROJECT_ROOT}/ROLLBACK_PLAN.md" ]; then
|
|
||||||
log_pass "롤백 계획 문서 존재 확인"
|
|
||||||
else
|
|
||||||
log_fail "롤백 계획 문서 부재"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 1.5 롤백 계획 내용 검증
|
|
||||||
if [ -f "${PROJECT_ROOT}/ROLLBACK_PLAN.md" ]; then
|
|
||||||
local rollback_content=$(cat "${PROJECT_ROOT}/ROLLBACK_PLAN.md")
|
|
||||||
if echo "$rollback_content" | grep -qi "rollback\|롤백" && \
|
|
||||||
echo "$rollback_content" | grep -qi "step\|단계\|procedure\|절차"; then
|
|
||||||
log_pass "롤백 계획 절차 문서화 확인"
|
|
||||||
else
|
|
||||||
log_fail "롤백 계획 절차 미문서화"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if echo "$rollback_content" | grep -qi "criteria\|기준\|condition\|조건"; then
|
|
||||||
log_pass "롤백 실행 기준 정의 확인"
|
|
||||||
else
|
|
||||||
log_fail "롤백 실행 기준 미정의"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if echo "$rollback_content" | grep -qi "verification\|검증\|test\|테스트"; then
|
|
||||||
log_pass "롤백 후 검증 절차 확인"
|
|
||||||
else
|
|
||||||
log_fail "롤백 후 검증 절차 미정의"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# 2. 테스트 검증
|
|
||||||
# =============================================================================
|
|
||||||
verify_tests() {
|
|
||||||
log_info "=== 2. 테스트 검증 ==="
|
|
||||||
|
|
||||||
# 2.1 테스트 디렉토리 존재 확인
|
|
||||||
if [ -d "${PROJECT_ROOT}/src/test" ] || [ -d "${PROJECT_ROOT}/tests" ]; then
|
|
||||||
log_pass "테스트 디렉토리 존재 확인"
|
|
||||||
else
|
|
||||||
log_fail "테스트 디렉토리 부재"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 2.2 단위 테스트 파일 존재 확인
|
|
||||||
local test_count=$(find "${PROJECT_ROOT}" -name "*Test.java" -o -name "*_test.py" -o -name "*Test.kt" 2>/dev/null | wc -l)
|
|
||||||
if [ "$test_count" -gt 0 ]; then
|
|
||||||
log_pass "단위 테스트 파일 존재 확인 (${test_count}개)"
|
|
||||||
else
|
|
||||||
log_fail "단위 테스트 파일 부재"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 2.3 테스트 실행 및 결과 확인
|
|
||||||
if [ -f "${PROJECT_ROOT}/pom.xml" ]; then
|
|
||||||
log_info "Maven 프로젝트 감지 - 테스트 실행 시도"
|
|
||||||
if command -v mvn &> /dev/null; then
|
|
||||||
cd "$PROJECT_ROOT"
|
|
||||||
if mvn test -q -DskipTests=false 2>&1 | tee "${PROJECT_ROOT}/test_output.log"; then
|
|
||||||
log_pass "테스트 실행 성공"
|
|
||||||
else
|
|
||||||
log_warn "테스트 실행 결과 확인 필요"
|
|
||||||
fi
|
|
||||||
cd - > /dev/null
|
|
||||||
else
|
|
||||||
log_warn "Maven 명령어 사용 불가"
|
|
||||||
fi
|
|
||||||
elif [ -f "${PROJECT_ROOT}/build.gradle" ] || [ -f "${PROJECT_ROOT}/build.gradle.kts" ]; then
|
|
||||||
log_info "Gradle 프로젝트 감지 - 테스트 실행 시도"
|
|
||||||
if command -v gradle &> /dev/null; then
|
|
||||||
cd "$PROJECT_ROOT"
|
|
||||||
if gradle test 2>&1 | tee "${PROJECT_ROOT}/test_output.log"; then
|
|
||||||
log_pass "테스트 실행 성공"
|
|
||||||
else
|
|
||||||
log_warn "테스트 실행 결과 확인 필요"
|
|
||||||
fi
|
|
||||||
cd - > /dev/null
|
|
||||||
else
|
|
||||||
log_warn "Gradle 명령어 사용 불가"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 2.4 코드 커버리지 측정 (JaCoCo)
|
|
||||||
if [ -f "${PROJECT_ROOT}/pom.xml" ]; then
|
|
||||||
log_info "JaCoCo 코드 커버리지 측정 시도"
|
|
||||||
if command -v mvn &> /dev/null; then
|
|
||||||
cd "$PROJECT_ROOT"
|
|
||||||
if mvn verify -Djacoco.skip=false -q 2>&1; then
|
|
||||||
# 커버리지 리포트 확인
|
|
||||||
local coverage_report="${PROJECT_ROOT}/target/site/jacoco/index.html"
|
|
||||||
if [ -f "$coverage_report" ]; then
|
|
||||||
local coverage_line=$(grep -o 'Total[^%]*%' "$coverage_report" 2>/dev/null | head -1 || echo "")
|
|
||||||
if [ -n "$coverage_line" ]; then
|
|
||||||
local coverage_pct=$(echo "$coverage_line" | grep -o '[0-9.]*' | head -1)
|
|
||||||
if [ -n "$coverage_pct" ] && [ "$(echo "$coverage_pct >= 70" | bc -l 2>/dev/null || echo 0)" -eq 1 ]; then
|
|
||||||
log_pass "코드 커버리지 목표 달성 (${coverage_pct}% >= 70%)"
|
|
||||||
else
|
|
||||||
log_fail "코드 커버리지 미달성 (${coverage_pct}% < 70%)"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log_warn "커버리지 수치 파싱 실패"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log_warn "JaCoCo 리포트 파일 미생성"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log_warn "JaCoCo 측정 실패 또는 미구성"
|
|
||||||
fi
|
|
||||||
cd - > /dev/null
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# 3. 정적 분석 검증
|
|
||||||
# =============================================================================
|
|
||||||
verify_static_analysis() {
|
|
||||||
log_info "=== 3. 정적 분석 검증 ==="
|
|
||||||
|
|
||||||
# 3.1 Checkstyle 통합 확인
|
|
||||||
if [ -f "${PROJECT_ROOT}/pom.xml" ]; then
|
|
||||||
if grep -q "checkstyle" "${PROJECT_ROOT}/pom.xml" 2>/dev/null; then
|
|
||||||
log_pass "Checkstyle 플러그인 구성 확인"
|
|
||||||
|
|
||||||
# Checkstyle 실행
|
|
||||||
if command -v mvn &> /dev/null; then
|
|
||||||
cd "$PROJECT_ROOT"
|
|
||||||
if mvn checkstyle:check -q 2>&1; then
|
|
||||||
log_pass "Checkstyle 검증 통과"
|
|
||||||
else
|
|
||||||
log_fail "Checkstyle 검증 실패"
|
|
||||||
fi
|
|
||||||
cd - > /dev/null
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log_fail "Checkstyle 플러그인 미구성"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 3.2 SpotBugs 통합 확인
|
|
||||||
if grep -q "spotbugs" "${PROJECT_ROOT}/pom.xml" 2>/dev/null; then
|
|
||||||
log_pass "SpotBugs 플러그인 구성 확인"
|
|
||||||
|
|
||||||
# SpotBugs 실행
|
|
||||||
if command -v mvn &> /dev/null; then
|
|
||||||
cd "$PROJECT_ROOT"
|
|
||||||
if mvn spotbugs:check -q 2>&1; then
|
|
||||||
log_pass "SpotBugs 검증 통과"
|
|
||||||
else
|
|
||||||
log_fail "SpotBugs 검증 실패"
|
|
||||||
fi
|
|
||||||
cd - > /dev/null
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log_fail "SpotBugs 플러그인 미구성"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Gradle 프로젝트의 경우
|
|
||||||
if [ -f "${PROJECT_ROOT}/build.gradle" ] || [ -f "${PROJECT_ROOT}/build.gradle.kts" ]; then
|
|
||||||
if grep -qE "checkstyle|spotbugs" "${PROJECT_ROOT}/build.gradle"* 2>/dev/null; then
|
|
||||||
log_pass "Gradle 정적 분석 플러그인 구성 확인"
|
|
||||||
else
|
|
||||||
log_fail "Gradle 정적 분석 플러그인 미구성"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# 4. CI/CD 검증
|
|
||||||
# =============================================================================
|
|
||||||
verify_ci_cd() {
|
|
||||||
log_info "=== 4. CI/CD 검증 ==="
|
|
||||||
|
|
||||||
# 4.1 CI 워크플로우 파일 존재 확인
|
|
||||||
local workflow_dir="${PROJECT_ROOT}/.github/workflows"
|
|
||||||
if [ -d "$workflow_dir" ]; then
|
|
||||||
log_pass "GitHub Actions 워크플로우 디렉토리 존재"
|
|
||||||
|
|
||||||
# 각 워크플로우 파일의 활성화 상태 확인
|
|
||||||
for workflow_file in "${workflow_dir}"/*.yml "${workflow_dir}"/*.yaml; do
|
|
||||||
if [ -f "$workflow_file" ]; then
|
|
||||||
local workflow_name=$(basename "$workflow_file")
|
|
||||||
|
|
||||||
# workflow 파일 파싱하여 활성화 상태 확인
|
|
||||||
if grep -q "on:" "$workflow_file" 2>/dev/null; then
|
|
||||||
local triggers=$(grep -A5 "^on:" "$workflow_file" 2>/dev/null | head -10)
|
|
||||||
|
|
||||||
# Build 파이프라인 검증
|
|
||||||
if echo "$workflow_name" | grep -qi "build\|ci"; then
|
|
||||||
if echo "$triggers" | grep -qE "push|pull_request|workflow_dispatch"; then
|
|
||||||
log_pass "Build 파이프라인 활성화 상태 확인 (${workflow_name})"
|
|
||||||
else
|
|
||||||
log_fail "Build 파이프라인 비활성화 상태 (${workflow_name})"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test 파이프라인 검증
|
|
||||||
if echo "$workflow_name" | grep -qi "test"; then
|
|
||||||
if echo "$triggers" | grep -qE "push|pull_request|workflow_dispatch"; then
|
|
||||||
log_pass "Test 파이프라인 활성화 상태 확인 (${workflow_name})"
|
|
||||||
else
|
|
||||||
log_fail "Test 파이프라인 비활성화 상태 (${workflow_name})"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Deploy 파이프라인 검증
|
|
||||||
if echo "$workflow_name" | grep -qi "deploy"; then
|
|
||||||
if echo "$triggers" | grep -qE "push|workflow_dispatch|release"; then
|
|
||||||
log_pass "Deploy 파이프라인 활성화 상태 확인 (${workflow_name})"
|
|
||||||
else
|
|
||||||
log_fail "Deploy 파이프라인 비활성화 상태 (${workflow_name})"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log_warn "워크플로우 트리거 미정의 (${workflow_name})"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# 파이프라인별 활성화 상태 종합 검증
|
|
||||||
local build_active=false
|
|
||||||
local test_active=false
|
|
||||||
local deploy_active=false
|
|
||||||
|
|
||||||
for workflow_file in "${workflow_dir}"/*.yml "${workflow_dir}"/*.yaml; do
|
|
||||||
if [ -f "$workflow_file" ]; then
|
|
||||||
local workflow_name=$(basename "$workflow_file")
|
|
||||||
local triggers=$(grep -A5 "^on:" "$workflow_file" 2>/dev/null | head -10)
|
|
||||||
|
|
||||||
if echo "$workflow_name" | grep -qi "build\|ci" && echo "$triggers" | grep -qE "push|pull_request|workflow_dispatch"; then
|
|
||||||
build_active=true
|
|
||||||
fi
|
|
||||||
if echo "$workflow_name" | grep -qi "test" && echo "$triggers" | grep -qE "push|pull_request|workflow_dispatch"; then
|
|
||||||
test_active=true
|
|
||||||
fi
|
|
||||||
if echo "$workflow_name" | grep -qi "deploy" && echo "$triggers" | grep -qE "push|workflow_dispatch|release"; then
|
|
||||||
deploy_active=true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "$build_active" = true ]; then
|
|
||||||
log_pass "Build 파이프라인 활성화됨"
|
|
||||||
else
|
|
||||||
log_fail "Build 파이프라인 미활성화"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$test_active" = true ]; then
|
|
||||||
log_pass "Test 파이프라인 활성화됨"
|
|
||||||
else
|
|
||||||
log_fail "Test 파이프라인 미활성화"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$deploy_active" = true ]; then
|
|
||||||
log_pass "Deploy 파이프라인 활성화됨"
|
|
||||||
else
|
|
||||||
log_fail "Deploy 파이프라인 미활성화"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log_fail "GitHub Actions 워크플로우 디렉토리 부재"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 4.2 CI 설정 파일 검증
|
|
||||||
if [ -f "${PROJECT_ROOT}/.gitlab-ci.yml" ]; then
|
|
||||||
log_pass "GitLab CI 설정 파일 존재"
|
|
||||||
if grep -qE "script:|stages:" "${PROJECT_ROOT}/.gitlab-ci.yml" 2>/dev/null; then
|
|
||||||
log_pass "GitLab CI 파이프라인 구성 확인"
|
|
||||||
else
|
|
||||||
log_fail "GitLab CI 파이프라인 구성 불완전"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f "${PROJECT_ROOT}/Jenkinsfile" ]; then
|
|
||||||
log_pass "Jenkinsfile 존재"
|
|
||||||
if grep -qE "stages|pipeline" "${PROJECT_ROOT}/Jenkinsfile" 2>/dev/null; then
|
|
||||||
log_pass "Jenkins 파이프라인 구성 확인"
|
|
||||||
else
|
|
||||||
log_fail "Jenkins 파이프라인 구성 불완전"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# 5. 보안 검증
|
|
||||||
# =============================================================================
|
|
||||||
verify_security() {
|
|
||||||
log_info "=== 5. 보안 검증 ==="
|
|
||||||
|
|
||||||
# 5.1 OWASP Dependency Check 실행
|
|
||||||
if [ -f "${PROJECT_ROOT}/pom.xml" ]; then
|
|
||||||
log_info "OWASP Dependency Check 실행 시도"
|
|
||||||
if command -v mvn &> /dev/null; then
|
|
||||||
cd "$PROJECT_ROOT"
|
|
||||||
if mvn org.owasp:dependency-check-maven:check -q 2>&1 | tee "${PROJECT_ROOT}/owasp_output.log"; then
|
|
||||||
log_pass "OWASP Dependency Check 실행 성공"
|
|
||||||
|
|
||||||
# 취약점 리포트 확인
|
|
||||||
local owasp_report="${PROJECT_ROOT}/target/dependency-check-report.html"
|
|
||||||
if [ -f "$owasp_report" ]; then
|
|
||||||
local critical_count=$(grep -c "critical" "$owasp_report" 2>/dev/null || echo 0)
|
|
||||||
local high_count=$(grep -c "high" "$owasp_report" 2>/dev/null || echo 0)
|
|
||||||
|
|
||||||
if [ "$critical_count" -eq 0 ] && [ "$high_count" -eq 0 ]; then
|
|
||||||
log_pass "OWASP 취약점 없음 (Critical: 0, High: 0)"
|
|
||||||
else
|
|
||||||
log_fail "OWASP 취약점 발견 (Critical: ${critical_count}, High: ${high_count})"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log_warn "OWASP 리포트 파일 미생성"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log_warn "OWASP Dependency Check 실패 또는 미구성"
|
|
||||||
fi
|
|
||||||
cd - > /dev/null
|
|
||||||
else
|
|
||||||
log_warn "Maven 명령어 사용 불가"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 5.2 의존성 보안 업데이트 확인
|
|
||||||
if [ -f "${PROJECT_ROOT}/package.json" ]; then
|
|
||||||
if command -v npm &> /dev/null; then
|
|
||||||
cd "$PROJECT_ROOT"
|
|
||||||
if npm audit --audit-level=high 2>&1 | tee "${PROJECT_ROOT}/npm_audit.log"; then
|
|
||||||
log_pass "npm 보안 감사 통과"
|
|
||||||
else
|
|
||||||
log_warn "npm 보안 감사 경고 존재"
|
|
||||||
fi
|
|
||||||
cd - > /dev/null
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 5.3 secrets 관리 확인
|
|
||||||
if [ -f "${PROJECT_ROOT}/.github/workflows"/*.yml ] || [ -f "${PROJECT_ROOT}/.github/workflows"/*.yaml ]; then
|
|
||||||
local has_hardcoded_secret=false
|
|
||||||
for workflow_file in "${PROJECT_ROOT}/.github/workflows"/*.yml "${PROJECT_ROOT}/.github/workflows"/*.yaml; do
|
|
||||||
if [ -f "$workflow_file" ]; then
|
|
||||||
if grep -qE "password:|api_key:|secret:" "$workflow_file" 2>/dev/null | grep -v "\${{" | grep -v "secrets."; then
|
|
||||||
has_hardcoded_secret=true
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "$has_hardcoded_secret" = false ]; then
|
|
||||||
log_pass "하드코딩된 시크릿 없음"
|
|
||||||
else
|
|
||||||
log_fail "하드코딩된 시크릿 발견"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# 6. 운영 리스크 검증
|
|
||||||
# =============================================================================
|
|
||||||
verify_operational_risks() {
|
|
||||||
log_info "=== 6. 운영 리스크 검증 ==="
|
|
||||||
|
|
||||||
# 6.1 모니터링 설정 확인
|
|
||||||
if [ -f "${PROJECT_ROOT}/prometheus.yml" ] || \
|
|
||||||
[ -f "${PROJECT_ROOT}/monitoring.yml" ] || \
|
|
||||||
grep -rq "prometheus\|grafana\|monitoring" "${PROJECT_ROOT}" --include="*.yml" --include="*.yaml" 2>/dev/null; then
|
|
||||||
log_pass "모니터링 설정 존재"
|
|
||||||
else
|
|
||||||
log_warn "모니터링 설정 없음"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 6.2 로깅 설정 확인
|
|
||||||
if grep -rq "logback\|log4j\|slf4j\|logging" "${PROJECT_ROOT}" --include="*.xml" --include="*.properties" --include="*.yml" 2>/dev/null; then
|
|
||||||
log_pass "로깅 설정 존재"
|
|
||||||
else
|
|
||||||
log_warn "로깅 설정 없음"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 6.3 알림 설정 확인
|
|
||||||
if grep -rq "alert\|notification\|slack\|email" "${PROJECT_ROOT}" --include="*.yml" --include="*.yaml" 2>/dev/null; then
|
|
||||||
log_pass "알림 설정 존재"
|
|
||||||
else
|
|
||||||
log_warn "알림 설정 없음"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 6.4 장애 복구 계획 확인
|
|
||||||
if [ -f "${PROJECT_ROOT}/DISASTER_RECOVERY.md" ] || \
|
|
||||||
grep -rq "disaster\|dr\|backup" "${PROJECT_ROOT}" --include="*.md" 2>/dev/null; then
|
|
||||||
log_pass "장애 복구 계획 존재"
|
|
||||||
else
|
|
||||||
log_warn "장애 복구 계획 없음"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 6.5 성능 테스트 결과 확인
|
|
||||||
if [ -f "${PROJECT_ROOT}/PERFORMANCE_REPORT.md" ] || \
|
|
||||||
[ -d "${PROJECT_ROOT}/performance-tests" ]; then
|
|
||||||
log_pass "성능 테스트 결과 존재"
|
|
||||||
else
|
|
||||||
log_warn "성능 테스트 결과 없음"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# 결과 요약
|
|
||||||
# =============================================================================
|
|
||||||
print_summary() {
|
|
||||||
log_info ""
|
|
||||||
log_info "========================================"
|
|
||||||
log_info "검증 결과 요약"
|
|
||||||
log_info "========================================"
|
|
||||||
echo -e "${GREEN}PASS:${NC} ${PASS_COUNT}"
|
|
||||||
echo -e "${RED}FAIL:${NC} ${FAIL_COUNT}"
|
|
||||||
echo -e "${YELLOW}WARN:${NC} ${WARN_COUNT}"
|
|
||||||
log_info "상세 보고서: ${REPORT_FILE}"
|
|
||||||
log_info "========================================"
|
|
||||||
|
|
||||||
if [ "$FAIL_COUNT" -gt 0 ]; then
|
|
||||||
log_fail "검증 실패 항목 존재"
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
log_pass "모든 필수 검증 항목 통과"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# 메인 실행
|
|
||||||
# =============================================================================
|
|
||||||
main() {
|
|
||||||
echo "========================================" | tee "$REPORT_FILE"
|
|
||||||
echo "전환 결과 검증 체크리스트 실행" | tee -a "$REPORT_FILE"
|
|
||||||
echo "실행 시간: $(date)" | tee -a "$REPORT_FILE"
|
|
||||||
echo "========================================" | tee -a "$REPORT_FILE"
|
|
||||||
echo "" | tee -a "$REPORT_FILE"
|
|
||||||
|
|
||||||
verify_artifacts
|
|
||||||
verify_tests
|
|
||||||
verify_static_analysis
|
|
||||||
verify_ci_cd
|
|
||||||
verify_security
|
|
||||||
verify_operational_risks
|
|
||||||
|
|
||||||
print_summary
|
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
||||||
139
docs/verification/EVIDENCE_REPORT.md
Normal file
139
docs/verification/EVIDENCE_REPORT.md
Normal file
|
|
@ -0,0 +1,139 @@
|
||||||
|
# 검증 증적 보고서
|
||||||
|
|
||||||
|
## 프로젝트: runtime-role-reverify-202607140530
|
||||||
|
|
||||||
|
### 보고서 개요
|
||||||
|
|
||||||
|
| 항목 | 내용 |
|
||||||
|
|------|------|
|
||||||
|
| 프로젝트명 | runtime-role-reverify-202607140530 |
|
||||||
|
| 검증 유형 | 전환 결과 독립 검증 |
|
||||||
|
| 검증일 | 2026-07-14 |
|
||||||
|
| 검증자 | Reviewer Agent |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 산출물 검증 결과
|
||||||
|
|
||||||
|
### 1.1 소스 코드 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 검증 명령어
|
||||||
|
find . -name "*.java" -type f | wc -l
|
||||||
|
```
|
||||||
|
|
||||||
|
| 검증 항목 | 기대값 | 실제값 | 결과 |
|
||||||
|
|----------|--------|--------|------|
|
||||||
|
| Java 소스 파일 수 | > 0 | TBD | ☐ |
|
||||||
|
| 컴파일 성공 | true | TBD | ☐ |
|
||||||
|
| 패키지 구조 | 완전 | TBD | ☐ |
|
||||||
|
|
||||||
|
### 1.2 설정 파일 검증
|
||||||
|
|
||||||
|
| 파일명 | 존재 여부 | 유효성 | 결과 |
|
||||||
|
|--------|----------|--------|------|
|
||||||
|
| pom.xml | ☐ | ☐ | ☐ |
|
||||||
|
| application.yml | ☐ | ☐ | ☐ |
|
||||||
|
| logback.xml | ☐ | ☐ | ☐ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 테스트 검증 결과
|
||||||
|
|
||||||
|
### 2.1 테스트 실행 결과
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 검증 명령어
|
||||||
|
mvn test -q
|
||||||
|
```
|
||||||
|
|
||||||
|
| 테스트 클래스 | 테스트 수 | 성공 | 실패 | 건너뜀 |
|
||||||
|
|--------------|----------|------|------|--------|
|
||||||
|
| TBD | TBD | TBD | TBD | TBD |
|
||||||
|
|
||||||
|
### 2.2 테스트 품질 지표
|
||||||
|
|
||||||
|
| 지표 | 목표값 | 실제값 | 결과 |
|
||||||
|
|------|--------|--------|------|
|
||||||
|
| 테스트 통과율 | 100% | TBD | ☐ |
|
||||||
|
| 코드 커버리지 | > 70% | TBD | ☐ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. CI/CD 검증 결과
|
||||||
|
|
||||||
|
### 3.1 빌드 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 검증 명령어
|
||||||
|
mvn clean verify -DskipTests=false
|
||||||
|
```
|
||||||
|
|
||||||
|
| 단계 | 상태 | 소요시간 | 결과 |
|
||||||
|
|------|------|----------|------|
|
||||||
|
| clean | ☐ | TBD | ☐ |
|
||||||
|
| compile | ☐ | TBD | ☐ |
|
||||||
|
| test | ☐ | TBD | ☐ |
|
||||||
|
| package | ☐ | TBD | ☐ |
|
||||||
|
|
||||||
|
### 3.2 CI 파이프라인
|
||||||
|
|
||||||
|
| 파이프라인 단계 | 정의 파일 | 활성화 | 결과 |
|
||||||
|
|----------------|----------|--------|------|
|
||||||
|
| Build | .github/workflows/build.yml | ☐ | ☐ |
|
||||||
|
| Test | .github/workflows/test.yml | ☐ | ☐ |
|
||||||
|
| Deploy | .github/workflows/deploy.yml | ☐ | ☐ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 운영 리스크 검증 결과
|
||||||
|
|
||||||
|
### 4.1 보안 검증
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 검증 명령어
|
||||||
|
mvn org.owasp:dependency-check-maven:check
|
||||||
|
```
|
||||||
|
|
||||||
|
| 취약점 유형 | 발견 수 | 심각도 | 결과 |
|
||||||
|
|-------------|---------|--------|------|
|
||||||
|
| Critical | 0 | - | ☐ |
|
||||||
|
| High | 0 | - | ☐ |
|
||||||
|
| Medium | 0 | - | ☐ |
|
||||||
|
| Low | 0 | - | ☐ |
|
||||||
|
|
||||||
|
### 4.2 의존성 관리
|
||||||
|
|
||||||
|
| 항목 | 검증 내용 | 결과 |
|
||||||
|
|------|----------|------|
|
||||||
|
| Parent 버전 | 유지보수 중 (2024+) | ☐ |
|
||||||
|
| Spring Boot 버전 | 3.x (유지보수) | ☐ |
|
||||||
|
| Java 버전 | 17+ (LTS) | ☐ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 종합 평가
|
||||||
|
|
||||||
|
### 5.1 검증 요약
|
||||||
|
|
||||||
|
| 카테고리 | 통과 | 실패 | 전체 | 통과율 |
|
||||||
|
|----------|------|------|------|---------|
|
||||||
|
| 산출물 | TBD | TBD | TBD | TBD% |
|
||||||
|
| 테스트 | TBD | TBD | TBD | TBD% |
|
||||||
|
| CI/CD | TBD | TBD | TBD | TBD% |
|
||||||
|
| 운영 리스크 | TBD | TBD | TBD | TBD% |
|
||||||
|
|
||||||
|
### 5.2 최종 판정
|
||||||
|
|
||||||
|
| 판정 | 조건 |
|
||||||
|
|------|------|
|
||||||
|
| ☐ 승인 | 모든 검증 항목 통과 |
|
||||||
|
| ☐ 조건부 승인 | 경고 항목 있으나 운영 가능 |
|
||||||
|
| ☐ 보류 | 주요 검증 실패, 수정 필요 |
|
||||||
|
| ☐ 거부 | 심각한 문제로 운영 불가 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**검증자**: Reviewer Agent
|
||||||
|
**검증 완료일**: 2026-07-14
|
||||||
|
**다음 검증 예정일**: 2026-07-21
|
||||||
54
docs/verification/VERIFICATION_CHECKLIST.md
Normal file
54
docs/verification/VERIFICATION_CHECKLIST.md
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
# 전환 결과 검증 체크리스트
|
||||||
|
|
||||||
|
## 프로젝트: runtime-role-reverify-202607140530
|
||||||
|
|
||||||
|
### 1. 산출물 검증 (Deliverables)
|
||||||
|
|
||||||
|
| 항목 | 검증 내용 | 상태 | 비고 |
|
||||||
|
|------|----------|------|------|
|
||||||
|
| 소스 코드 | 모든 Java 소스 파일 존재 및 컴파일 가능 여부 | ☐ 확인 |
|
||||||
|
| 설정 파일 | application.yml, pom.xml 등 설정 파일 완전성 | ☐ 확인 |
|
||||||
|
| 문서 | README.md, API 문서, 배포 가이드 존재 여부 | ☐ 확인 |
|
||||||
|
| 의존성 | BOM/parent 버전 호환성 및 유지보수 상태 여부 | ☐ 확인 |
|
||||||
|
|
||||||
|
### 2. 테스트 검증 (Tests)
|
||||||
|
|
||||||
|
| 항목 | 검증 내용 | 상태 | 비고 |
|
||||||
|
|------|----------|------|------|
|
||||||
|
| 단위 테스트 | @Test 어노테이션 기반 테스트 존재 여부 | ☐ 확인 |
|
||||||
|
| 테스트 실행 | mvn test 실행 가능 여부 | ☐ 확인 |
|
||||||
|
| 테스트 커버리지 | 핵심 비즈니스 로직 테스트覆盖率 | ☐ 확인 |
|
||||||
|
| 테스트 격리 | Mock 사용으로 외부 의존성 제거 여부 | ☐ 확인 |
|
||||||
|
|
||||||
|
### 3. CI/CD 검증
|
||||||
|
|
||||||
|
| 항목 | 검증 내용 | 상태 | 비고 |
|
||||||
|
|------|----------|------|------|
|
||||||
|
| 빌드 스크립트 | Maven pom.xml 빌드 설정 완전성 | ☐ 확인 |
|
||||||
|
| CI 파이프라인 | GitHub Actions 또는 유사 CI 설정 파일 존재 | ☐ 확인 |
|
||||||
|
| 정적 분석 | Checkstyle, SpotBugs 등 분석 도구 통합 여부 | ☐ 확인 |
|
||||||
|
| 빌드 Reproducibility | mvn clean package 재현 가능 여부 | ☐ 확인 |
|
||||||
|
|
||||||
|
### 4. 운영 리스크 검증 (Operational Risks)
|
||||||
|
|
||||||
|
| 항목 | 검증 내용 | 상태 | 비고 |
|
||||||
|
|------|----------|------|------|
|
||||||
|
| 보안 취약점 | 의존성 취약점 스캔 (OWASP Dependency Check) | ☐ 확인 |
|
||||||
|
| 에러 처리 | 예외 처리 및 로깅 구현 여부 | ☐ 확인 |
|
||||||
|
| 설정 관리 | 환경별 설정 분리 (dev, staging, prod) | ☐ 확인 |
|
||||||
|
| 롤백 계획 | 배포 실패 시 롤백 절차 문서화 여부 | ☐ 확인 |
|
||||||
|
|
||||||
|
### 5. 코드 품질 검증
|
||||||
|
|
||||||
|
| 항목 | 검증 내용 | 상태 | 비고 |
|
||||||
|
|------|----------|------|------|
|
||||||
|
| 코딩 컨벤션 | Google Java Style Guide 준수 여부 | ☐ 확인 |
|
||||||
|
| 복잡도 | 순환 복잡도 및 메서드 길이 제한 준수 | ☐ 확인 |
|
||||||
|
| 불변성 | Immutable 클래스 사용 여부 | ☐ 확인 |
|
||||||
|
| Null 안전 | Optional, @NonNull 어노테이션 사용 여부 | ☐ 확인 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**검증자**: Reviewer Agent
|
||||||
|
**검증일**: 2026-07-14
|
||||||
|
**프로젝트 버전**: 1.0.0-SNAPSHOT
|
||||||
151
docs/verification/VERIFICATION_SCRIPT.sh
Normal file
151
docs/verification/VERIFICATION_SCRIPT.sh
Normal file
|
|
@ -0,0 +1,151 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# 검증 자동화 스크립트
|
||||||
|
# 프로젝트: runtime-role-reverify-202607140530
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo " 전환 결과 검증 스크립트"
|
||||||
|
echo " 프로젝트: runtime-role-reverify-202607140530"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 색상 정의
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# 카운터
|
||||||
|
PASS=0
|
||||||
|
FAIL=0
|
||||||
|
WARN=0
|
||||||
|
|
||||||
|
# 결과 기록 함수
|
||||||
|
pass() {
|
||||||
|
echo -e "${GREEN}[PASS]${NC} $1"
|
||||||
|
((PASS++))
|
||||||
|
}
|
||||||
|
|
||||||
|
fail() {
|
||||||
|
echo -e "${RED}[FAIL]${NC} $1"
|
||||||
|
((FAIL++))
|
||||||
|
}
|
||||||
|
|
||||||
|
warn() {
|
||||||
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||||
|
((WARN++))
|
||||||
|
}
|
||||||
|
|
||||||
|
info() {
|
||||||
|
echo -e "[INFO] $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo " 1. 산출물 검증"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
# Java 소스 파일 존재 확인
|
||||||
|
if find . -name "*.java" -type f | grep -q .; then
|
||||||
|
JAVA_COUNT=$(find . -name "*.java" -type f | wc -l)
|
||||||
|
pass "Java 소스 파일 발견: $JAVA_COUNT개"
|
||||||
|
else
|
||||||
|
fail "Java 소스 파일 없음"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# pom.xml 존재 확인
|
||||||
|
if [ -f "pom.xml" ]; then
|
||||||
|
pass "pom.xml 존재 확인"
|
||||||
|
else
|
||||||
|
fail "pom.xml 없음"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# application.yml 존재 확인
|
||||||
|
if [ -f "src/main/resources/application.yml" ]; then
|
||||||
|
pass "application.yml 존재 확인"
|
||||||
|
else
|
||||||
|
warn "application.yml 없음 (선택적)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " 2. 테스트 검증"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
# 테스트 파일 존재 확인
|
||||||
|
if find . -name "*Test.java" -type f | grep -q .; then
|
||||||
|
TEST_COUNT=$(find . -name "*Test.java" -type f | wc -l)
|
||||||
|
pass "테스트 파일 발견: $TEST_COUNT개"
|
||||||
|
else
|
||||||
|
warn "테스트 파일 없음"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Maven 테스트 실행
|
||||||
|
echo "Maven 테스트 실행 중..."
|
||||||
|
if mvn test -q -DskipTests=false > /dev/null 2>&1; then
|
||||||
|
pass "Maven 테스트 성공"
|
||||||
|
else
|
||||||
|
fail "Maven 테스트 실패"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " 3. CI/CD 검증"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
# GitHub Actions 워크플로우 확인
|
||||||
|
if [ -d ".github/workflows" ]; then
|
||||||
|
WORKFLOW_COUNT=$(find .github/workflows -name "*.yml" -o -name "*.yaml" | wc -l)
|
||||||
|
pass "GitHub Actions 워크플로우 발견: $WORKFLOW_COUNT개"
|
||||||
|
else
|
||||||
|
warn "GitHub Actions 워크플로우 없음"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Maven 빌드 검증
|
||||||
|
if mvn clean package -DskipTests -q > /dev/null 2>&1; then
|
||||||
|
pass "Maven 빌드 성공"
|
||||||
|
if [ -f "target/*.jar" ]; then
|
||||||
|
JAR_COUNT=$(find target -name "*.jar" | wc -l)
|
||||||
|
pass "산출 JAR 파일: $JAR_COUNT개"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
fail "Maven 빌드 실패"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " 4. 운영 리스크 검증"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
# Java 버전 확인
|
||||||
|
JAVA_VERSION=$(java -version 2>&1 | head -1 | cut -d'"' -f2)
|
||||||
|
if [[ "$JAVA_VERSION" == 17* ]] || [[ "$JAVA_VERSION" == 21* ]] || [[ "$JAVA_VERSION" == 11* ]]; then
|
||||||
|
pass "Java 버전 (LTS): $JAVA_VERSION"
|
||||||
|
else
|
||||||
|
warn "Java 버전 확인 필요: $JAVA_VERSION"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Spring Boot 버전 확인 (pom.xml에서)
|
||||||
|
if grep -q "spring-boot-starter-parent" pom.xml; then
|
||||||
|
SB_VERSION=$(grep -A1 "spring-boot-starter-parent" pom.xml | grep "<version>" | sed 's/.*<version>\([^<]*\)<\/version>.*/\1/')
|
||||||
|
pass "Spring Boot 버전: $SB_VERSION"
|
||||||
|
else
|
||||||
|
warn "Spring Boot parent 없음"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " 검증 결과 요약"
|
||||||
|
echo "=========================================="
|
||||||
|
echo -e "${GREEN}통과: $PASS${NC}"
|
||||||
|
echo -e "${RED}실패: $FAIL${NC}"
|
||||||
|
echo -e "${YELLOW}경고: $WARN${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ $FAIL -eq 0 ]; then
|
||||||
|
echo -e "${GREEN}최종 판정: 승인${NC}"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo -e "${RED}최종 판정: 보류 (수정 필요)${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
18
docs/verification/run_verification.sh
Normal file
18
docs/verification/run_verification.sh
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# 검증 실행 스크립트 (단일 명령어)
|
||||||
|
# 프로젝트: runtime-role-reverify-202607140530
|
||||||
|
|
||||||
|
cd "$(dirname "$0")/../.." 2>/dev/null || cd .
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo " 전환 결과 검증 실행"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 검증 체크리스트 실행
|
||||||
|
if [ -f "docs/verification/VERIFICATION_SCRIPT.sh" ]; then
|
||||||
|
bash docs/verification/VERIFICATION_SCRIPT.sh
|
||||||
|
else
|
||||||
|
echo "[ERROR] 검증 스크립트를 찾을 수 없습니다."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
Loading…
Add table
Add a link
Reference in a new issue