SonarQube+Jenkins代码扫描问题总结

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

然后从文件中再注入环境变量

接着配置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就填,

commitDate="sonar.projectDate=2020-12-10"

这样就可以灵活设置日期,扫描之前的版本。

4添加sonar.exclusions、sonar.test.inclusions属性后,单元测试为“-”,覆盖率正确

扫描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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值