Windows+Sonar+Jenkins+Git+SonarPython配置持續內建的代碼品質平台
本文以Python項目為例,建構了一個基于Windows+Sonar+Jenkins+Git的持續內建且支援代碼自動分析的平台
1.1 Java中主流代碼分析工具對比
@ | PMD | Findbugs | CheckStyle | Sonar |
---|---|---|---|---|
運作方式 | IDE插件,獨立運作 | IDE插件,獨立運作,Findbugs+Jenkins CI內建運作 | IDE插件 | 獨立運作,需要單獨的MySQL源 |
運作原理 | 基于源代碼分析,主要面向安全編碼規則,如“避免聲明同名變量”,包括風格類、類型使用等等,具備一定的資料流分析和路徑分析能力。 | 基于位元組碼分析,大量使用資料流分析技術,側重運作時錯誤檢測,如空指針引用等,分析深度大于PMD及Checkstyle。 | 基于源代碼,與pmd類似,但更側重編碼的文法風格,分析深度不及PMD。 | 定位是代碼品質平台,本身不進行代碼分析,但可以內建各個靜态分析工具以及其他軟體開發測試工具,并基于內建工具的結果資料按照一定的品質模型,如iso-9126,對軟體的品質進行評估。 |
目的 | 檢查Java源檔案中的潛在問題 | 基于Bug Patterns概念,查找javabytecode(.class檔案)中的潛在bug | 檢查Java源檔案是否與代碼規範相符 | 作為代碼品質平台,通過內建工具對軟體品質進行評估 |
檢查項 | 空try/catch/finally/switch語句塊,未使用的局部變量、參數和private方法,空if/while語句,過于複雜的表達式,不必要的if語句等,複雜類 | 主要檢查bytecode中的bug patterns,如NullPoint空指針檢查、沒有合理關閉資源、字元串相同判斷錯(==,而不是equals)等 | Javadoc注釋命名規範多餘沒用的ImportsSize度量,如過長的方法缺少必要的空格Whitespace重複代碼 | 在其他代碼品質工具的基礎上,sonar不僅關注了正常靜态bug,還關注到了如代碼品質、包與包,類與類之間的依賴情況、代碼耦合情況、類,方法。檔案的複雜度、代碼中是否包含大量複制粘貼的代碼是品質低下的,關注到了項目代碼整體的健康情況。 |
優點 | 插件可以配置規則,有獨立顯示問題的視圖 規則嚴格,但可以通過修改規則集定義需要的規則 | FindBugs 大多數提示是有用且值得更改的 提供圖形界面的獨立程式,對jar進行檢測,有報告生成,非常友善 | 規則嚴格,但可以通過修改規則集定義需要的規則 | High級别的bug都是較為實用的bug,且能覆寫到一些性能方面的問題 |
缺點 | 配置無查找功能,但可以通過縮寫快速找到某個規則 很多功能插件沒有實作,可獨立使用,但無法同時修改源碼 | 隻能做檢查,不能修改代碼,可配合Jalopy使用修改代碼 插件自定義規則沒有查找功能,查找規則麻煩 | 其本身規則的實用程度不如Findbugs |
1.2 SonarQube介紹
與持續內建工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是簡單地把不同的代碼檢查工具結果(例如 FindBugs,PMD 等)直接顯示在 Web 頁面上,而是通過不同的插件對這些結果進行再加工處理,通過量化的方式度量代碼品質的變化,進而可以友善地對不同規模和種類的工程進行代碼品質管理。
在對其他工具的支援方面,Sonar 不僅提供了對 IDE 的支援,可以在 Eclipse 和 IntelliJ IDEA 這些工具裡聯機檢視結果;同時 Sonar 還對大量的持續內建工具提供了接口支援,可以很友善地在持續內建中使用 Sonar。此外,Sonar 的插件還可以對 Java 以外的其他程式設計語言提供支援,對國際化以及報告文檔化也有良好的支援。
Sonar 為代碼的品質管理提供了一個平台,對傳統的代碼靜态檢測如 PMD、FindBugs 等工具進行整合,可以說是目前最強大的代碼品質管理工具之一。
Sonar 目前支援的語言:C/C++/JavaScript/C#/Java/COBOL/PL/SQL/PL/I/PHP/ABAP/VB.NET/VB6/Python/RPG/Flex/Objective-C/Swift/Web/XML
1.3 SonarQube整體架構:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLhZTOidzMkFTO4ITYtYDN4EWL0ATOz0iNmVjNtITZ2IDZmFjNvwVMwAjM3IzLcRnbl1GajFGd0F2LcRWYvxGc19CXt92YuUWelRXauwGZvw1LcpDc0RHaiojIsJye.gif)
2.1 部署SonarQube
- 下載下傳SonarQube
- 将SonarQube壓縮包解壓縮,執行/bin/windows-x86-64/StartSonar.bat 即完成了Sonar的啟動
- 打開浏覽器,登入http://localhost:9000
- 安裝SonarPython插件
- [可選安裝]安裝Chinese Pack差價可以獲得中文支援
插件的安裝方法:
- 點選右上角的Login
- 鍵入預設管理者使用者名及密碼 admin ,登陸
- 點選Administration,找到System->Update Center
- 搜尋插件名字,點選install,然後點選Restart重新開機Sonar,完成安裝。解除安裝同理
2.2 部署SonarQube Scanner
- 将 SonarQube Scanner 壓縮包解壓到位置(如C:\sonar-scanner),将bin目錄添加到環境變量中(C:\sonar-scanner\bin)
- (測試)打開CMD,cd到項目根目錄,鍵入
官方文檔有一個坑,就是并沒有定義projectName及projectVersion,實際測試中是必須定義的
其中-D 用來定義變量,加入-X 可以加入更多debug資訊
若沒有出錯,說明部署成功,打開浏覽器進入Dashboard,可以看到剛建立的項目代碼分析結果。
2.3 部署Jenkins
Jenkins是一個開源軟體項目,是基于Java開發的一種持續內建工具,用于監控持續重複的工作,旨在提供一個開放易用的軟體平台,使軟體的持續內建變成可能。
- 下載下傳Jenkins,選擇Windows
- 運作Jenkins安裝檔案,安裝完成後會跳出部署設定(預設位址:http://127.0.0.1:8080)
- 第一次會要求鍵入一個admin密碼,這個密碼存在Jenkins\secrets\initialAdminPassword 這個檔案中,用記事本打開,複制密碼粘貼到浏覽器中即可,同樣的,日後如果忘記管理者密碼,也可以找到這個檔案使用這個密碼登入管理者賬戶。
- 安裝 SonarQube Scanner for Jenkins 插件
-
進入 系統管理->Global Tool Configuration ,新增SonarQube Scannner,不勾選自動安裝
Name鍵入SonarQube Scanner
SONAR_RUNNER_HOME鍵入SonarQube的絕對目錄(如C:\sonar-scanner)
- 點選Save儲存
Jenkins插件安裝方法
進入 系統管理->插件管理->可選插件,在搜尋框中搜尋需要安裝的插件,點選直接安裝,然後重新開機Jenkins
2.4 本文省略但必須做的步驟:
- 安裝Git
2.5 将Git項目添加到Jenkins并自動完成代碼檢測
- 打開Jenkins控制台->建立項目->選擇 建構一個自由風格的軟體項目 ->輸入項目名,下一步
-
源碼管理選擇Git
Repository URL鍵入項目Git位址 如 https://github.com/HiddenStrawberry/JDPackage.git
Credentials 為認證方式,點選Add添加認證, 這裡可以選擇多種認證方式,本文選擇Github使用者名/密碼登入,是以選擇Username with Password,填入Github的Username及Password,點選Add,然後選擇剛添加的賬戶。
- 點選下方建構->建立建構步驟-> Execute SonarQube Scanner
-
SonarQube Scanner選擇SonarQube Scanner
Analysis properties鍵入如下内容:
sonar.projectKey=myjdp
sonar.projectName=myjdp
sonar.projectVersion=
sonar.sources=.
注意中間沒有逗号,key,name,version為自定義,其他選項留白(本例),點選儲存
5. 在控制台中找到項目,點選立即建構,若建構後狀态燈為藍色,即為建構成功,若為紅色,進入Build History建構失敗的#次數,找到左邊的Console Output,即可檢視控制台中輸出的錯誤原因。
6. 在控制台中找到項目,點選SonarQube,即可檢視代碼分析内容。
3.1 性能分析:
在2G/雙核E5 V3 2.4GHz 新配置環境主機 上運作上述64位服務,實體記憶體占用約為80%,在運作建構時,CPU占用峰值可達80%,記憶體占用峰值達90%,由此可見SonarQube在代碼分析時占用資源較大。
4.1 引用:
如何靜态測試 Java 代碼?
Findbugs使用
PMD使用
Eclipse靜态分析插件使用
PMD、FindBug、checkstyle、sonar這些代碼檢查工具的差別?各自的側重點是什麼?
FindBugs、PMD和CheckStyle對比
建構基于Jenkins + Github的持續內建環境
SonarPython - Plugins - Doc SonarQube