SonarQube 搭建代碼質量管理平臺(一)

SonarQube 是一個開源的代碼分析平臺,用來持續分析和評測代碼的質量,支持檢測 Java、JavaScript、C#、C、C++ 等二十幾種編程語言。通過 SonarQube 可以檢測出項目中潛在的Bug、漏洞、代碼規範、重複代碼、缺乏單元測試的代碼等問題,並提供了 UI 界面進行查看和管理。

架構

Architecture

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 插件管理

集成

Integration

以上是官方提供的流程圖,官方提供了支持不同 IDE 的 SonarLint 插件 ,插件會在編碼過程中對代碼進行分析,從而促使在開發階段就能提高代碼的質量。理論上我們應該遵循分析結果,乖乖的優化代碼,但如果開發人員不按套路,不進行優化或不安裝 SonarLint,非要把代碼提交到 SCM(如: git, SVN, TFVC),一種方式可以在合併管道中加入代碼檢測環節,有問題直接攔截,提交失敗,不過這有點過於粗暴了,很多情況下確實沒這個必要;另一種方式是允許代碼暫時提交到代碼庫,進入代碼庫後再次進行分析,有問題再回頭優化(代碼庫是必經之路,逃也逃不掉)。

對代碼庫中的代碼進行分析之前,我們需要搭建持續集成工具(如:Jenkins),並在工具中集成 SonarQube Scanners,根據持續集成工具設置的條件會自動觸發拉取和 Build 代碼,然後經過 SonarQube Scanners 分析並將分析報告發送到 SonarQube Server,SonarQube Server 對分析報告進行處理並保存到 SonarQube Database,同時可將分析報告發送給相關負責人進行 Review ,最終我們可以通過 UI 界面進行查看分析結果,開發人員對有問題的代碼再次進行優化,如此循環。

環境要求

主要是兩個要求,具體可參考 Prerequisite

  1. JDK 8
  2. MySQL (>=5.6 && <8.0) (也支持其他數據)

安裝 SonarQube Server

  1. 下載 SonarQube,一般情況使用社區版,其他版本可以試用,但最終需要 money

  2. 解壓後,在 bin 文件夾中選擇匹配的操作系統啓動 SonarQube server

    # On Windows, execute:
    .\bin\windows-x86-xx\StartSonar.bat
     
    # On other operating system, execute:
    bin/[OS]/sonar.sh console
    
    StartSonar

    從啓動日誌中可以看出 SonarQube server 依賴於 Elasticsearch,但並不需要單獨下載,SonarQube 的下載包內已包含,如果想複用之前安裝過的 Elasticsearch,請根據需要調整配置文件 conf/sonar.properties 中 Elasticsearch 部分。

  3. 啓動成功後訪問: http://localhost:9000 ,默認登錄賬號/密碼:admin/admin

SonarQube UI

配置 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 項目進行代碼分析

下載 JavaScript 項目代碼 ,在項目根目錄下創建 sonar-project.properties:

javascript project

在 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
Analyzed

執行成功後,再次訪問: http://localhost:9000 ,出現一個 ApiDoc 項目的分析概要,並提示有一個不規範問題,測試覆蓋率 0。

注意:日誌中的 ”Analysis report compressed in 205ms, zip size=518 KB“說明了壓縮後的分析報告大小,最終這部分數據會存儲到 MySQL,MySQL 默認接受的最大數據包爲 4M,如果壓縮包過大,這裏的提交就會失敗,這時候需要修改 MySQL 的 max_allowed_packet 的值。

ApiDoc Result
Code Smell

修復掉不規範問題後重新執行命令 sonar-scanner ,結果如下:

ApiDoc Result2

同時在 MySQL 的 sonar 數據庫中又會自動創建相關的表,並對分析結果進行存儲。

Tables

以上通過對本地目錄下的一個 JavaScript 項目進行分析測試,實際情況應該是基於 SCM ,並配合持續集成工具進行自動化代碼分析,下篇介紹。

參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章