Jenkins SonarQube 插件多模块代码覆盖率不显示
Posted
技术标签:
【中文标题】Jenkins SonarQube 插件多模块代码覆盖率不显示【英文标题】:Jenkins SonarQube plugin Multi Module Code Coverage Not Displaying 【发布时间】:2018-12-22 05:06:05 【问题描述】:所以我们有一个基于 Spring Boot maven 的项目,我们将其拆分为多个模块,这些模块在单元测试和 Jenkins 中都可以正常工作,但在 Sonar 中根本没有显示覆盖范围。
这是我们应用程序的结构:
ApplicationRoot
-SharedCommonModule
--main
---java
-----com...(SomeModule.java)
--test
----com....(SomeModuleTest.java)
-ApplicationModule
--main
---java
-----com...(Application.java)
--test
----com....(ApplicationTest.java)
父pom文件配置:
<properties>
<!-- Sonar -->
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.jacoco.reportPath>$project.basedir/../target/jacoco.exec</sonar.jacoco.reportPath>
<sonar.language>java</sonar.language>
<jacoco.destFile>$sonar.jacoco.reportPath</jacoco.destFile>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.5.201505241946</version>
<configuration>
<destFile>$sonar.jacoco.reportPath</destFile>
<append>true</append>
</configuration>
<executions>
<execution>
<id>agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
SharedCommonModule pom:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
主应用模块 pom 文件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.org.Application</mainClass>
</configuration>
</plugin>
</plugins>
</build>
Jenkins SonarQube 插件配置:
sonar.projectKey=com.Application
sonar.projectName=ApplicationModule
sonar.projectVersion=1.0.0.$BUILD_NUMBER
sonar.sources=src/main
sonar.tests=src/test
sonar.java.binaries=target/classes
sonar.jacoco.reportPaths=target/jacoco.exec
sonar.modules=ApplicationModule,SharedCommonModule
ApplicationModule.sonar.projectName=ApplicationModule
SharedCommonModule.sonar.projectName=SharedCommonModule
我们已经研究并尝试从多个示例中将其组合在一起,但似乎没有任何效果 - 我们得到的最接近的是,Sonar 显示一些覆盖率,而某些类会显示 0% 覆盖率,即使我们肯定知道我们有使用这些类的 UT(通过 IntelliJ 测试)。
因此,如果没有上面添加的properties
和build
xml 部分,我们会得到部分覆盖,仅适用于ApplicaitonModule,我认为所有报告的未覆盖类都属于SharedCommonModule
编辑:我想澄清一下,组合的 jacoco.exec 文件在 IntelliJ Coverage 工具中加载时确实显示了类的覆盖率,但 Sonar 在其报告中没有显示相同类的覆盖率(仅在我删除时生成父 pom 中的 build
和 properties
xml 元素)。
请帮忙:)
【问题讨论】:
【参考方案1】:您有 Maven 项目,因此您应该开始使用 Sonar Scanner for Maven。 它足够聪明,可以为您生成所有参数。
如果你删除:
<sonar.jacoco.reportPath>$project.basedir/../target/jacoco.exec</sonar.jacoco.reportPath>
<jacoco.destFile>$sonar.jacoco.reportPath</jacoco.destFile>
<destFile>$sonar.jacoco.reportPath</destFile>
Jenkins SonarQube 插件配置
添加到父 pom 文件:
<name>ApplicationModule</name>
<properties>
<sonar.sources>src/main</sonar.sources>
<sonar.tests>src/test</sonar.tests>
<sonar.projectKey>com.Application</sonar.projectKey>
</properties>
添加到 SharedCommonModule pom 文件:
<name>SharedCommonModule</name>
添加到 ApplicationModule.pom 文件:
<name>ApplicationModule</name>
最后执行:
mvn sonar:sonar -Dsonar.projectVersion="1.0.0.$BUILD_NUMBER"
之后,您应该会看到缺失的覆盖率数据。
顺便说一句。不建议为 Maven 项目设置 sonar.projectKey
。我将其设置为相同的值,因此您的项目将可以通过相同的链接访问。
【讨论】:
以上是关于Jenkins SonarQube 插件多模块代码覆盖率不显示的主要内容,如果未能解决你的问题,请参考以下文章
gradle、sonarqube 和 jacoco 插件的哪些版本兼容