#!/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 "$@"