be40973aa3
- Jenkinsfile.sonar: 분석 전용 파이프라인 (컴파일 JDK8 / 스캐너 JDK17 분리, Quality Gate 실패는 UNSTABLE 처리, 토큰은 환경변수로만 전달) - sonar-project.properties: 분석 대상/제외 규칙, Java 8 소스 설정 - ci/sonar-classpath.gradle: build.gradle 무수정으로 sonar.java.libraries 덤프 (타입 해석용 컴파일 클래스패스가 없으면 보안 룰 다수가 동작하지 않음) - .gitignore: .scannerwork/ 제외 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
42 lines
1.7 KiB
Groovy
42 lines
1.7 KiB
Groovy
// SonarScanner 의 sonar.java.libraries / sonar.java.test.libraries 로 넘길
|
|
// 컴파일 클래스패스를 파일로 덤프한다.
|
|
//
|
|
// build.gradle 을 건드리지 않기 위해 init script(-I) 로만 주입한다.
|
|
// gradle -I ci/sonar-classpath.gradle exportSonarClasspath --no-daemon
|
|
//
|
|
// 출력(콤마 구분, 절대경로):
|
|
// build/sonar/java-libraries.txt main 컴파일 클래스패스
|
|
// build/sonar/java-test-libraries.txt main + test 컴파일 클래스패스
|
|
//
|
|
// 이 파일이 없으면 Sonar Java 분석기가 타입을 해석하지 못해
|
|
// 보안 룰(SQL Injection, XSS 등) 상당수가 침묵한다. 선택 사항이 아니다.
|
|
|
|
rootProject { project ->
|
|
project.plugins.withId('java') {
|
|
project.tasks.register('exportSonarClasspath') {
|
|
group = 'verification'
|
|
description = 'SonarScanner 용 컴파일 클래스패스를 build/sonar 에 덤프한다'
|
|
|
|
doLast {
|
|
def outDir = new File(project.layout.buildDirectory.get().asFile, 'sonar')
|
|
outDir.mkdirs()
|
|
|
|
def toLine = { files ->
|
|
files.findAll { it.exists() }
|
|
.collect { it.absolutePath }
|
|
.unique()
|
|
.join(',')
|
|
}
|
|
|
|
def mainCp = project.sourceSets.main.compileClasspath.files
|
|
def testCp = project.sourceSets.test.compileClasspath.files
|
|
|
|
new File(outDir, 'java-libraries.txt').text = toLine(mainCp)
|
|
new File(outDir, 'java-test-libraries.txt').text = toLine(mainCp + testCp)
|
|
|
|
logger.lifecycle("sonar classpath dumped: ${outDir}")
|
|
}
|
|
}
|
|
}
|
|
}
|