e,确保 JaCoCo 数据生成、XML 报告输出以及 SonarQube 正确读取。当您在 Jenkins Pipeline 中为 Spring Boot 应用执行 JUnit 测试并通过 SonarQube 进行代码质量分析时,可能会遇到 SonarQube 中代码覆盖率始终显示为 0% 的情况。这通常伴随着 JaCoCo 插件在构建日志中发出类似 Skipping JaCoCo execution due to missing execution data file 的警告。
此问题的根本原因在于 JaCoCo Maven 插件、Maven Surefire 插件以及 SonarQube 配置之间存在不一致。具体来说,主要有以下几点:
为了解决这些问题,我们需要确保 JaCoCo、Surefire 和 SonarQube 之间的配置保持高度一致性。
pom.xml 是配置 JaCoCo 和 Surefire 插件的关键。以下是推荐的配置方式,确保 JaCoCo 代理正确注入测试 JVM,并生成 SonarQube 可识别的 XML 报告。
在
1.8 UTF-8 ${project.build.directory}/jacoco.exec ${project.build.directory}/jacoco_report ${project.build.directory}/surefire-reports ${jacoco.report.dir}/jacoco.xml
Surefire 插件负责运行单元测试。它需要使用 JaCoCo 代理来收集覆盖率数据。这通过 配置实现,该配置会从 JaCoCo 的 prepare-agent 目标中获取 JVM 参数。
org.apache.maven.plugins maven-surefire-plugin2.22.2 ${surefireArgLine} ${sonar.surefire.reportsPath}
JaCoCo 插件有两个主要目标需要配置:prepare-agent 和 report。
org.jacoco jacoco-maven-plugin0.8.6 prepare-agent prepare-agent ${jacoco.exec.file} surefireArgLine report post-unit-test report ${jacoco.exec.file} ${jacoco.report.dir} XML
在 Jenkins Pipeline 中,您需要执行 Maven 命令来构建、测试并触发 SonarQube 分析。关键在于确保 mvn sonar:sonar 命令能够正确地找到 JaCoCo 生成的 XML 报告。
pipeline {
agent any
stages {
stage('Build and Test') {
steps {
script {
// 清理、编译、运行测试并生成 JaCoCo .exec 数据和 XML 报告。
// 'verify' 阶段会包含 'test' 阶段和 'post-unit-test' 阶段(JaCoCo report 目标绑定在此)。
// 确保所有测试都运行,并且 JaCoCo 报告被生成。
sh 'mvn clean verify'
}
}
}
stage('SonarQube Analysis') {
steps {
script {
// 确保此处的报告路径与 pom.xml 中 JaCoCo 插件实际生成 XML 报告的路径一致。
// 对应 pom.xml 中 的值
def jacocoXmlReportPath = "target/jacoco_report/jacoco.xml"
sh "mvn sonar:sonar " +
"-Dsonar.projectKey=your_project_key " + // 替换为您的 SonarQube 项目 Key
"-Dsonar.sources=src/main/java " +
"-Dsonar.java.binaries=target/classes " + // 明确指定 Java 字节码目录
"-Dsonar.host.url=http://192.168.2.2:9000/ " + // 您的 SonarQube 服务器地址
"-Dsonar.login=admin " + // SonarQube 认证令牌或用户名
"-Dsonar.password=sonar " + // SonarQube 认证密码 (生产环境建议使用令牌)
"-Dsonar.coverage.jacoco.xmlReportPaths=${jacocoXmlReportPath}" // 关键:指定 JaCoCo XML 报告路径
}
}
}
}
}