在持续集成过程中,针对代码的静态检查一般有两个时间点:一是提交代码的时候、二是提交merge request的时候,如果代码检查不通过,则可以直接拒绝此次代码提交或者合并。下面我们介绍下在常见的devops工具链sonarqube、jenkins和gitlab下,实现在merge request提交的时候进行代码检查的方法。

jenkins端的配置

首先,我们在jenkins中安装如下几个插件:

  • gitlab plugin: https://wiki.jenkins-ci.org/display/JENKINS/GitLab+Plugin。此插件的主要作用是与gitlab集成,可以在代码提交、merge request创建等情况下触发jenkins进行构建,简单讲,就是在gitlab的webhook下触发jenkins构建
  • sonarqube scanner for jenkins: http://redirect.sonarsource.com/plugins/jenkins.html。此插件的作用是调用sonar scanner进行代码扫描,并可以将jenkins构建的结果以comments的形式添加到merge request中。从而方便后续code reviewer的查看。
  • sonar quality gates plugins: https://github.com/jenkinsci/sonar-quality-gates-plugin/blob/master/README.md。此插件的作用是读取一个sonar project的quality gates结果,如果是失败,则更改jenkins 构建的结果为失败或者不稳定。

安装完成之后,我们需要在gitlab端创建一个token供jenkins使用:登录gitlab之后,点击个人头像那个地方,在settings页的access token创建token,注意至少勾选api那的复选框





另外我们需要在sonarqbue端创建一个token供jenkins使用:登录sonarqube后,点击个人头像那个地方,在My Account页的tokens创建token。



然后我们进入jenkins的系统管理-系统设置,找到gitlab的配置块:



找到quality gates - sonarqube的配置块:



找到sonarqube server的配置块:



接下来,我们先建一个自由类型的项目,关键的配置如下:



然后点击Advanced按钮,为本jenkins的构建生成一个token:



在构建触发器的地方,我们只勾选Opened Merge requests,也就是merge request创建的时候进行构建,大家注意截图中有个webhook的url,该url后续需要填入到gitlab中。



在构建这个地方,我们选择execute sonarqube scanner选项。gitlab在发往jenkins的hook中会发送一些变量供我们在jenkins中使用,大家可以参考:https://github.com/jenkinsci/gitlab-plugin#add-a-note-to-merge-requests,如下是个完整变量的截图:



在构建后操作,我们增加了2项:



大家注意下:第一个是Quality Gates Sonarqube Plugin,这个读取代码扫描后的结果,如果分析失败也就是没有通过sonar的质量门,则此次构建的结果为FAILED。第二个是把此次构建的结果以note的形式添加到gitlab的merge request中。

到此,jenkins的配置完成。

gitlab端配置

我们进入gitlab的项目后,点击settings-integration,也就是给项目添加一个webhook,hook的地址就是上面构建中出现的url,token是点击advanced后创建的token,触发器我们只选择Merge request events好了,配置如下:



验证

下面我们在gitlab的项目里面,创建一个merge request,之后,就可以在jenkins端看到触发了sonarqube的代码扫描,并在扫描完成之后,根据是否通过sonar的quality gates,把成功或者失败的信息添加到了merge requests的note中:




总结

文章介绍使用jenkins和sonarqube做基于gitlab的merge request的代码静态检查方法,实用性高。文章介绍的集成方法,除可用于代码检查外,同样可以用于与gitlab集成的自动化测试、性能测试等,建议大家掌握。

另外一个扩展点,就是如果jenkins的构建不过,直接强制关闭gitlab的merge request,而不仅仅是添加一个note。