1 - 前言
任何引入到軟體裡的變更将導緻系統複雜性的提高以及混亂程度的加深。系統的混亂程度被稱為“技術債”。每當新代碼被引入到系統時,技術債就會相應增加。
如果技術債長期不受重視的話,得到控制權的可能性将變得越來越渺茫,畢竟越來越多的功能在緊迫的期限内堆積過來。而這将會對軟體的生産力和可維護性産生負面影響。
疊代開發方法,将測試的執行自動化,以及使用CI來監控每一次簽入的技術債,這些是保證技術債在可控範圍内的不二法門。
使用類似SonarQube的(分辨代碼品質和跟蹤技術債的開源平台),可以輕松地內建到任何CI伺服器,并為使用者提供團隊技術債實時資料的展示。
SonarQube作為一款非常實用的工具,能夠在一個友好的web界面上展示它的分析結果,有助于管理和其他相關的非技術人員觀測。
2 - Sonar簡介
Sonar是一個用于代碼品質管理的開源平台,用于管理源代碼的品質。
通過插件機制(Plugin Library)支援絕大多數主流程式設計語言的代碼品質管理與檢測
可以與不同的測試、代碼分析、CI、IDE等工具進行內建,例如Maven、Jenkins等
對代碼品質分析結果資料進行再加工處理,通過量化的方式來度量,并且能夠定制化地展示
- 檢查代碼是否遵循程式設計标準:如命名規範,編寫的規範等。
- 檢查設計存在的潛在缺陷:SonarQube通過插件Findbugs、Checkstyle等工具檢測代碼存在的缺陷。
- 檢測代碼的重複代碼量:SonarQube可以展示項目中存在大量複制粘貼的代碼。
- 檢測代碼中注釋的程度:源碼注釋過多或者太少都不好,影響程式的可讀可了解性。
- 檢測代碼中包、類之間的關系:分析類之間的關系是否合理,複雜度情況。
使用SonarQube可以從七個次元檢測代碼品質
- 複雜度分布(complexity):代碼複雜度過高将難以了解、難以維護;
- 重複代碼(duplications):重複嚴重的代碼是品質低下的表現;
- 單元測試(unit tests):統計并展示單元測試覆寫率;
- 編碼規範(coding rules):通過Findbugs,PMD,CheckStyle等代碼規則檢測工具規範代碼編寫;
- 注釋(comments):缺少或者過多的注釋都會嚴重影響代碼可讀性;
- 潛在的Bug(potential bugs):通過Findbugs,PMD,CheckStyle等代碼規則檢測工具檢測潛在的bug
- 結構與設計(architecture & design):檢測依賴、耦合等關系
SonarQube - 代碼品質管理平台SonarQube簡介
3 - Sonar官方資訊
- https://www.sonarqube.org/
- https://www.sonarqube.org/downloads/
- https://docs.sonarqube.org/latest/
- https://docs.sonarqube.org/latest/setup/get-started-2-minutes/
- https://docs.sonarqube.org/latest/setup/install-server/
- https://docs.sonarqube.org/display/PLUG/Plugin+Library
- https://binaries.sonarsource.com/Distribution/
4 - SonarQube元件
SonarQube平台由4個元件組成:
- 一個SonarQube伺服器:包含web服務(界面管理)、搜尋服務、計算引擎服務(寫入資料庫)
- 一個SonarQube資料庫:存儲安全配置、全局配置、插件配置以及項目的品質快照、展示内容等
- 多個SonarQube插件:位于伺服器端extensions\plugins目錄,插件功能多種多樣
- 一個或者多個SonarQube掃描器:運作在建構或CI伺服器上,用于分析特定的項目
對于大規模項目的場景,每個元件都可以分離安裝到不同的虛拟機或實體機上。
SonarQube伺服器
- WebServer:負責頁面展示,可以檢視項目情況、頁面配置等
- SearchServer:使用基于記憶體開源的ElasticSearch作為背景的搜尋服務,搜尋請求一般從頁面發出
- ComputeEngine:負責處理源碼分析報告,并存儲報告結果到資料庫
5 - SonarQube主要流程
- 開發人員可以使用IDE開發,可以使用SonarLint插件進行本地實時代碼掃描和分析
- 開發人員通過SCM(源代碼管理器)将本地推送代碼到代碼倉庫
- 自動觸發建構與代碼分析
- CI(持續內建伺服器)使用SonarQube掃描器進行代碼分析,并上傳結果到SonarQube伺服器
- 持久化資料存儲
- 開發處理問題,通過SonarQube Sever界面,檢視代碼問題并處理
- 展示或同步報告結果,可以通過Web通路,也可以使用IDE插件來同步SonarQube結果,了解項目代碼品質趨勢
6 - Sonar掃描器
SonarQube掃描器可以認為是SonarQube伺服器對應的用戶端,
運作具體代碼掃描任務,讀取項目代碼并發送至SonarQube伺服器,以便讓SonarQube進行代碼分析。
https://docs.sonarqube.org/latest/analysis/overview/
掃描方式
- 通過指令行:例如SonarQube掃描器
- 通過建構工具:例如Maven、Gradle等的SonarQube掃描器
- 通過內建平台:例如Jenkins的SonarQube掃描器
- 通過本地代碼:例如IDE的SonarLint插件
官方文檔
- 通過指令行方式進行掃描:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
- 通過Maven方式進行掃描:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-maven/
- 通過Jenkins方式進行掃描:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-jenkins/