SonarQube Scanner for Jenkins plugin waitForQualityGate pending 超时

谁说我不能喝 提交于 2021-01-18 22:49:17

一、背景

关于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)很愉快。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!