超詳細,自動化測試接入Jenkins+Sonar質量門禁實踐
- 2021 年 8 月 25 日
- 筆記
大家好,我叫董鑫,一名在測試開發道路上的新手。第一階段的學習已然結束,收穫頗多,了解了很多在自己平時測試工作無法接觸到的新知識,比如這次在這裡分享的Sonarqube
進行靜態代碼掃描並集成Jenkins
的知識,是分享也是自我學習的總結。若有不對的地方,還請各位同行,同學,老師及時指正。
1. 什麼是SonarQube
SonarQube
是一個開源的代碼質量管理系統,用於檢測代碼中的錯誤,漏洞和代碼規範,通過插件的機制,
可以基於現有的Gitlab
、Jenkins
集成、以便在項目拉取後進行連續的代碼檢查。
優點:
◆ 支持眾多計算機編程語言
◆ 通過插件機制能集成IDE、Jenkins、Git等
◆ 內置大量常用代碼檢查規則
◆ 支持定製開發規則
◆ 可視化界面
◆ 支持從可靠性、安全性、可維護性、覆蓋率、重複率等 方面分析項目
具體的配置及文檔可以訪問下面的鏈接查看:
//www.sonarqube.org/downloads/
//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: '//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: '//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. 小結
此次分享就到這裡了,更多的是自我知識沉澱的過程,第一階段的學習雖已結束,但對於我更多的是開始,很多的知識需要自己動手搭環境來實踐,我很享受這個過程。將一個個知識落實,弄清楚,是一件令我非常高興的事情。接觸並學習更多測試開發的知識,在測試的道路上越走越寬,越走越遠,為此,奮力前進!