介紹篇
SonarQube 介紹
SonarQube 是一款領先的持續程式碼質量監控平臺,開源在github 上,現在已更新到6.2 版本,star 數量超過 1400+,可以輕鬆配置在內網伺服器,實時監控程式碼,幫助瞭解提升提升團隊專案程式碼質量。通過外掛機制,SonarQube可以繼承不同的測試工具,程式碼分析工具,以及持續整合工具。
與持續整合工具(例如 Hudson/Jenkins 等)不同,SonarQube 並不是簡單地把不同的程式碼檢查工具結果(例如 FindBugs,PMD 等)直接顯示在 Web 頁面上,而是通過不同的外掛對這些結果進行再加工處理,通過量化的方式度量程式碼質量的變化,從而可以方便地對不同規模和種類的工程進行程式碼質量管理。
在對其他工具的支援方面,Sonar 不僅提供了對 IDE 的支援,可以在 Eclipse 和 IntelliJ IDEA 這些工具裡聯機檢視結果;同時 SonarQube 還對大量的持續整合工具提供了介面支援,可以很方便地在持續整合中使用 SonarQube。
此外,SonarQube 的外掛還可以對 Java 以外的其他程式語言提供支援,對國際化以及報告文件化也有良好的支援。
行業內提到"程式碼質量管理, 自動化質量管理", 一般指的都是通過Sonar來實現。本文的目標是實現在Sonar上顯示出iOS專案, 先看張最終的效果圖:
用Sonar能夠實現什麼?
- 技術債務(sonar根據"規則"掃描出不符合規則的程式碼)
- 覆蓋率(單元測試覆蓋率)
- 重複(重複的程式碼, 有利於提醒封裝)
- 結構
問題1: "規則"指的是什麼?
在Sonar工具中配置檢測工具(規則), 然後sonar根據規則檢測"質量報告檔案", 得出問題數目。 比如本文配置的規則是OCLint複製程式碼
問題2: 技術債務的天數怎麼得出?
每個規則都有對應的處理時間, 最後:問題型別1數目 * 對應時間 + 問題型別2數目 * 對應時間 +... 得到時間。複製程式碼
SonarQube 工作流程
SonarQube 並不是簡單地將各種質量檢測工具的結果(例如 FindBugs,PMD 等)直接展現給客戶,而是通過不同的外掛演算法來對這些結果進行再加工,最終以量化的方式來衡量程式碼質量,從而方便地對不同規模和種類的工程進行相應的程式碼質量管理。
SonarQube 在進行程式碼質量管理時,會從圖 1 所示的七個緯度來分析專案的質量。
SonarQube 不是那種安裝即可用的工具,他需要資料庫的支援,用於儲存檢測專案後的分析資料,同時為了實現可持續監測,還需要專案持續整合工具(如Jenkins)的支援,在構建版本前,通過Jenkins+Sonar 外掛執行專案分析指令,最終的結果會通過SonarQube 伺服器的Web 頁面展示。
下面我們就通過mysql+Jenkins+SonarQube 實現專案程式碼質量的可持續監測
安裝篇
SonarQube 的安裝
涉及到的知識點
- XCTool工具
- OClint工具
- Gcovr工具
- Git, SVN命令
- Linux 命令
- mysql 操作
- Jenkins工具
- Sonar工具
- Shell語法
- Sonar-runner工具
軟體及硬體的要求
SonarQube 的安裝通常需要滿足一定的軟硬體條件,具體要求如下所示:
Server 要求
Web server 最少需要 500MB 的記憶體空間,推薦記憶體空間大小 2GB。Sonar 在進行程式碼質量分析時,通常大約每 1 KLOC 需要儲存 350KB 左右的資料,所以要儘量為 SonarQube 的 web server 提供大的記憶體。
Database 要求
儘管 SonarQube 本身自帶嵌入的 Derby 資料庫,但是由於 Derby 比較簡單,所以在生產環境中強烈推薦安裝相應的企業版資料庫,SonarQube 支援的資料庫包括: MySQL 5.x+、Oracle10g+、PostgreSQL 9.x 和 MS SQLServer 2005 and 2008,推薦使用 MySQL。
Browser 要求
SonarQube 支援大多數的瀏覽器,包括 Firefox、Internet Explorer 7.x and 8.x and chromed 等,推薦使用 chromed。
目前官方最新的版本是6.2,但是對於部分外掛會存在不相容的問題,導致Sonar 服務啟動失敗,所以為了使用和演示,我採用了舊版本4.5.7,因為此版本相容 sonar-objective-c-plugin-0.3.1 外掛。更新:
關於XCode8的相容方案, 請看這篇文章
安裝步驟
資料庫配置
進入資料庫命令模式或者直接使用GUI 工具,建立Sonar-Qube 服務所需的資料庫
mysql -u root -p mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar'; mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar'; mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar'; mysql> FLUSH PRIVILEGES;複製程式碼
完成以後測試一下連線是否正確
安裝SonarQube 與SonarQube-Runner
SonarQube Runner 2.4 下載地址
從官網下載 SonarQube 的最新版本並解壓到
/usr/local/
資料夾新增SONAR_HOME、SONAR_RUNNER_HOME 環境變數,並將SONAR_RUNNER_HOME 加入PATH
修改Sonar-Qube 配置檔案
配置檔案路徑在
./conf/sonar.properties
# 設定資料庫的賬戶密碼 sonar.jdbc.username=ua sonar.jdbc.password=pwd sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance # By default, ports will be used on all IP addresses associated with the server. sonar.web.host=0.0.0.0 # The default value is root context (empty value). sonar.web.context=/ # TCP port for incoming HTTP connections. Default value is 9000. sonar.web.port=9003複製程式碼
執行如下命令啟動 Sonar-Qube,根據作業系統選擇
Last login: Wed Feb 15 18:15:05 on ttys000 localhost:~ tianyi$ /usr/local/sonarqube-6.2/bin/macosx-universal-64/sonar.sh start localhost:~ tianyi$ /usr/local/sonarqube-6.2/bin/macosx-universal-64/sonar.sh start Starting SonarQube... Started SonarQube.複製程式碼
建立一個簡單的工程
預設密碼是admin:admin,登陸管理員賬號以後,配置系統引數
建立一個Demo 工程
Demo 工程簡介
因為還沒有進行過分析,所以Demo 暫時只能配置,在使用篇我們會詳細介紹如果通過指令或自動化執行分析審查。
安裝一些必備外掛,都可以從官網或者github 上搜尋到
Sonar支援多種外掛,外掛的下載地址為:docs.codehaus.org/display/SON…
將下載後的外掛上傳到${SONAR_HOME}extensions\plugins目錄下,重新啟動sonar。
常用外掛
(注意版本號相容性問題)
- SonarQube 漢化包:github.com/SonarQubeCo…
- Objective-C 程式碼檢查:github.com/octo-techno…
- JavaScript 程式碼檢查:docs.codehaus.org/display/SON…
- python 程式碼檢查:docs.codehaus.org/display/SON…
- Web頁面檢查(HTML、JSP、JSF、Ruby、PHP等):docs.codehaus.org/display/SON…
- xml檔案檢查:docs.codehaus.org/display/SON…
- scm原始碼庫統計分析:docs.codehaus.org/display/SON…
- 檔案度量:docs.codehaus.org/display/SON…
- 中文語言包:docs.codehaus.org/display/SON…
- 時間表顯示度量結果:docs.codehaus.org/display/SON…
- 度量結果演進圖:docs.codehaus.org/display/SON…
我的資源
使用篇
使用SonarQube Runner分析原始碼
預置條件
已安裝SonarQube Runner且環境變數已配置,即sonar-runner命令可在任意目錄下執行
如何配置環境變數,參考這篇文章
如何分析
1. 在專案原始碼的根目錄下建立sonar-project.properties配置檔案
以iOS 專案為例
# Required metadata
sonar.projectKey=iOS::Demo
sonar.projectName=iOS::Demo
sonar.projectVersion=1.0
# Comma-separated paths to directories with sources (required)
sonar.sources=Demo
# Language
sonar.language=objectivec
# Encoding of the source files
sonar.sourceEncoding=UTF-8複製程式碼
注意:sonar.language 和安裝的程式碼審查外掛有關,需要安裝 sonar-objective-c 外掛,否則執行時會提示無法找到這個語言
2. 執行分析
在專案的根目錄執行分析指令
/usr/local/sonar-runner-2.4/bin/sonar-runner複製程式碼
檢視Sonar 分析的結果
以上是建立Demo 工程後,通過手動執行分析指令完成程式碼審查分析。
與Jenkins 持續整合
構建前操作
在jenkins的外掛管理中選擇安裝SonarQube-Scanner,該外掛可以使專案每次構建都呼叫sonar進行程式碼度量。
進入配置頁面對sonar外掛進行配置,如下圖:
以上配置可以使專案在構建前,自動執行程式碼審查和分析,結果會自動儲存並上傳到資料庫,通過Sonar 伺服器展示給開發者。
設定觸發器
每5分鐘檢查一次倉庫,若有上庫,則自動執行程式碼檢測
至此,通過Sonar 初步構建程式碼持續審查的工作完成。
問題篇
安裝中的問題
資源找尋的問題
文中提到的資原始檔,網上谷歌百度都用上,也找了很久,包括一些外掛的問題,必須安裝的就是 Sonar-Qube,Runner 其實不必要安裝,因為Jenkins 裡有外掛,可以直接使用。
環境配置問題
如果不常用指令的話,可以不配置,直接通過絕對路徑做操作,環境配置的方法參考這篇文章
初始化時遇到Sorry 的問題
遇到這種問題可以去根目錄 /log/xx.log 中檢視日誌,具體問題具體解決
漢化包的問題
如果你不習慣英文的使用,想做一做漢化的事情時,漢化包一定要對,如果有問題會導致服務啟動失敗。
附上:漢化包下載地址
SonarQube 實際使用中遇到的問題及解決方案
在使用 SonarQube6.2 分析程式碼質量時,可能會遇到的問題:
Xcode 8 相容性問題
原有的xctool已不支援XCode8, 改用xcodebuild + xcpretty 來替代xctool環節生成對應的產出物。
關於XCode8的相容方案, 請看這篇文章
結束語
程式碼質量管理對提高專案質量意義重大。本文介紹了 SonarQube 的工作原理,並從專案實戰的角度講解了使用 SonarQube 進行專案程式碼質量管理的流程和注意事項。
程式碼規範貴在堅持與執行力,自動審查只是做了提醒的作用,當然根據語言的規則,很多規範在使用者來講看似不合理或者不好用,有了這個工具,參與者們可以切身感受到團隊的成長。