超詳細,自動化測試接入Jenkins+Sonar質量門禁實踐

狂師發表於2021-08-25

大家好,我叫董鑫,一名在測試開發道路上的新手。第一階段的學習已然結束,收穫頗多,瞭解了很多在自己平時測試工作無法接觸到的新知識,比如這次在這裡分享的Sonarqube進行靜態程式碼掃描並整合Jenkins的知識,是分享也是自我學習的總結。若有不對的地方,還請各位同行,同學,老師及時指正。

1. 什麼是SonarQube

SonarQube是一個開源的程式碼質量管理系統,用於檢測程式碼中的錯誤,漏洞和程式碼規範,通過外掛的機制,

可以基於現有的GitlabJenkins 整合、以便在專案拉取後進行連續的程式碼檢查。

優點:

◆ 支援眾多計算機程式語言

◆ 通過外掛機制能整合IDE、Jenkins、Git等

◆ 內建大量常用程式碼檢查規則

◆ 支援定製開發規則

◆ 視覺化介面

◆ 支援從可靠性、安全性、可維護性、覆蓋率、重複率等 方面分析專案

具體的配置及文件可以訪問下面的連結檢視:

https://www.sonarqube.org/downloads/ 
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/ 

2. Jenkins外掛安裝及配置

Sonarqube想要與Jenkins整合,需要安裝相應的外掛來支援。

在外掛管理中搜尋名為Sonarqube Scanner for Jenkins的外掛 並安裝。

安裝好外掛後,還需要配置相應的服務和工具資訊:

2.1. 系統設定->SonarQube servers

  • name:可自定義)
  • server url:這個地址就是你sonar服務所在的地址
  • token:在sonar專案中生成的token

2.2. 全域性工具配置》SonarQube Scanner

建議不採用自動安裝,使用手動下載配置好的sonar scanner

  • name:自定義sonar scanner名稱,建議使用sonar-scanner
  • SONAR_RUNNER_HOME:sonar scanner所在的家目錄

3. 自由風格的job使用sonar

3.1 配置程式碼倉庫地址:

3.2 勾選sonarqube 服務並選擇token:

3.3 在構建中新增Exeute SonarQube Sanner

這裡可以使用兩種方式:

  • a. 直接將sonar-project.properties配置內容寫到 Analysis properties 中
  • b. 將配置好的sonar-project.properties檔案放置在程式碼目錄中,在 Path to project properties 配置相應的檔名

建議使用第二種方式來管理
我配置的sonar-project.properties檔案如下:

儲存好後,就可以來構建了。構建後專案頁面可以直接跳轉到sonarqube服務檢視。

4. pipeline流水線使用sonar

4.1 構建一個流水線job,流水線pipeline script如下編寫:

pipeline {
    agent any

    stages {
        stage('拉取程式碼') {
            steps {
                git credentialsId: 'gitee', url: 'https://gitee.com/dx0001/work.git'
            }
        }
        stage('靜態程式碼靜態掃描') {
            steps {
                withSonarQubeEnv('sonarqube'){
                    bat "sonar-scanner"
                }
            }
        }
    }    

注意: 這裡的名稱是在Jenkins中系統管理--sonarqube servers新增的名稱
同樣的,設定好job後就可以構建進行程式碼掃描了。

5. 接入Sonar質量門禁

通過上面的job,只是程式碼掃描可能無法滿足日常的情況,當掃描的結構不滿足時我可能就不進行後面的步驟了,這樣的情況,我們就需要接入質量門禁的方式來實現。

5.1 在sonar服務端的質量閥中設定質量門禁,新增要運用的專案

質量配置->質量閥

這裡可以新增指標來定義通過掃描的條件。然後將設定的質量閥分配給要掃描的專案。

5.2 在sonar服務端的配置裡面新增網路呼叫hook

配置->網路呼叫

這裡新增Jenkins呼叫的地址,用來回撥掃描的結果。URL配置為:Jenkins地址+/sonarqube-webhook

5.3 流水線改造

pipeline {
    agent any

    stages {
        stage('拉取程式碼') {
            steps {
                git credentialsId: 'gitee', url: 'https://gitee.com/dx0001/work.git'
            }
        }
        stage('靜態程式碼靜態掃描') {
            steps {
                withSonarQubeEnv('sonarqube'){
                    bat "sonar-scanner"
                }
            }
        }
        stage('檢查結果分析') {
            steps {
                script{
                    timeout(5){
                        def qg=waitForQualityGate()
                        echo "結果狀態:${qg.status}"
                        if(qg.status!='OK')
                            error '未達到程式碼門禁要求!'
                    }
                }
            }
        }
    }
}

在上面的流水線的job上增加一個“檢查結果分析”的步驟,使用waitForQualityDate()的方法來獲取掃描是否通過質量閥的狀態值。最後使用if條件來判斷,不通過時則使用“error”來中斷流程,實現質量門禁的功能。

6. 小結

此次分享就到這裡了,更多的是自我知識沉澱的過程,第一階段的學習雖已結束,但對於我更多的是開始,很多的知識需要自己動手搭環境來實踐,我很享受這個過程。將一個個知識落實,弄清楚,是一件令我非常高興的事情。接觸並學習更多測試開發的知識,在測試的道路上越走越寬,越走越遠,為此,奮力前進!

相關文章