一、背景
關於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)很愉快。