0完整Analysis Properties
sonar.login=admin sonar.password=admin sonar.projectVersion=${versionName} ${commitDate} sonar.projectKey=$JOB_NAME sonar.projectName=$JOB_NAME sonar.sources=$WORKSPACE #sonar.exclusions=** /*Test*/ **,** /*test*/ ** sonar.test=$WORKSPACE #sonar.test.inclusions=** /*Test*/ **,** /*test*/ ** sonar.java.binaries=$WORKSPACE sonar.sourceEncoding=UTF- 8 sonar.coverage.jacoco.xmlReportPaths=**/jacoco.xml sonar.junit.reportPaths=${JUNIT_REPORT_PATHS} sonar.dependencyCheck.xmlReportPath=target/dependency-check-report.xml sonar.dependencyCheck.htmlReportPath=target/dependency-check-report.html |
1单元测试始终为0、代码覆盖率始终为0
针对Maven项目使用Jacoco插件。report必须在install之后。
--------- mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install org.jacoco:jacoco-maven-plugin:report -DskipTests= false -Dmaven.test.failure.ignore= true -Dmaven.test.skip= false -------- mvn clean install 依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段, 也就是完成了项目编译、单元测试、打包功能。 我们又额外配置了jacoco-maven-plugin:prepare-agent和report两个阶段。 prepare-agent阶段在clean阶段完成后执行,会默认生成jacoco.exec文件到target目录, test阶段会生成单元测试报告,放到target/surfire-reports目录下。 report阶段会解析target/jacoco.exec,生成不同格式xml\csv\html的覆盖率报告文件放在site/jacoco目录下。 |
下面就是配置sonar单元测试报告和覆盖率报告文件路径。覆盖率路径配置支持通配符,使用**即可。但是单元测试路径配置不支持通配符,所以针对多模块就会有问题,参考下一个2总结。
sonar.coverage.jacoco.xmlReportPaths=**/jacoco.xml sonar.junit.reportPaths=target/surefire-reports |
也可使用maven-surefire-plugin单独进行单元测试,不进行代码覆盖率检测。注意事项参见下一篇笔记。
2多模块项目单元测试报告路径配置
针对单模块,单元测试报告路径会生成在target/surefire-reports下,但是对于多模块,单元测试报告会生成在每个模块的target/surefire-reports目录下,sonar的单元测试报告路径sonar.junit.reportPaths因为不支持通配符,需要配置多个。
sonar.junit.reportPaths=module1/target/surefire-reports,module2/target/surefire-reports,module3/target/surefire-reports |
这样太死板,针对某一个项目可以把路径写死,但是不具有通用性。下面提供一个通用性方法,其实很简单就是自己自动拼接后面的所有路径并注入到环境变量,再从环境变量中获取。
首先执行shell命令获取路径,然后使用逗号进行拼接并存放在自定义的环境变量EnvironmentVars.txt文件中
echo "获取单元测试报告路径:" paths=$(find $WORKSPACE -name surefire-reports) echo paths echo JUNIT_REPORT_PATHS=$paths| tr " " "," > EnvironmentVars.txt |
然后从文件中再注入环境变量
![](https://i-blog.csdnimg.cn/blog_migrate/37237a9620fbbcdacb28e2b9f258f870.png)
接着配置sonar的Analysis Properties
sonar.junit.reportPaths=${JUNIT_REPORT_PATHS} |
这样配置即适用于其他任何项目,又兼容单模块和多模块。
3新增代码行始终为0。
原因是没有设置第一次代码的扫描日期和版本号,如果不设置,sonar会以当前日期设置为代码扫描日期。sonar判断新增代码是根据你代码的编写时间和第一次扫描时间相比较。编写的代码必须是第一次扫描日期之后的才算新增代码。所以在代码扫描时,如果想看历史各个版本的代码趋势,必须设置各个版本的代码扫描日期。
sonarqube中设置新代码周期默认基上一个版本,也可以自定义某一个版本。另外还需sonar属性配置
sonar.projectDate= 2020 - 12 - 10 #必须使用此格式,没有时间 sonar.projectVersion=v1. 0.0 |
可以将此属性进行参数化,不用写死,这样更加灵活。如
sonar.projectDate=${commitDate} |
这样也存在一个问题,就是如果我不想每次都填写这个日期,因为sonar不配置此属性就默认使用当前时间作为扫描日期。你可以不配此属性,但是不能将此属性等于空,即commitDate=“”。所以我们就需要将此属性也变成参数,默认值为空。
这样不想填日期时就用管,想设置日期时,commitDate就填,
commitDate= "sonar.projectDate=2020-12-10" |
这样就可以灵活设置日期,扫描之前的版本。
4添加sonar.exclusions、sonar.test.inclusions属性后,单元测试为“-”,覆盖率正确
![](https://i-blog.csdnimg.cn/blog_migrate/85dd78e8bc7c32410b571fbfb70e6ae0.png)
扫描A项目,如果添加下面属性,出现单元测试为“—”,覆盖率正确。项目生成target目录下也有单元测试报告surefire-reports,而且xml里面内容也对,不知道为啥sonar解析不出来。不添加这两属性就能看见单元测试数。
sonar.exclusions=** /*Test*/ **,** /*test*/ ** sonar.test.inclusions=** /*Test*/ **,** /*test*/ ** |
但是扫描B项目时,不添加这两个属性,Jenkins扫描任务终止,报错如下。所以只能针对不同项目分别进行配置,没法统一配置。目前还没找到原因,知道原因的欢迎评论,感谢。
xxxxTest.java can't be indexed twice |
我再SonarQube社区进行了提问,目前还没答复。
https://community.sonarsource.com/t/when-i-set-sonar-exclusions-and-sonar-test-inclusions-unit-test-is-not-a-number-but-coverage-is-right/42325
5单模块和多模块使用第三方组件漏洞扫描dependency-check
针对多模块项目使用org.owasp:dependency-check-maven:aggregate,aggregate会将多个模块的xml整合到一个dependency-check-report.xml,放在父项目target目录下,如果不使用会每个模块有一个dependency-check-report.xml,不利于sonar属性配置。
mvn clean org.owasp:dependency-check-maven:aggregate -Dformats=XML,HTML -DfailOnError= false -DautoUpdate= false |
sonar属性配置
sonar.dependencyCheck.xmlReportPath=target/dependency-check-report.xml sonar.dependencyCheck.htmlReportPath=target/dependency-check-report.html |