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 测试)。 因此,如果没有上面添加的propertiesbuild xml 部分,我们会得到部分覆盖,仅适用于ApplicaitonModule,我认为所有报告的未覆盖类都属于SharedCommonModule

编辑:我想澄清一下,组合的 jacoco.exec 文件在 IntelliJ Coverage 工具中加载时确实显示了类的覆盖率,但 Sonar 在其报告中没有显示相同类的覆盖率(仅在我删除时生成父 pom 中的 buildproperties xml 元素)。

请帮忙:)

【问题讨论】:

【参考方案1】:

您有 Maven 项目,因此您应该开始使用 Sonar Scanner for Maven。 它足够聪明,可以为您生成所有参数。

如果你删除:

<sonar.jacoco.reportPath>$project.basedir/../target/jacoco.exec</sonar.jacoco.reportPath> &lt;jacoco.destFile&gt;$sonar.jacoco.reportPath&lt;/jacoco.destFile&gt; &lt;destFile&gt;$sonar.jacoco.reportPath&lt;/destFile&gt; 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 插件多模块代码覆盖率不显示的主要内容,如果未能解决你的问题,请参考以下文章

jenkins集成sonarqube代码审核

gradle、sonarqube 和 jacoco 插件的哪些版本兼容

30-Jenkins-集成SonarQube检测代码质量

利用Jenkins和SonarQube集成对代码进行持续检测

Jenkins+SonarQube代码审查

jenkins与SonarQube集成