一、背景介绍html
咱们知道使用 SonarQube 能够在平常开发中检测代码质量,除了使用 IDE 上集成 SonarLint 插件检测外,若是咱们想针对代码托管在 Gitlab 上每次 commit 的文件作代码检测,能够不能够呢?答案是确定的,咱们可使用 Sonar GitLab Plugin 插件完成,该插件会针对每次提交修改的文件,添加注释行,同时添加本次提交的代码检测结果的评论。咱们还能够配合 gitlab-ci 完成每次 commit 时,添加的代码检测 Pipelines stage 流程,来控制代码检测流程是否经过。git
二、环境、软件准备github
本次演示环境,我是在虚拟机 Linux Centos7 和本机 Mac OX 上操做,如下是安装的软件及版本:bash
注意:咱们将代码托管在 GitLab 上,这里 GitLab 基于 Docker 安装,因此须要安装 Docker,本次还须要演示 跟 gitlab-runner 配合使用,因此也须要安装 gitlab-runner,这里 Docker、SonarQube、GitLab、gitlab-runner 的安装忽略。maven
三、Sonar GitLab Plugin 安装gitlab
在 SonarQube 上安装该插件安装方式很简单。测试
方式一:能够直接下载 sonar-gitlab-plugin-2.1.0 该插件,放到 <sonarqube_install_dir>/extensions/plugins
目录,重启 SonarQube 便可。url
方式二:admin 登陆 SonarQube,点击 配置 —> 系统 —> 更新中心 —> Available —> Search,输入 GitLab,在列表中点击 install 安装,安装完毕后重启 SonarQube 便可。spa
注意:该插件 sonar-gitlab-plugin 兼容 SonarQube 的版本信息以下.net
SonarQube | sonar-gitlab-plugin | Last version |
---|---|---|
<version> < 5.4 |
<version> <= 1.6.6 |
1.66 |
5.4 <= <version> < 5.6 |
<version> = 1.7.0 |
1.7.0 |
<version> >= 5.6 |
<version> > 1.7.0 |
2.1.0 |
由于我本机 SonarQube 版本为 6.5,因此这里我选择 2.1.0 最新版本插件。
四、配置使用说明
4.1 配置 GitLab 通用帐户
这里为了方便统一管理,咱们在 GitLab 上注册一个通用帐号:sonarQube,做为对接 SonarQube 的统一帐户,注册过程略,获取Token方式入下:
sonarQube 登陆,点击 setting —> Account —> Private Token,获取的 User Token 为下边插件配置使用。同时还须要将 SonarQube 加到项目成员或项目所属项目组成员里面去,这样才能有权限 comment 和添加注释行。
4.2 配置 sonar-gitlab-plugin 插件
admin 登陆 SonarQube,点击 配置 —> 通用配置 —> GitLab —> Reporting —> 设置 GitLab User Token 以及 GitLab url。
注意:GitLab url 为配置的 GitLab 服务地址(本机 GitLab 地址:http://10.236.65.148),GitLab User Token 为 GitLab 上用户的 Token(这里使用上边统一帐户 sonarQube Token),其余配置默认便可。
4.3 配置 gitlab-runner
这里忽略 GitLab CI Runner 安装过程,详情参考以前文章 Docker搭建本身的Gitlab CI Runner 写的比较详细。这里咱们以一个 Maven Project:mavenDemo 为例演示,咱们配置 .gitlab-ci.yml 来实现 sonar-gitlab-plugin 插件添加注释行和检测结果评论,以及 Pipeline Stage 代码检测流程是否经过。
配置 .gitlab-ci.yml
sonar_preview: stage: test script: - ci/sonar_preview.sh except: - master tags: - hwy auto_test: stage: test script: ci/auto_test.sh except: - master tags: - hwy sonar_analyze: stage: test script: - ci/sonar_analyze.sh only: - master tags: - hwy
sonar_preview:
stage: test
script:
- ci/sonar_preview.sh
except:
- master
tags:
- hwy
auto_test:
stage: test
script: ci/auto_test.sh
except:
- master
tags:
- hwy
sonar_analyze:
stage: test
script:
- ci/sonar_analyze.sh
only:
- master
tags:
- hwy
说明:这里咱们把 Pipeline 流程分为两种,一种是除了 master 分支的,进行 sonar_
preview (sonar 预览) 以及 auto_
test (模拟自动化测试),另外一种只针对 master 分支,进行 sonar_
analyze (sonar 分析),大概意思就是对非 master 分支进行平常模拟自动化测试和使用 Sonar Gitlab 插件添加注释行和检测结果评论以及本次提交代码质量是否经过,对 master 分支上线前走一次静态代码检测。每一个步骤操做内容以下。
修新增 ci/auto_test.sh 文件
#!/bin/bash COMMITTER=$(git log -1 --format=%cE) echo ${COMMITTER} if [ $? -eq 0 ]; then echo "do something for auto_test here." echo "auto_test over." fi
#!/bin/bash
COMMITTER=$(git log -1 --format=%cE)
echo ${COMMITTER}
if [ $? -eq 0 ]; then
echo "do something for auto_test here."
echo "auto_test over."
fi
说明:这里模拟自动化测试脚本,具体使用时本身配置。
新增 ci/sonar_analyze.sh 文件
#!/bin/bash mvn --batch-mode sonar:sonar \ -Dsonar.host.url=http://10.236.65.36:9000 \ -Dsonar.login=wanyang3 \ -Dsonar.password=****** \ -Dsonar.issuesReport.html.enable=true \ -Dsonar.analysis.mode=preview \ -Dsonar.preview.excludePlugins=issueassign,scmstats if [ $? -eq 0 ]; then echo "sonarqube code-analyze over." fi
#!/bin/bash
mvn --batch-mode sonar:sonar \
-Dsonar.host.url=http://10.236.65.36:9000 \
-Dsonar.login=wanyang3 \
-Dsonar.password=****** \
-Dsonar.issuesReport.html.enable=true \
-Dsonar.analysis.mode=preview \
-Dsonar.preview.excludePlugins=issueassign,scmstats
if [ $? -eq 0 ]; then
echo "sonarqube code-analyze over."
fi
说明:这里 sonar.host.url 为本机或远程 SonarQube 服务地址,sonar.login & sonar.password
为帐户和密码,也可使用 token。后边的几个参数可参考以前文章 SonarQube 插件之 Issues Report & SonarLint 的配置及使用 说明。
新增 ci/sonar_preview.sh 文件
#!/bin/bash mvn --batch-mode verify sonar:sonar \ -Dsonar.host.url=http://10.236.65.36:9000 \ -Dsonar.login=wanyang3 \ -Dsonar.password=****** \ -Dsonar.analysis.mode=preview \ -Dsonar.gitlab.project_id=$CI_PROJECT_ID \ -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA \ -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME if [ $? -eq 0 ]; then echo "sonarqube code-analyze-preview over." fi
#!/bin/bash
mvn --batch-mode verify sonar:sonar \
-Dsonar.host.url=http://10.236.65.36:9000 \
-Dsonar.login=wanyang3 \
-Dsonar.password=****** \
-Dsonar.analysis.mode=preview \
-Dsonar.gitlab.project_id=$CI_PROJECT_ID \
-Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA \
-Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME
if [ $? -eq 0 ]; then
echo "sonarqube code-analyze-preview over."
fi
说明:sonar.gitlab.*
参数为插件可以使用变量,每一个变量有不一样的用处,具体可参考 Sonar Gitlab Plugins properties,$CI_PROJECT_ID
,$CI_COMMIT_SHA
,$CI_COMMIT_REF_NAME
等变量为 GitLab CI 变量,能够在 CI 流程中直接使用这些变量,具体可参考 GitLab CI Variables。
好了,配置完成以后,咱们如今能够修改并提交代码,看看效果吧。这里在 develop 分支故意写一些垃圾代码,验证下插件是否可以正确添加注释行以及添加检测结果评论,master 分支作一下提交验证下以前 sonar 静态代码检测结果。
cd mavenDemo git checkout develop 添加垃圾代码以下 ... String txt = "Hello world"; System.out.println(txt.substring(15)); int result = 1/0; ... git commit -am "modify code" git push
cd mavenDemo
git checkout develop
添加垃圾代码以下
...
String txt = "Hello world";
System.out.println(txt.substring(15));
int result = 1/0;
...
git commit -am "modify code"
git push
提交完毕以后,咱们去 GitLab 该项目下查看 Pipelines 状态、每一个 stage 的执行日志以及本次提交的文件插件添加的注释行和检测结果评论吧。
说明: 从上图咱们能够看到整个 pipelines 状态是 Failed 状态,由于 Sonar 检测结果中有严重级别的 bug 不能经过,这也正是咱们想要的结果。还有咱们在 .gitlab-ci.yml 文件中配置了非 master 分支执行 auto_test、sonar_preview 两步操做,图上能够看出有三步操做,那是由于最后一步是 External 外部的 sonarqube 增长的检测步骤。
说明:从上图能够看出 sonar-gitlab 插件针对有问题的代码行增长了注释行,同时增长了本次 commit 的文件的检测结果的评论,一目了然。
好了,经过这个插件配合 GitLab CI 咱们能够很方便的作到对平常每次提交作代码检测,大大提升了咱们代码质量,固然要想写出高质量代码还得靠咱们本身的哈,这里只不过是再作了一次代码检测,避免意外状况致使的代码错误。同时,咱们能够把这个流程作到平常开发持续集成步骤中,也是大有裨益的。
另外,若是咱们不想使用 GitLab CI 使用该插件,也能够直接使用命令行的方式返回结果,详情查看该插件文档。
参考资料