sonarqube作为日常开发中检测代码质量、bug、漏洞、覆盖率检测等指标的工具,能够为开发人员提升代码质量,书写规范提供参考。
同时sonarqube还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用sonarqube。
这里通过增加gitlab-ci各项目pipeline中关于sonarqube的job来实现研发人员提交的各个分支的代码的自动扫描分析,并将最终结果统计展示到sonar-UI。
首先配置gitlab支持sonarqube,需要在soanrqube服务端安装gitlab相关插件,作者之前配置gitlab账号集成登录sonarqube时,已安装,具体如下:
支持sonarqube扫描代码库多分支branch也需要安装插件:
插件地址: https://github.com/mc1arke/sonarqube-community-branch-plugin/releases 注意soanrqube版本对应的插件版本,作者这里sonarqube版本为7.5,对应的branch插件版本为1.0.2
[root@form-sonar-01 plugins]# pwd
/data/sonarqube-7.5/extensions/plugins
[root@form-sonar-01 plugins]# wget https://github.com/mc1arke/sonarqube-community-branch-plugin/releases/download/1.0.2/sonarqube-community-branch-plugin-1.0.2.jar
[root@form-sonar-01 plugins]# chown sonarqube:sonarqube sonarqube-community-branch-plugin-1.0.2.jar
[root@form-sonar-01 plugins]# su - sonarqube -c "/data/sonarqube-7.5/bin/linux-x86-64/sonar.sh restart"
.gitlab-ci.yaml文件配置soanrqube自动分析代码的相关stage及job
首先新增一个analysis stage
stages:
- analysis
# - test
- build
- build_images
- deploy
定义在代码各分支每次commit之后触发分析的job
非主分支配置:
sonarqube_preview:
image: twalter/maven-docker
stage: analysis
only:
refs:
- branches
# variables:
# - $CI_COMMIT_MESSAGE =~ /.*run_sonar.*/
before_script:
- echo "192.168.1.168 sonarqube.heihei.com" >> /etc/hosts
script:
- echo "running sonar:"
- cp $CI_PROJECT_DIR/bin/settings.xml ~/.m2/
- |
mvn -batch-mode verify sonar:sonar \
-Dmaven.test.skip=true \ #不执行测试用例,也不编译测试用例类
-Dsonar.host.url=https://sonarqube.heihei.com \ #sonarqube地址
-Dsonar.login=930a3cb9c0f67547532d884cb8335012ae749933 \ #sonar用户token
-Dsonar.gitlab.project_id=$CI_PROJECT_PATH \ #明确gitlab项目的id,在分析结束后将结果评论在commit记录中,且sonar集成需要
-Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA \ #明确gitlab项目分支本次commit的SHA,sonar集成时需要
-Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME \ #明确gitlab项目本次执行分析的分支,sonar集成时需要
-Dsonar.gitlab.url=https://gitlab.heihei.com \ #代码库地址
-Dsonar.gitlab.user_token='nPTbkeqsQ6Wf4kKQP5vJ' \ #该代码库项目用户的token,权限级别至少为maintainer
-Dsonar.projectKey=$CI_PROJECT_NAME \ #定义sonar本次分析项目的key
-Dsonar.projectName=$CI_PROJECT_NAME \ #定义sonar本次分析项目的名称
-Dsonar.gitlab.comment_no_issue=true -X #无论本次扫描结果有无issue都可以追加评论,默认false
-Dsonar.branch.name=$CI_COMMIT_REF_NAME #明确本次分析结果将归并展示与sonar-UI的哪个分支下
tags:
- docker
主分支配置:
sonarqube_master:
image: twalter/maven-docker
stage: analysis
when: manual
only:
refs:
- master
# variables:
# - $CI_COMMIT_MESSAGE =~ /.*run_sonar.*/
before_script:
- echo "192.168.1.168 sonarqube.heihei.com" >> /etc/hosts
script:
- echo "running sonar:"
- cp $CI_PROJECT_DIR/bin/settings.xml ~/.m2/
- |
mvn -batch-mode verify sonar:sonar \
-Dmaven.test.skip=true \
-Dsonar.host.url=https://sonar.heihei.com \ #sonarqube地址
-Dsonar.login=930a3cb9c0f66587532d816cb8335012ae7299 \
-Dsonar.gitlab.project_id=$CI_PROJECT_PATH \
-Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA \
-Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME \
-Dsonar.gitlab.url=https://gitlab.heihei.com \
-Dsonar.gitlab.user_token='nPTbkeqsB21f4kKQP5vJ' \
-Dsonar.gitlab.ci_merge_request_iid=$CI_MERGE_REQUEST_IID \
-Dsonar.gitlab.merge_request_discussion=true \
-Dsonar.projectKey=$CI_PROJECT_NAME \
-Dsonar.projectName=$CI_PROJECT_NAME \
-Dsonar.branch.name=$CI_COMMIT_REF_NAME \
-Dsonar.gitlab.comment_no_issue=true -X
tags:
- docker
项目代码setting.xml增加如下配置:
<settings>
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- Optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>
http://sonarqube.heihei.com
</sonar.host.url>
</properties>
</profile>
</profiles>
</settings>
更多扫描参数配置,详细参加Sonar Gitlab-ci Variables以及 Sonar Para
关于gitlab及soanrqube两个用户token的获取(最好都为项目的管理者)
sonar.gitlab.user_token
gitlab右上角用户 -> settings ->Personal Access Tokens Scopes选api
sonar.login
登陆 sonarqube网页->login with gitlab -> 右上角自己的姓->My Account -> Security -> Generate Tokens
关于job中使用的CI环境变量
如果有疑问,可以通过在定义的sonarqube分析job中的script字段添加echo打印这些变量的值,就非常清晰了:
以代码库地址https://gitlab.heihei.com/zero/ad/advert-service/advert-track为例:
job中关于gitlab-ci的环境变量,详细参考GitLab CI Variables
关于sonar指定java项目分析文件
使用-Dsonar.exclusions指明哪些自动生成代码的文件夹不需要分析
匹配规则
? 匹配单个字符
** 匹配0个或多个文件夹
* 匹配0个或多个字符
e.g.
排除文件夹 项目根目录下"main/java/test/adv/service/jni/*" 中所有的文件和"main/java/test/adv/service/Clibbrary/"下的所有java文件
script:
- echo "running sonar:"
- cp $CI_PROJECT_DIR/bin/settings.xml ~/.m2/
- |
mvn -batch-mode verify sonar:sonar \
-Dmaven.test.skip=true \
... \
-Dsonar.exclusions=$CI_PROJECT_DIR/src/main/java/test/adv/service/jni/*,$CI_PROJECT_DIR/src/main/java/test/adv/service/Clibrary/*.java
查看扫描分析结果
查看gitlab CI/CD本次代码commit动作的pipelines,可以观察到多出了一个External的stage,且整个pipelines被标为红叉,这里是因为sonarqube检测认为项目代码存在bug级别错误所导致
查看sonarube UI界面,可以观察到设置的master及b1.7.0分支的扫描分析报告都已上传
因为设置了sonar.gitlab.comment_no_issue参数为true,所以本次扫描结果被sonarqube追加了评论