一、背景
关于SonarQube Scanner for Jenkins plugin waitForQualityGate,网上流传的文章,正确使用方法几乎没有,导致我也走了一些弯路。
比如这篇文章(https://www.cnblogs.com/faberbeta/p/jenkins001.html)介绍的方法简直就是胡说八道。
如果真照文章所说的,需要sleep几秒再获取结果,那么该插件的实现机制未免太过愚蠢,甚至可以说是愚不可及。
二、官方说明
工欲善其事,必先利其器。
迅哥名篇《狂人日记》里的狂人在日记里写道:“晚上总是睡不着,凡事须得研究,才会明白。”
技术当然也不例外,我们想要使用好某个东西,必然要对其做一个深入地了解,不能想当然。所谓片面看待问题,开口动手便错。
首先,我们打开jenkins的官方文档(https://www.jenkins.io/doc/pipeline/steps/sonar/#waitforqualitygate-wait-for-sonarqube-analysis-to-be-completed-and-return-quality-gate-status),里面明明白白地告诉我们:
Requirements:
- SonarQube server 6.2+
- Configure a webhook in your SonarQube server pointing to
<your Jenkins instance>/sonarqube-webhook/
. The trailing slash is mandatory!- Use
withSonarQubeEnv
step to run your analysis prior to use this step
需要在sonarqube上配置一个webhook,不了解sonarqube webhook的可搜一下相关文档,于此不赘。
这句话就的意思就是该插件(SonarQube Scanner for Jenkins plugin)的 waitForQualityGate 其实是需要sonarqube推送结果的,并不是说它要去主动获取结果,这也就是为什么这一步会出现pending超时的原因。起初,我想当然地认为,该步骤(waitForQualityGate)会主动去“轮询”sonarqube的结果,这当然是不对的。导致我一度想去修改该插件的源码,但是下载源码之后,发现不是我想的那样,所以我就又回过头去好好看了看官方文档。在此需要严厉地自我批评一下。
了解到该机制以后,我们就能正确地使用waitForQualityGate了。
三、正确使用方法
首先,打开你的sonarqube(譬如http://localhost:9000),登录之后,找到webhook的配置页面(http://localhost:9000/admin/webhooks),添加一个webhook,如下图所示:
1. name 字段,随便写,比如就叫jenkins,因为我们是要推给jenkins嘛
2. url字段,格式如<your Jenkins instance>/sonarqube-webhook/
这里需要注意两点:
第一、如果jenkins开启了安全验证,我们需要在jenkins上生成一个API Token用来访问jenkins,url要使用basic auth的方式,否则就会报403,截图里该字段的说明更详细,好好看看;
第二、注意url后面的斜杠(/)不能丢,上面的文档也说了这一点,The trailing slash is mandatory!
所以url的最终的形式可能就会是 http://<jenkins_username>:<jekins API Token>@localhost:8080/sonarqube-webhook/
3. Secret字段,该字段其实jenkins与sonar用来做较验的,主要是jenkins较验请求是否来自sonar,选填。
四、总结一下
1、jenkins安装SonarQube Scanner for Jenkins plugin;
2、jenkins的System Configruation里,配置sonar相关的信息;
3、jenkins生成API token(具体方式不赘);
4、Sonarqube里配置webhook用于回调SonarQube Scanner for Jenkins plugin,以通知扫描结果;
5、在你的jenkins pipeline里使用 waitForQualityGate,如下:
pipeline {
agent none
stages {
stage("build & SonarQube analysis") {
agent any
steps {
withSonarQubeEnv('My SonarQube Server') {
sh 'mvn clean package sonar:sonar'
}
}
}
stage("Quality Gate") {
steps {
timeout(time: 1, unit: 'HOURS') {
waitForQualityGate abortPipeline: true
}
}
}
}
}
6、最后你会发现,整个sonar扫描与质量检查(waitForQualityGate)很愉快。
来源:oschina
链接:https://my.oschina.net/zhyh1105/blog/4911967