
当您在 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 报告。
在 <properties> 块中,定义 JaCoCo .exec 文件和 XML 报告的路径,以及 Surefire 报告的路径。这将有助于保持配置的一致性。
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- JaCoCo .exec 文件路径,用于存储运行时覆盖率数据 -->
<jacoco.exec.file>${project.build.directory}/jacoco.exec</jacoco.exec.file>
<!-- JaCoCo XML 报告输出目录 -->
<jacoco.report.dir>${project.build.directory}/jacoco_report</jacoco.report.dir>
<!-- SonarQube 相关的报告路径配置 -->
<sonar.surefire.reportsPath>${project.build.directory}/surefire-reports</sonar.surefire.reportsPath>
<sonar.coverage.jacoco.xmlReportPaths>${jacoco.report.dir}/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
</properties>Surefire 插件负责运行单元测试。它需要使用 JaCoCo 代理来收集覆盖率数据。这通过 <argLine> 配置实现,该配置会从 JaCoCo 的 prepare-agent 目标中获取 JVM 参数。
<build>
<plugins>
<!-- Maven Surefire Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version> <!-- 建议使用较新且稳定的版本 -->
<configuration>
<!-- 关键:使用 JaCoCo prepare-agent 目标设置的 JVM 参数 -->
<argLine>${surefireArgLine}</argLine>
<!-- Surefire 报告输出目录 -->
<reportsDirectory>${sonar.surefire.reportsPath}</reportsDirectory>
</configuration>
</plugin>
<!-- ... 其他插件 ... -->
</plugins>
</build>JaCoCo 插件有两个主要目标需要配置:prepare-agent 和 report。
<build>
<plugins>
<!-- ... Surefire 插件配置 ... -->
<!-- JaCoCo Maven Plugin -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version> <!-- 确保版本与 SonarQube 兼容,或使用最新稳定版 -->
<executions>
<!-- 1. prepare-agent 目标:在测试运行前准备 JaCoCo 代理 -->
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<!-- 指定 .exec 文件的生成路径 -->
<destFile>${jacoco.exec.file}</destFile>
<!-- 定义一个属性,用于 Surefire 插件的 argLine -->
<propertyName>surefireArgLine</propertyName>
</configuration>
</execution>
<!-- 2. report 目标:在测试运行后生成 XML 报告 -->
<execution>
<id>report</id>
<phase>post-unit-test</phase> <!-- 确保在单元测试完成后执行 -->
<goals>
<goal>report</goal>
</goals>
<configuration>
<!-- 指定输入 .exec 文件,即 prepare-agent 生成的文件 -->
<dataFile>${jacoco.exec.file}</dataFile>
<!-- 指定 XML 报告的输出目录 -->
<outputDirectory>${jacoco.report.dir}</outputDirectory>
<!-- 明确指定生成 XML 格式报告 -->
<formats>
<format>XML</format>
</formats>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>在 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 中 <sonar.coverage.jacoco.xmlReportPaths> 的值
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 报告路径
}
}
}
}
}以上就是解决 SonarQube 中 JaCoCo 代码覆盖率显示为 0% 的问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号