#!/usr/bin/env bash # ============================================================================= # 테스트 공통 스크립트 # Jenkins Stage 3: Test에서 호출 # 사용: test.sh [unit|sonar|all] # ============================================================================= set -euo pipefail TEST_TYPE="${1:-unit}" BUILD_TOOL="${BUILD_TOOL:-auto}" APP_VERSION="${APP_VERSION:-dev-0}" WORKSPACE="${WORKSPACE:-.}" LOG_DIR="${WORKSPACE}/build-logs" TEST_LOG="${LOG_DIR}/test-$(date +%Y%m%d-%H%M%S).log" GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[1;33m'; NC='\033[0m' log() { echo -e "${GREEN}[TEST]${NC} $*" | tee -a "${TEST_LOG}"; } err() { echo -e "${RED}[ERROR]${NC} $*" | tee -a "${TEST_LOG}"; } mkdir -p "${LOG_DIR}" # ── 빌드 도구 자동 감지 ────────────────────────────────────────────────────── detect_build_tool() { [[ "${BUILD_TOOL}" != "auto" ]] && return if [[ -f "${WORKSPACE}/pom.xml" ]]; then BUILD_TOOL="maven" elif [[ -f "${WORKSPACE}/build.gradle" ]]; then BUILD_TOOL="gradle" elif [[ -f "${WORKSPACE}/package.json" ]]; then BUILD_TOOL="npm" else err "빌드 파일을 찾을 수 없습니다"; exit 1; fi log "빌드 도구: ${BUILD_TOOL}" } # ── 단위 테스트 ─────────────────────────────────────────────────────────────── run_unit_tests() { log "단위 테스트 실행..." cd "${WORKSPACE}" case "${BUILD_TOOL}" in maven) MVN_CMD="mvn"; [[ -f "./mvnw" ]] && MVN_CMD="./mvnw" ${MVN_CMD} test \ --batch-mode --no-transfer-progress \ -Dapp.version="${APP_VERSION}" \ 2>&1 | tee -a "${TEST_LOG}" ;; gradle) GRADLE_CMD="gradle"; [[ -f "./gradlew" ]] && GRADLE_CMD="./gradlew" ${GRADLE_CMD} test \ -Pversion="${APP_VERSION}" \ --no-daemon \ 2>&1 | tee -a "${TEST_LOG}" ;; npm) npm test -- --coverage --watchAll=false 2>&1 | tee -a "${TEST_LOG}" ;; esac log "단위 테스트 완료" } # ── SonarQube 분석 ──────────────────────────────────────────────────────────── run_sonar() { log "SonarQube 분석 실행..." cd "${WORKSPACE}" case "${BUILD_TOOL}" in maven) MVN_CMD="mvn"; [[ -f "./mvnw" ]] && MVN_CMD="./mvnw" ${MVN_CMD} sonar:sonar \ -Dsonar.projectVersion="${APP_VERSION}" \ --batch-mode --no-transfer-progress \ 2>&1 | tee -a "${TEST_LOG}" ;; gradle) GRADLE_CMD="gradle"; [[ -f "./gradlew" ]] && GRADLE_CMD="./gradlew" ${GRADLE_CMD} sonar \ -Dsonar.projectVersion="${APP_VERSION}" \ --no-daemon \ 2>&1 | tee -a "${TEST_LOG}" ;; npm) if [[ -f "sonar-project.properties" ]]; then sonar-scanner \ -Dsonar.projectVersion="${APP_VERSION}" \ 2>&1 | tee -a "${TEST_LOG}" else log "SonarQube 설정 파일 없음 (sonar-project.properties) — 건너뜀" fi ;; esac log "SonarQube 분석 완료" } # ── 메인 ───────────────────────────────────────────────────────────────────── main() { log "=== 테스트 시작: ${TEST_TYPE} ===" detect_build_tool case "${TEST_TYPE}" in unit) run_unit_tests ;; sonar) run_sonar ;; all) run_unit_tests; run_sonar ;; *) err "알 수 없는 테스트 유형: ${TEST_TYPE}"; exit 1 ;; esac log "=== 테스트 완료 ===" } main "$@"