diff --git a/verification/smoke-test.sh b/verification/smoke-test.sh new file mode 100644 index 0000000..fb42aa5 --- /dev/null +++ b/verification/smoke-test.sh @@ -0,0 +1,282 @@ +#!/bin/bash +# Runtime Role Matrix Live - Smoke Test Script +# 이 스크립트는 변경 사항의 기본 검증을 수행합니다 + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +REPORT_FILE="$SCRIPT_DIR/smoke-test-report.json" + +# 색상 정의 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 테스트 결과 배열 +declare -a TEST_RESULTS + +log_info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +record_result() { + local test_name="$1" + local status="$2" + local message="$3" + TEST_RESULTS+=("{\"test\": \"$test_name\", \"status\": \"$status\", \"message\": \"$message\"}") +} + +# 1. 프로젝트 구조 확인 +test_project_structure() { + log_info "프로젝트 구조 확인 중..." + + if [ -f "$PROJECT_ROOT/pom.xml" ] || [ -f "$PROJECT_ROOT/build.gradle" ]; then + log_info "빌드 파일 발견" + record_result "project_structure" "PASS" "빌드 파일 존재 확인" + return 0 + else + log_error "빌드 파일을 찾을 수 없습니다" + record_result "project_structure" "FAIL" "빌드 파일 부재" + return 1 + fi +} + +# 2. 변경 파일 확인 +test_changed_files() { + log_info "변경 파일 확인 중..." + + cd "$PROJECT_ROOT" + + if git rev-parse --git-dir > /dev/null 2>&1; then + local changed_files=$(git diff --name-only HEAD~1 2>/dev/null || echo "") + if [ -n "$changed_files" ]; then + log_info "변경된 파일 목록:" + echo "$changed_files" | while read -r file; do + echo " - $file" + done + echo "$changed_files" > "$SCRIPT_DIR/changed-files.txt" + record_result "changed_files" "PASS" "$(echo "$changed_files" | wc -l)개 파일 변경됨" + else + log_warn "변경된 파일이 없습니다" + record_result "changed_files" "WARN" "변경된 파일 없음" + fi + else + log_warn "Git 저장소가 아닙니다" + record_result "changed_files" "SKIP" "Git 저장소 아님" + fi +} + +# 3. 소스 코드 컴파일 확인 +test_compilation() { + log_info "소스 코드 컴파일 확인 중..." + + cd "$PROJECT_ROOT" + + if [ -f "pom.xml" ]; then + if mvn compile -q -DskipTests 2>&1; then + log_info "Maven 컴파일 성공" + record_result "compilation" "PASS" "Maven 컴파일 성공" + return 0 + else + log_error "Maven 컴파일 실패" + record_result "compilation" "FAIL" "Maven 컴파일 실패" + return 1 + fi + elif [ -f "build.gradle" ]; then + if ./gradlew compileJava -q 2>&1; then + log_info "Gradle 컴파일 성공" + record_result "compilation" "PASS" "Gradle 컴파일 성공" + return 0 + else + log_error "Gradle 컴파일 실패" + record_result "compilation" "FAIL" "Gradle 컴파일 실패" + return 1 + fi + else + log_warn "빌드 파일이 없습니다" + record_result "compilation" "SKIP" "빌드 파일 부재" + fi +} + +# 4. 단위 테스트 실행 +test_unit_tests() { + log_info "단위 테스트 실행 중..." + + cd "$PROJECT_ROOT" + + if [ -f "pom.xml" ]; then + if mvn test -q 2>&1; then + log_info "단위 테스트 성공" + record_result "unit_tests" "PASS" "모든 단위 테스트 통과" + return 0 + else + log_error "단위 테스트 실패" + record_result "unit_tests" "FAIL" "단위 테스트 실패" + return 1 + fi + elif [ -f "build.gradle" ]; then + if ./gradlew test -q 2>&1; then + log_info "단위 테스트 성공" + record_result "unit_tests" "PASS" "모든 단위 테스트 통과" + return 0 + else + log_error "단위 테스트 실패" + record_result "unit_tests" "FAIL" "단위 테스트 실패" + return 1 + fi + else + log_warn "테스트 실행 불가" + record_result "unit_tests" "SKIP" "빌드 파일 부재" + fi +} + +# 5. CI 설정 파일 확인 +test_ci_config() { + log_info "CI 설정 파일 확인 중..." + + local ci_found=false + + if [ -d "$PROJECT_ROOT/.github/workflows" ]; then + log_info "GitHub Actions 설정 발견" + ci_found=true + fi + + if [ -f "$PROJECT_ROOT/Jenkinsfile" ]; then + log_info "Jenkins 설정 발견" + ci_found=true + fi + + if [ -f "$PROJECT_ROOT/.gitlab-ci.yml" ]; then + log_info "GitLab CI 설정 발견" + ci_found=true + fi + + if $ci_found; then + record_result "ci_config" "PASS" "CI 설정 파일 확인됨" + return 0 + else + log_warn "CI 설정 파일을 찾을 수 없습니다" + record_result "ci_config" "WARN" "CI 설정 파일 부재" + return 0 + fi +} + +# 6. 보안 설정 확인 +test_security_config() { + log_info "보안 설정 확인 중..." + + local security_issues=0 + + # 시크릿 관리 파일 확인 + if [ -f "$PROJECT_ROOT/.env" ]; then + log_warn ".env 파일이 버전 관리에 포함되어 있습니다" + ((security_issues++)) + fi + + # 민감 정보 패턴 확인 + if grep -r -l "password\s*=" "$PROJECT_ROOT/src" 2>/dev/null | grep -v ".class" > /dev/null; then + log_warn "소스 코드에 비밀번호 하드코딩 의심 발견" + ((security_issues++)) + fi + + if [ $security_issues -eq 0 ]; then + log_info "기본 보안 검사 통과" + record_result "security" "PASS" "보안 검사 통과" + return 0 + else + log_warn "보안 이슈 $security_issues건 발견" + record_result "security" "WARN" "보안 이슈 $security_issues건" + return 0 + fi +} + +# 7. 문서 확인 +test_documentation() { + log_info "문서 확인 중..." + + local docs_found=false + + for doc in README.md CONTRIBUTING.md CHANGELOG.md; do + if [ -f "$PROJECT_ROOT/$doc" ]; then + log_info "$doc 발견" + docs_found=true + fi + done + + if $docs_found; then + record_result "documentation" "PASS" "필수 문서 존재" + return 0 + else + log_warn "필수 문서가 부족합니다" + record_result "documentation" "WARN" "문서 부족" + return 0 + fi +} + +# 8. JSON 보고서 생성 +generate_report() { + log_info "보고서 생성 중..." + + local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ") + local results_json=$(IFS=,; echo "[${TEST_RESULTS[*]}]") + + cat > "$REPORT_FILE" << EOF +{ + "report": { + "project": "runtime-role-matrix-live", + "timestamp": "$timestamp", + "smoke_test_version": "1.0.0" + }, + "results": $results_json, + "summary": { + "total": ${#TEST_RESULTS[@]}, + "passed": $(echo "$results_json" | grep -o '"PASS"' | wc -l), + "failed": $(echo "$results_json" | grep -o '"FAIL"' | wc -l), + "warned": $(echo "$results_json" | grep -o '"WARN"' | wc -l), + "skipped": $(echo "$results_json" | grep -o '"SKIP"' | wc -l) + } +} +EOF + + log_info "보고서 저장 완료: $REPORT_FILE" +} + +# 메인 실행 +main() { + log_info "==========================================" + log_info "Runtime Role Matrix Live - Smoke Test" + log_info "==========================================" + + mkdir -p "$SCRIPT_DIR" + + test_project_structure + test_changed_files + test_compilation + test_unit_tests + test_ci_config + test_security_config + test_documentation + + generate_report + + log_info "==========================================" + log_info "Smoke Test 완료" + log_info "==========================================" + + # 결과 요약 출력 + echo "" + echo "결과 요약:" + cat "$REPORT_FILE" | grep -A 10 '"summary"' +} + +main "$@"