SonarQube-代码覆盖率统计|多分支代码扫描|扫描结果关联commitid|控制代码扫描步骤]
SonarQube-代码覆盖率统计
要想实现Sonarqube的代码覆盖率统计,找一个具有大量单元测试的项目, 然后集成jacoco插件,生成覆盖率报告,最后由sonar收集。
Maven集成Jacoco
pom.xml里添加jacoco-maven-plugin
和junit
插件。
- jacoco-maven-plugin
- junit
<dependencies> <dependency> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
添加插件--加到对应标签里就可以
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <skipMain>true</skipMain> <skip>true</skip> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.7.5.201505241946</version> <executions> <execution> <id>prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>prepare-package</phase> <goals> <goal>report</goal> </goals> </execution> <execution> <id>post-unit-test</id> <phase>test</phase> <goals> <goal>report</goal> </goals> <configuration> <dataFile>target/jacoco.exec</dataFile> <outputDirectory>target/jacoco-reports</outputDirectory> </configuration> </execution> </executions> <configuration> <systemPropertyVariables> <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile> </systemPropertyVariables> </configuration> </plugin>
SonarQube安装Jacoco插件(8.9.0 版本可以跳过,已经集成)
代码扫描命令里加入 # 指定代码覆盖率工具为jacoco sonar.core.codeCoveragePlugin=jacoco # 指定exec二进制文件存放路径 sonar.jacoco.reportPaths=target/jacoco.exec
加入
sh """ sonar-scanner -Dsonar.host.url=http://192.168.1.110:9000 \ -Dsonar.projectKey=${projectName} \ -Dsonar.projectName=${projectName} \ -Dsonar.projectVersion=${BUILD_ID} \ -Dsonar.login=${AUTH_TOKEN} \ -Dsonar.ws.timeout=30 \ -Dsonar.projectDescription="my first project!" \ -Dsonar.links.homepage=http://192.168.1.110/${groupName}/${projectName} \ -Dsonar.links.ci=http://192.168.1.110:8080/job/${groupName}/job/${projectName}/ \ -Dsonar.sources=./demo/src \ -Dsonar.sourceEncoding=UTF-8 \ -Dsonar.java.binaries=./demo/target/classes \ -Dsonar.java.test.binaries=./demo/target/test-classes \ -Dsonar.core.codeCoveragePlugin=jacoco \ -Dsonar.jacoco.reportPaths=./demo/target/jacoco.exec -Dsonar.java.surefire.report=./demo/target/surefire-reports """
SonarQube-多分支代码扫描
手动安装插件
[root@jeekins plugins]# pwd /data/sonarqube8.9.0/sonarqube_extensions/plugins
https://github.com/mc1arke/sonarqube-community-branch-plugin/releases
[root@jeekins plugins]# chmod 700 sonarqube-community-branch-plugin-1.8.1.jar [root@jeekins plugins]# chown sonar.sonar sonarqube-community-branch-plugin-1.8.1.jar [root@jeekins plugins]# ll 总用量 11828 -rwx------ 1 sonar sonar 61903 10月 12 15:58 sonar-l10n-zh-plugin-8.9.jar -rwx------ 1 sonar sonar 12045563 10月 18 17:35 sonarqube-community-branch-plugin-1.8.1.jar
Sonar 8.9.1 版本
新版本插件的配置有变化,效果和使用方式不变。
- 将插件下载到extensions/plugins/目录。
- 更新sonar服务端的配置文件。
- 重启docker restart sonarqube 。
# cat sonarqube_conf/sonar.properties sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar=web sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar=ce
重启sonarqube
[root@jeekins sonarqube8.9.0]# docker cp sonar.properties sonarqube8.9.0:/opt/sonarqube/conf/ [root@jeekins sonarqube8.9.0]# docker restart sonarqube8.9.0
然后就可以看到插件了
使用的时候,扫描参数增加分支名称
##扫描参数增加 –Dsonar.branch.name= sonar-scanner -Dsonar.host.url=http://192.168.1.110:9000 \ -Dsonar.projectKey=devops-maven2-service \ -Dsonar.projectName=devops-maven2-service \ -Dsonar.projectVersion=1.0 \ -Dsonar.login=admin \ -Dsonar.password=admin123 \ -Dsonar.ws.timeout=30 \ -Dsonar.projectDescription="my first project!" \ -Dsonar.links.homepage=http://192.168.1.110:9080/devops/devops-maven-service \ -Dsonar.links.ci=http://192.168.1.110:8080/job/demo-pipeline-service/ \ -Dsonar.sources=src \ -Dsonar.sourceEncoding=UTF-8 \ -Dsonar.java.binaries=target/classes \ -Dsonar.java.test.binaries=target/test-classes \ -Dsonar.java.surefire.report=target/surefire-reports \ -Dsonar.branch.name=release-1.1.1
扫描后的效果
如果遇到错误
FAQ: 需要先把主分支扫描一遍,不然会报错。
ERROR: Error during SonarScanner execution ERROR: No branches currently exist in this project. Please scan the main branch without passing any branch parameters. ERROR: ERROR: Re-run SonarScanner using the -X switch to enable full debug logging.
SonarQube-扫描结果关联commitid
手动安装插件
提前装好插件:https://github.com/gabrie-allaigre/sonar-gitlab-plugin/tree/4.1.0-SNAPSHOT插件的说明文档查看该插件的Readme文档。 (仅质量阈失败后才可以展示扫描报告)
[root@jeekins plugins]# pwd /data/sonarqube8.9.0/sonarqube_extensions/plugins [root@jeekins plugins]# chmod 700 sonar-gitlab-plugin-4.1.0-SNAPSHOT.jar [root@jeekins plugins]# chown sonar.sonar sonar-l10n-zh-plugin-8.9.jar //重启sonarqube docker restart sonarqube8.9.0
获取参数
-Dsonar.gitlab.failure_notification_mode 值为commit-status表示更改提交状态, 值为nothing不做任何动作。
-Dsonar.gitlab.commit_sha参数获取方法
随便一个id就行
-Dsonar.gitlab.project_id获取方法
-Dsonar.gitlab.user_token参数获取方法[这个最好使用sonar用户的]
sonar.groovy
sonar-scanner -Dsonar.host.url=http://192.168.1.110:9000 \ -Dsonar.projectKey=${projectName} \ -Dsonar.projectName=${projectName} \ -Dsonar.projectVersion=${BUILD_ID} \ -Dsonar.login=${AUTH_TOKEN} \ -Dsonar.ws.timeout=30 \ -Dsonar.projectDescription="my first project!" \ -Dsonar.links.homepage=http://192.168.1.110:9080/${groupName}/${projectName} \ -Dsonar.links.ci=http://192.168.1.110:8080/job/${groupName}/job/${projectName}/ \ -Dsonar.sources=./demo/src \ -Dsonar.sourceEncoding=UTF-8 \ -Dsonar.java.binaries=./demo/target/classes \ -Dsonar.java.test.binaries=./demo/target/test-classes \ #多分支扫描 -Dsonar.core.codeCoveragePlugin=jacoco \ -Dsonar.jacoco.reportPaths=./demo/target/jacoco.exec \ -Dsonar.java.surefire.report=./demo/target/surefire-reports \ -Dsonar.branch.name=release-1.1.1 \ #gitlab commitid参数 -Dsonar.gitlab.commit_sha=f898a9fdbd319e68d519aa2ff42ad80da5186103 \ -Dsonar.gitlab.ref_name=main \ -Dsonar.gitlab.project_id=17 \ -Dsonar.dynamicAnalysis=reuseReports \ -Dsonar.gitlab.failure_notification_mode=commit-status \ -Dsonar.gitlab.url=http://192.168.1.110:9080 \ -Dsonar.gitlab.user_token=CwmDA_4TKevDPRh4_SEf \ -Dsonar.gitlab.api_version=v4
命令行
sonar-scanner -Dsonar.host.url=http://192.168.1.110:9000 \ -Dsonar.projectKey=demo-sharedlibrary \ -Dsonar.projectName=demo-sharedlibrary \ -Dsonar.projectVersion=1.1\ -Dsonar.login=admin \ -Dsonar.password=admin123 \ -Dsonar.ws.timeout=30 \ -Dsonar.projectDescription="my first project!" \ -Dsonar.links.homepage=http://192.168.1.110:9080/demo/demo-sharedlibrary \ -Dsonar.links.ci=http://192.168.1.110:8080/job/demo/job/demo-sharedlibrary \ -Dsonar.sources=./demo/src \ -Dsonar.sourceEncoding=UTF-8 \ -Dsonar.java.binaries=./demo/target/classes \ -Dsonar.java.test.binaries=./demo/target/test-classes \ -Dsonar.core.codeCoveragePlugin=jacoco \ -Dsonar.jacoco.reportPaths=./demo/target/jacoco.exec \ -Dsonar.java.surefire.report=./demo/target/surefire-reports \ -Dsonar.branch.name=release-1.1.1 \ -Dsonar.gitlab.commit_sha=83153efc3815ec563dc874c8ea7a6a4b68088a87 \ -Dsonar.gitlab.ref_name=main \ -Dsonar.gitlab.project_id=11 \ -Dsonar.dynamicAnalysis=reuseReports \ -Dsonar.gitlab.failure_notification_mode=commit-status \ -Dsonar.gitlab.url=http://192.168.1.110:9080 \ -Dsonar.gitlab.user_token=osdanhsx33zyLrwNHw2K \ -Dsonar.gitlab.api_version=v4
和gitlab集成成功后 commitid会有提示 点开它
质量阈设置的值失败的时候才会展示报告
SonarQube-控制代码扫描步骤运行
stage("SonarScan"){ when { environment name: 'skipSonar', value: 'false' } }

评论