我正在收听声纳获取jacoco分析报告的问题。然而,詹金斯能够拿起报告并显示结果。 我的项目是由詹金斯建造的maven构建。 jacoco报告由maven生成(在pom中配置)。声纳是使用Jenkins插件执行的。
这是我在SonarQube上看到的:
这是我在詹金斯看到的项目报告。
maven插件配置:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.6.4.201312101107</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>default-check</id>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
Jenkins Sonar插件配置
答案 0 :(得分:58)
您缺少一些重要的声纳属性,以下是我的一个构建中的示例:
sonar.jdbc.dialect=mssql
sonar.projectKey=projectname
sonar.projectName=Project Name
sonar.projectVersion=1.0
sonar.sources=src
sonar.language=java
sonar.binaries=build/classes
sonar.tests=junit
sonar.dynamicAnalysis=reuseReports
sonar.junit.reportsPath=build/test-reports
sonar.java.coveragePlugin=jacoco
sonar.jacoco.reportPath=build/test-reports/jacoco.exec
Jenkins控制台输出中的错误对于使代码覆盖率起作用非常有用。
项目范围设置为0%,因为没有包含类的目录。
表示您尚未正确设置Sonar.Binaries属性
没有关于每次测试的覆盖率的信息
表示您没有正确设置Sonar.Tests属性
未收集覆盖范围信息。也许您忘记将调试信息包含在已编译的类中?表示sonar.binaries属性设置正确,但这些文件未在调试模式下编译,它们必须是
答案 1 :(得分:13)
基于https://github.com/SonarSource/sonar-examples/blob/master/projects/tycho/pom.xml,以下POM适用于我:
<properties>
<sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.0.201403182114</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
<configuration>
<destFile>${sonar.jacoco.reportPath}</destFile>
</configuration>
</plugin>
</plugins>
</build>
reuseReports
设置可防止在读取之前删除JaCoCo报告文件! (自4.3以来,this is the default并且已弃用。)然后我就跑了
mvn clean install
mvn sonar:sonar
答案 2 :(得分:5)
我有类似的问题,0.0%覆盖范围&amp;使用SonarQube 6.7.2的Sonar仪表板上没有任何单元测试: Maven:3.5.2, Java:1.8, Jacoco:使用7.0 / 7.9 / 8.0, 操作系统:Windows
经过多次努力寻找maven多模块项目的正确解决方案,不像单个模块项目,我们需要说从各个模块中选择jacoco报告&amp;合并到一个报告,因此解决了这个配置的问题,因为我的父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>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.4.0.905</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.9</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>
</pluginManagement>
</build>
我尝试过其他一些选项,例如 jacoco-aggregate &amp;甚至创建一个子模块,通过将其包含在父pom中,但没有真正起作用的&amp;这很简单。我在日志中看到<sonar.jacoco.reportPath>
已被弃用,但仍然按原样运行,似乎在执行时自动替换,或者可以手动更新为<sonar.jacoco.reportPaths>
或最新。在使用 mvn clean install 开始在cmd中进行设置之后,然后 mvn org.jacoco:jacoco-maven-plugin:prepare-agent install (检查项目的目标文件夹是否为jacoco。 exec创建)&amp;然后做 mvn声纳:声纳,这就是我试过的,如果有其他最好的解决方案,请告诉我。希望这有帮助!!如果没有,请发表您的问题..
答案 3 :(得分:1)
Jenkins没有显示覆盖率结果,因为它是jenkins jacoco插件和maven jacoco插件之间版本兼容性的问题。 在我这边,我已经使用更新版本的maven jacoco插件修复了它
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.9</version>
</plugin>
<plugins>
<pluginManagement>
<build>
答案 4 :(得分:0)
在pom.xml中包含sunfire和jacoco插件 运行maven命令,如下所示。
mvn jacoco:prepare-agent jacoco:报告声纳:声纳
<properties>
<surefire.version>2.17</surefire.version>
<jacoco.version>0.7.2.201409121644</jacoco.version>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire.version}</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals><goal>prepare-agent</goal></goals>
</execution>
<execution>
<id>default-report</id>
<phase>prepare-package</phase>
<goals><goal>report</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
答案 5 :(得分:0)
我遇到了同样的问题,我面临的挑战是正确配置Jacoco并为Sonar配置正确的参数。我将简要解释一下,如何最终使SonarQube正确显示测试结果和测试范围。
在您的项目中,您需要pom或父pom中的Jacoco插件(您已经拥有了此插件)。此外,您需要使用maven-surefire-plugin来显示测试结果。运行Maven构建时,将自动生成所有测试报告。棘手的部分是为声纳找到正确的参数。并非所有参数似乎都适用于正则表达式,因此您必须使用逗号分隔的列表(我认为文档并不是很好)。这是我使用过的参数列表(我从Bamboo使用它们,如果使用sonar.properties文件,则可能会省略“ -D”):
-Dsonar.branch.target=master
-Dsonar.working.directory=./target/sonar
-Dsonar.java.binaries=**/target/classes
-Dsonar.sources=./service-a/src,./service-b/src,./service-c/src,[..]
-Dsonar.exclusions=**/data/dto/**
-Dsonar.tests=.
-Dsonar.test.inclusions=**/*Test.java [-> all your tests have to end with "Test"]
-Dsonar.junit.reportPaths=./service-a/target/surefire-reports,./service-b/target/surefire-reports,
./service-c/target/surefire-reports,[..]
-Dsonar.jacoco.reportPaths=./service-a/target/jacoco.exec,./service-b/target/jacoco.exec,
./service-c/target/jacoco.exec,[..]
-Dsonar.projectVersion=${bamboo.buildNumber}
-Dsonar.coverage.exclusions=**/src/test/**,**/common/**
-Dsonar.cpd.exclusions=**/*Dto.java,**/*Entity.java,**/common/**
如果在项目中使用Lombok,则还需要lombok.config文件来获得正确的代码覆盖率。 lombok.config文件位于项目的根目录中,具有以下内容:
config.stopBubbling = true
lombok.addLombokGeneratedAnnotation = true
答案 6 :(得分:0)
surefire和jacoco插件中都存在argLine配置,从而停止了jacoco报告的生成。 argLine应该在属性中定义
<properties>
<argLine>your jvm options here</argLine>
</properties>
答案 7 :(得分:0)
对我来说,sonarqube 仪表板中没有显示百分比覆盖率。我在我们的 pom.xml 中添加了以下属性来工作。
<sonar.binaries>${project.basedir}/../target/classes</sonar.binaries>