SonarQube Scanner for Jenkins plugin waitForQualityGate pending 超時

一、背景

關於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)很愉快。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章