使用多分支插件分析PR(或MR)
SonarQube社区版不支持Pull Request(或Merge Request,简称PR或MR)扫描。为了支持PR扫描,从https://github.com/mc1arke/sonarqube-community-branch-plugin下载与SonarQube版本相应版本的插件。安装该插件后,即可以让SonarQube支持分析指定的分支,也可以支持分析PR(或MR)。
如何安装插件:
1、将下载的插件放在SonarQube安装目录下的extensions/plugins/目录中。
2、编辑SonarQube安装目录下的conf/sonar.properties文件,设置如下属性的值:
sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.16.0.jar=web sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.16.0.jar=ce |
注意上述版本号要相应替换。
3、重启SonarQube
为了要进行PR分析,按如下步骤操作:
1、首先,要分析目标分支,以建立质量基线。
将本地代码切换到目标分支,然后,在sonar-scanner的参数中添加sonar.branch.name=${PR要合入的目标分支},如master,再进行扫描。因为实际测试发现,sonar-scanner始终扫描的是当前代码分支,而非指定的分支(即便将所有代码分支都拉取下来),因此,在进行扫描前,要先将本地代码切换到指定目标分支。
示例:
sonar-scanner -Dsonar.projectKey=autojava -Dsonar.projectVersion=1.0 -Dsonar.token=sqa_d6187e3b18ab797c4f102521da29323d81d210ae -Dsonar.sources=./src -Dsonar.java.binaries=./target -Dsonar.sourceEncoding=UTF-8 -Dsonar.language=java -Dsonar.branch.name=master |
在SonarQube页面可看到该分支的扫描情况:
2、切换到PR代码所在的分支,在sonar-scanner的参数中添加如下3个参数,以进行PR扫描。
需注意,在进行PR扫描时,不能添加任何sonar.branch参数,否则SonarQube会将它当做是分支扫描而非PR扫描。
sonar.pullrequest.key = PR的id # PR的唯一id。必须对应于你的DevOps平台中的PR的id。如100。 sonar.pullrequest.branch = PR源分支 # 如feature sonar.pullrequest.base = PR要合入的目标分支 # 如master |
示例:
sonar-scanner -Dsonar.projectKey=autojava -Dsonar.projectVersion=1.0 -Dsonar.token=sqa_d6187e3b18ab797c4f102521da29323d81d210ae -Dsonar.sources=./src -Dsonar.java.binaries=./target -Dsonar.sourceEncoding=UTF-8 -Dsonar.language=java -Dsonar.pullrequest.key=16 -Dsonar.pullrequest.branch=feature_01 -Dsonar.pullrequest.base=master |
在SonarQube页面可看到该PR合并请求的扫描情况:
可看到,PR的扫描结果中只呈现了该PR代码中新引入的问题,而不会把所有旧问题的显示出来,这与我们的预期相符。
质量门禁
默认设置下,sonar-scanner不会等待扫描出结果后才返回。可以添加sonar.qualitygate.wait参数,这样,sonar-scanner会等待扫描结果,并根据是否扫描出问题来返回成功或失败的状态码。
示例:
sonar-scanner -Dsonar.projectKey=autojava -Dsonar.projectVersion=1.0 -Dsonar.token=sqa_d6187e3b18ab797c4f102521da29323d81d210ae -Dsonar.sources=./src -Dsonar.java.binaries=./target -Dsonar.sourceEncoding=UTF-8 -Dsonar.language=java -Dsonar.pullrequest.key=16 -Dsonar.pullrequest.branch=feature_01 -Dsonar.pullrequest.base=master -Dsonar.qualitygate.wait=true |
如下日志所示,由于PR扫描出了新问题,质量门禁检查未通过,导致整个流水线失败了:
只有将PR中的问题修复后,才能通过质量门禁检查。