전환 결과 검증 체크리스트 재검증 #3
1 changed files with 514 additions and 0 deletions
514
VERIFICATION_SCRIPT.sh
Normal file
514
VERIFICATION_SCRIPT.sh
Normal file
|
|
@ -0,0 +1,514 @@
|
||||||
|
#!/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 "$@"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue