sonar和gitlab-ci集成

背景介绍

我们知道使用 SonarQube 可以在日常开发中检测代码质量,除了使用 IDE 上集成 SonarLint 插件检测外,如果我们想针对代码托管在 Gitlab 上每次 commit 的文件做代码检测,可以不可以呢?答案是肯定的,我们可以使用 Sonar GitLab Plugin 插件完成,该插件会针对每次提交修改的文件,添加注释行,同时添加本次提交的代码检测结果的评论。我们还可以配合 gitlab-ci 完成每次 commit 时,添加的代码检测 Pipelines stage 流程,来控制代码检测流程是否通过。

环境、软件准备

本次演示环境,我是在虚拟机 Linux Centos7 和本机 Mac OX 上操作,以下是安装的软件及版本:

Docker:version 1.12.6

SonarQube:version 6.5

sonar-gitlab-plugin:version 2.1.0

GitLab:version Community Edition 9.1.4

gitlab-runner:version 1.11.2

注意:我们将代码托管在 GitLab 上,这里 GitLab 基于 Docker 安装,所以需要安装 Docker,本次还需要演示 跟 gitlab-runner 配合使用,所以也需要安装 gitlab-runner,这里 Docker、SonarQube、GitLab、gitlab-runner 的安装忽略。

Sonar GitLab Plugin 安装

在 SonarQube 上安装该插件安装方式很简单。

方式一:可以直接下载sonar-gitlab-plugin-2.1.0该插件,放到<sonarqube_install_dir>/extensions/plugins目录,重启 SonarQube 即可。

方式二:admin 登录 SonarQube,点击 配置 —> 系统 —> 更新中心 —> Available —> Search,输入 GitLab,在列表中点击 install 安装,安装完毕后重启 SonarQube 即可。

注意:该插件 sonar-gitlab-plugin 兼容 SonarQube 的版本信息如下

SonarQubesonar-gitlab-pluginLast version

<version>< 5.4<version><= 1.6.61.66

5.4 <=<version>< 5.6<version>= 1.7.01.7.0

<version>>= 5.6<version>> 1.7.02.1.0

因为我本机 SonarQube 版本为 6.5,所以这里我选择 2.1.0 最新版本插件。

配置使用说明

1.配置 GitLab 通用账户

这里为了方便统一管理,我们在 GitLab 上注册一个通用账号:sonarQube,作为对接 SonarQube 的统一账户,注册过程略,获取Token方式入下:

sonarQube 登录,点击 setting —> Account —> Private Token,获取的 User Token 为下边插件配置使用。同时还需要将 SonarQube 加到项目成员或项目所属项目组成员里面去,这样才能有权限 comment 和添加注释行。

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),其他配置默认即可。

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:

    -wwyl

auto_test:

  stage: test

  script: ci/auto_test.sh

  except:

    -master

  tags:

    -wwyl

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 

说明:这里模拟自动化测试脚本,具体使用时自己配置。

新增ci/sonar_analyze.sh文件

#!/bin/bash

mvn --batch-mode sonar:sonar \

    -Dsonar.host.url=http://10.10.10.3: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.10.10.3: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

提交完毕之后,我们去 GitLab 该项目下查看 Pipelines 状态、每个 stage 的执行日志以及本次提交的文件插件添加的注释行和检测结果评论吧。

说明: 从上图我们可以看到整个 pipelines 状态是 Failed 状态,因为 Sonar 检测结果中有严重级别的 bug 不能通过,这也正是我们想要的结果。还有我们在.gitlab-ci.yml文件中配置了非 master 分支执行 auto_test、sonar_preview 两步操作,图上可以看出有三步操作,那是因为最后一步是 External 外部的 sonarqube 增加的检测步骤。

说明:从上图可以看出 sonar-gitlab 插件针对有问题的代码行增加了注释行,同时增加了本次 commit 的文件的检测结果的评论,一目了然。

好了,通过这个插件配合 GitLab CI 我们可以很方便的做到对日常每次提交做代码检测,大大提高了我们代码质量,当然要想写出高质量代码还得靠我们自己的哈,这里只不过是再做了一次代码检测,避免意外情况导致的代码错误。同时,我们可以把这个流程做到日常开发持续集成步骤中,也是大有裨益的。

另外,如果我们不想使用 GitLab CI 使用该插件,也可以直接使用命令行的方式返回结果,详情查看该插件文档。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,183评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,850评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,766评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,854评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,871评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,457评论 1 311
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,999评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,914评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,465评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,543评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,675评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,354评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,029评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,514评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,616评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,091评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,685评论 2 360

推荐阅读更多精彩内容