From 0b6ee10439c34eef14938b769c81ba7b24ff30b8 Mon Sep 17 00:00:00 2001 From: Rinjae Date: Thu, 13 Aug 2026 15:35:12 +0900 Subject: [PATCH] =?UTF-8?q?Jenkinsfile.sonar:=20SonarQube=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=9D=B4=EB=A6=84=20=EB=B3=B4=EC=A0=95=20=EB=B0=8F?= =?UTF-8?q?=20=EC=8A=A4=EC=BA=90=EB=84=88=20=ED=83=90=EC=83=89=20=ED=8F=B4?= =?UTF-8?q?=EB=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SONAR_ENV_NAME 을 실제 등록명 SonarQube-Community 로 수정 - 스캐너 툴 이름 미지정 시 후보 이름 탐색 후 PATH 의 sonar-scanner 폴백 - 스캐너를 못 찾으면 원인이 드러나는 메시지와 함께 실패 Co-Authored-By: Claude Opus 5 (1M context) --- Jenkinsfile.sonar | 48 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/Jenkinsfile.sonar b/Jenkinsfile.sonar index 37a0178..2c7a2a5 100644 --- a/Jenkinsfile.sonar +++ b/Jenkinsfile.sonar @@ -2,7 +2,8 @@ // // 전제 (Jenkins 쪽 설정 이름이 다르면 environment 블록의 SONAR_* 만 고치면 된다) // 1) Manage Jenkins > System > SonarQube servers 에 서버 등록 (이름: SONAR_ENV_NAME) -// 2) Manage Jenkins > Tools > SonarQube Scanner 에 스캐너 등록 (이름: SONAR_SCANNER_TOOL) +// 2) Manage Jenkins > Tools > SonarQube Scanner 에 스캐너 등록 +// (SONAR_SCANNER_TOOL 이 비어 있으면 흔한 이름을 탐색하고, 없으면 PATH 의 sonar-scanner 사용) // 3) Quality Gate 대기를 쓰려면 SonarQube 서버에 // Administration > Configuration > Webhooks 에 /sonarqube-webhook/ 등록 // 4) Job 의 Git 설정에서 shallow clone 을 끄고 tags/history 를 받아와야 blame 기반 "새 코드" 판정이 정확하다. @@ -32,8 +33,11 @@ pipeline { environment { // --- Jenkins 설정 이름 (환경에 맞게 수정) --- - SONAR_ENV_NAME = 'SonarQube' - SONAR_SCANNER_TOOL = 'SonarScanner' + // Manage Jenkins > System > SonarQube servers 의 Name + SONAR_ENV_NAME = 'SonarQube-Community' + // Manage Jenkins > Tools > SonarQube Scanner 에 등록한 이름. + // 비워두면 아래 후보 이름들을 순서대로 탐색하고, 그래도 없으면 PATH 의 sonar-scanner 를 쓴다. + SONAR_SCANNER_TOOL = '' // --- 툴체인 --- JAVA_HOME = '/apps/opts/jdk8' // gradle 컴파일용 (프로젝트는 Java 8) @@ -142,11 +146,29 @@ pipeline { stage('SonarQube analysis') { steps { script { - def scannerHome = tool name: env.SONAR_SCANNER_TOOL, - type: 'hudson.plugins.sonar.SonarRunnerInstallation' + // 스캐너 위치 결정: 지정 이름 > 흔한 등록 이름 후보 > PATH 의 sonar-scanner + def candidates = env.SONAR_SCANNER_TOOL?.trim() + ? [env.SONAR_SCANNER_TOOL.trim()] + : ['SonarScanner', 'SonarQube Scanner', 'sonar-scanner', 'SonarScanner CLI', 'sonarqube-scanner'] + + def scannerHome = null + for (name in candidates) { + try { + scannerHome = tool name: name, type: 'hudson.plugins.sonar.SonarRunnerInstallation' + echo "SonarScanner tool: '${name}' -> ${scannerHome}" + break + } catch (ignored) { + // 등록되지 않은 이름은 건너뛴다 + } + } + + if (scannerHome == null) { + echo 'Jenkins Tools 에 등록된 SonarQube Scanner 를 찾지 못했다. PATH 의 sonar-scanner 로 진행한다.' + echo '(Manage Jenkins > Tools 에 등록한 뒤 environment 의 SONAR_SCANNER_TOOL 에 그 이름을 넣으면 확실하다.)' + } withSonarQubeEnv(env.SONAR_ENV_NAME) { - withEnv(["SONAR_SCANNER_HOME=${scannerHome}"]) { + withEnv(["SONAR_SCANNER_HOME=${scannerHome ?: ''}"]) { sh ''' set -eu @@ -177,7 +199,19 @@ pipeline { JUNIT_ARG="-Dsonar.junit.reportPaths=build/test-results/test" fi - "$SONAR_SCANNER_HOME/bin/sonar-scanner" \ + # Tools 에 등록된 스캐너가 없으면 PATH 에서 찾는다 + if [ -n "${SONAR_SCANNER_HOME:-}" ] && [ -x "$SONAR_SCANNER_HOME/bin/sonar-scanner" ]; then + SCANNER="$SONAR_SCANNER_HOME/bin/sonar-scanner" + elif command -v sonar-scanner >/dev/null 2>&1; then + SCANNER="$(command -v sonar-scanner)" + else + echo "sonar-scanner 실행 파일을 찾지 못했다." + echo "Manage Jenkins > Tools > SonarQube Scanner 에 등록하거나 노드 PATH 에 설치할 것." + exit 1 + fi + echo "scanner: $SCANNER" + + "$SCANNER" \ -Dsonar.projectVersion="${BUILD_NUMBER}" \ -Dsonar.java.libraries="$LIBS" \ -Dsonar.java.test.libraries="$TEST_LIBS" \