SonarQube 搭建程式碼質量管理平臺(一)
ofollow,noindex">SonarQube 是一個開源的程式碼分析平臺,用來持續分析和評測程式碼的質量,支援檢測 Java、JavaScript、C#、C、C++ 等二十幾種程式語言。通過 SonarQube 可以檢測出專案中潛在的Bug、漏洞、程式碼規範、重複程式碼、缺乏單元測試的程式碼等問題,並提供了 UI 介面進行檢視和管理。
架構
SonarQube 由4部分構成:
-
SonarQube Server
SonarQube Server 會啟動3個主要程序:
Web Server:UI 管理介面
Search Server:基於 Elasticsearch 的搜尋服務
Compute Engine Server:計算引擎服務,進行程式碼分析並儲存到SonarQube Database
-
SonarQube Database
儲存 SonarQube 例項的配置資訊,專案、檢視等的快照資訊
-
SonarQube Scanners
分析專案程式碼,可在構建/持續整合伺服器上執行一個或多個
-
SonarQube Plugins
SonarQube 外掛管理
整合
以上是官方提供的流程圖,官方提供了支援不同 IDE 的SonarLint 外掛 ,外掛會在編碼過程中對程式碼進行分析,從而促使在開發階段就能提高程式碼的質量。理論上我們應該遵循分析結果,乖乖的優化程式碼,但如果開發人員不按套路,不進行優化或不安裝 SonarLint,非要把程式碼提交到 SCM(如: git, SVN, TFVC),一種方式可以在合併管道中加入程式碼檢測環節,有問題直接攔截,提交失敗,不過這有點過於粗暴了,很多情況下確實沒這個必要;另一種方式是允許程式碼暫時提交到程式碼庫,進入程式碼庫後再次進行分析,有問題再回頭優化(程式碼庫是必經之路,逃也逃不掉 )。
對程式碼庫中的程式碼進行分析之前,我們需要搭建持續整合工具(如:Jenkins),並在工具中整合 SonarQube Scanners,根據持續整合工具設定的條件會自動觸發拉取和 Build 程式碼,然後經過 SonarQube Scanners 分析並將分析報告發送到 SonarQube Server,SonarQube Server 對分析報告進行處理並儲存到 SonarQube Database,同時可將分析報告發送給相關負責人進行 Review ,最終我們可以通過 UI 介面進行檢視分析結果,開發人員對有問題的程式碼再次進行優化,如此迴圈。
環境要求
主要是兩個要求,具體可參考Prerequisite
安裝 SonarQube Server
- 下載 SonarQube ,一般情況使用社群版,其他版本可以試用,但最終需要 money
-
解壓後,在 bin 資料夾中選擇匹配的作業系統啟動 SonarQube server
# On Windows, execute: .\bin\windows-x86-xx\StartSonar.bat # On other operating system, execute: bin/[OS]/sonar.sh console
從啟動日誌中可以看出 SonarQube server 依賴於 Elasticsearch,但並不需要單獨下載,SonarQube 的下載包內已包含,如果想複用之前安裝過的 Elasticsearch,請根據需要調整配置檔案conf/sonar.properties 中Elasticsearch 部分。
-
啟動成功後訪問:http://localhost:9000 ,預設登入賬號/密碼:admin/admin
配置 SonarQube Database
安裝後 MySQL 後,建立資料庫 sonar,修改SonarQube 配置檔案 /conf/sonar.properties MySQL相關部分,重啟後 sonar 資料庫中會建立部分相關的表。
#----- MySQL >=5.6 && <8.0 # Support of MySQL is dropped in Data Center Editions and deprecated in all other editions # Only InnoDB storage engine is supported (not myISAM). # Only the bundled driver is supported. It can not be changed. sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false sonar.jdbc.username=root sonar.jdbc.password= sonar.sorceEncoding=UTF-8
安裝 SonarQube Scanners
選擇對應的作業系統版本下載 SonarQube Scanners ,下載後可將 bin 目錄路徑加入 Path 中,之後直接通過 sonar-scanner 全域性命令執行程式碼分析。
對 JavaScript 專案進行程式碼分析
下載APIDoc" target="_blank" rel="nofollow,noindex">JavaScript 專案程式碼 ,在專案根目錄下建立 sonar-project.properties:
在 sonar-project.properties 新增配置如下:
# Sonar專案標識,在 SonarQube例項下必須唯一 sonar.projectKey=test # 在 SonarQube UI 中顯示的專案名稱 sonar.projectName=ApiDoc # 專案版本 sonar.projectVersion=1.0 # 專案程式碼與 sonar-project.properties 檔案的相對路徑 sonar.sources=. # 程式碼檔案的編碼 sonar.sourceEncoding=UTF-8 # 排除不參與程式碼分析的檔案或目錄 sonar.exclusions=node_modules/**/*,.idea/**/*
在專案根目錄下執行命令:
sonar-scanner
執行成功後,再次訪問:http://localhost:9000 ,出現一個 ApiDoc 專案的分析概要,並提示有一個不規範問題,測試覆蓋率 0。
注意:日誌中的”Analysis report compressed in 205ms, zip size=518 KB“說明了壓縮後的分析報告大小,最終這部分資料會儲存到 MySQL,MySQL 預設接受的最大資料包為 4M,如果壓縮包過大,這裡的提交就會失敗,這時候需要修改 MySQL 的 max_allowed_packet 的值。
修復掉不規範問題後重新執行命令 sonar-scanner ,結果如下:
同時在 MySQL 的 sonar 資料庫中又會自動建立相關的表,並對分析結果進行儲存。
以上通過對本地目錄下的一個 JavaScript 專案進行分析測試,實際情況應該是基於 SCM ,並配合持續整合工具進行自動化程式碼分析,下篇介紹。