大家好,我叫董鑫,一名在測試開發道路上的新手。第一階段的學習已然結束,收穫頗多,瞭解了很多在自己平時測試工作無法接觸到的新知識,比如這次在這裡分享的Sonarqube
進行靜態程式碼掃描並整合Jenkins
的知識,是分享也是自我學習的總結。若有不對的地方,還請各位同行,同學,老師及時指正。
1. 什麼是SonarQube
SonarQube
是一個開源的程式碼質量管理系統,用於檢測程式碼中的錯誤,漏洞和程式碼規範,通過外掛的機制,
可以基於現有的Gitlab
、Jenkins
整合、以便在專案拉取後進行連續的程式碼檢查。
優點:
◆ 支援眾多計算機程式語言
◆ 通過外掛機制能整合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. 小結
此次分享就到這裡了,更多的是自我知識沉澱的過程,第一階段的學習雖已結束,但對於我更多的是開始,很多的知識需要自己動手搭環境來實踐,我很享受這個過程。將一個個知識落實,弄清楚,是一件令我非常高興的事情。接觸並學習更多測試開發的知識,在測試的道路上越走越寬,越走越遠,為此,奮力前進!