总共分成几步:
- gitlab提交merge request后,会向jenkins发送通知
- jenkins得到通知后,会自动构建,此时gitlab中需要等待jenkins的返回结果(实际上是触发external pipline)
- jenkins拿到sonar的扫描结果
- jenkins向gitlib通知构建结果
第一步中需要gitlab中增加webhook,到jenkins的
第二步中jenkins中添加gitlab的可通信用户
第三步中需要配置sonar到jenkins的webhook
sonar配置
创建网络调用
-
名称无限制
-
URL填写jenkins地址/soanrqube-webhook/
jenkins配置
系统配置
此处配置的gitlab api token为gitlab提交merge request后,需要启动external pipline的用户 为控制权限和区分,建议单独维护此用户
| Gitlab Merge Request Builder |
|---|
安装和配置Gitlab Merge Request Builder插件
源码管理
此处需要注意的是:指定分支填写 ${gitlabSourceBranch},这样才会去扫描merge request中的源分支代码参考
构建触发器
此处需要注意的是:
- 如果只想在merge的时候进行扫描,仅勾选
Opened Merge Request Events - 记录GitLab webhook URL,后续在配置gitlab中会使用到
- “高级”选项中可以生成
Secret token,后续在配置gitlab中也会使用到
构建
此处需要注意的是:
扫描配置中需要增加:sonar.qualitygate.wait=true
此处和头部参考文档中不同的点,参考文档中再构建后操作中使用了Quality Gates Sonarqube Plugin,
但是在实际jenkins构建中,会报错org.quality.gates.jenkins.plugin.QGException: Expected status 200, got: 400. Response: {"errors":[{"msg":"The \u0027component\u0027 parameter is missing"}]}
找了很多解决方法,最终选择在配置中增加
构建后操作
将jenkins构建结果回显到gitlab中
gitlab配置
这步设置成private也没有问题
实际效果
gitlab发起merge request时,就会触发jenkins自动扫描:
扫描时报后,会拒绝合并