Jenkins SonarQube插件多模块代码覆盖率未显示

时间:2018-07-13 19:14:58

标签: maven jenkins sonarqube jenkins-plugins sonarqube-scan

因此,我们有一个基于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>

主要ApplicationModule 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 个答案:

答案 0 :(得分:0)

您有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。我将其设置为相同的值,因此可以在同一链接下访问您的项目。