經過Sonar 初步構建代碼持續審查

SonarQube

介紹篇

SonarQube 介紹

SonarQube 是一款領先的持續代碼質量監控平臺,開源在github 上,如今已更新到6.2 版本,star 數量超過 1400+,能夠輕鬆配置在內網服務器,實時監控代碼,幫助瞭解提高提高團隊項目代碼質量。經過插件機制,SonarQube能夠繼承不一樣的測試工具,代碼分析工具,以及持續集成工具。javascript

與持續集成工具(例如 Hudson/Jenkins 等)不一樣,SonarQube 並非簡單地把不一樣的代碼檢查工具結果(例如 FindBugs,PMD 等)直接顯示在 Web 頁面上,而是經過不一樣的插件對這些結果進行再加工處理,經過量化的方式度量代碼質量的變化,從而能夠方便地對不一樣規模和種類的工程進行代碼質量管理。html

在對其餘工具的支持方面,Sonar 不只提供了對 IDE 的支持,能夠在 Eclipse 和 IntelliJ IDEA 這些工具裏聯機查看結果;同時 SonarQube 還對大量的持續集成工具提供了接口支持,能夠很方便地在持續集成中使用 SonarQube。java

此外,SonarQube 的插件還能夠對 Java 之外的其餘編程語言提供支持,對國際化以及報告文檔化也有良好的支持。python

行業內提到"代碼質量管理, 自動化質量管理", 通常指的都是經過Sonar來實現。本文的目標是實如今Sonar上顯示出iOS項目, 先看張最終的效果圖:mysql

SonarQube

用Sonar可以實現什麼?git

  • 技術債務(sonar根據"規則"掃描出不符合規則的代碼)
  • 覆蓋率(單元測試覆蓋率)
  • 重複(重複的代碼, 有利於提醒封裝)
  • 結構

問題1: "規則"指的是什麼? github

在Sonar工具中配置檢測工具(規則), 而後sonar根據規則檢測"質量報告文件", 得出問題數目。 好比本文配置的規則是OCLint複製代碼

問題2: 技術債務的天數怎麼得出?web

每一個規則都有對應的處理時間, 最後:問題類型1數目 * 對應時間 + 問題類型2數目 * 對應時間 +... 獲得時間。複製代碼

SonarQube 工做流程

SonarQube 並非簡單地將各類質量檢測工具的結果(例如 FindBugs,PMD 等)直接展示給客戶,而是經過不一樣的插件算法來對這些結果進行再加工,最終以量化的方式來衡量代碼質量,從而方便地對不一樣規模和種類的工程進行相應的代碼質量管理。objective-c

SonarQube 在進行代碼質量管理時,會從圖 1 所示的七個緯度來分析項目的質量。算法

圖 1

SonarQube 不是那種安裝便可用的工具,他須要數據庫的支持,用於存儲檢測項目後的分析數據,同時爲了實現可持續監測,還須要項目持續集成工具(如Jenkins)的支持,在構建版本前,經過Jenkins+Sonar 插件執行項目分析指令,最終的結果會經過SonarQube 服務器的Web 頁面展現。

網絡圖

下面咱們就經過mysql+Jenkins+SonarQube 實現項目代碼質量的可持續監測

安裝篇

SonarQube 的安裝

涉及到的知識點

  • XCTool工具
  • OClint工具
  • Gcovr工具
  • Git, SVN命令
  • Linux 命令
  • mysql 操做
  • Jenkins工具
  • Sonar工具
  • Shell語法
  • Sonar-runner工具

軟件及硬件的要求

SonarQube 的安裝一般須要知足必定的軟硬件條件,具體要求以下所示:

  1. Server 要求

    Web server 最少須要 500MB 的內存空間,推薦內存空間大小 2GB。Sonar 在進行代碼質量分析時,一般大約每 1 KLOC 須要存儲 350KB 左右的數據,因此要儘可能爲 SonarQube 的 web server 提供大的內存。

  2. Database 要求

    儘管 SonarQube 自己自帶嵌入的 Derby 數據庫,可是因爲 Derby 比較簡單,因此在生產環境中強烈推薦安裝相應的企業版數據庫,SonarQube 支持的數據庫包括: MySQL 5.x+、Oracle10g+、PostgreSQL 9.x 和 MS SQLServer 2005 and 2008,推薦使用 MySQL。

  3. 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的兼容方案, 請看這篇文章

安裝步驟

  1. 數據庫配置

    進入數據庫命令模式或者直接使用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;複製代碼

    建立數據庫

    完成之後測試一下鏈接是否正確

  2. 安裝SonarQube 與SonarQube-Runner

    SonarQube Runner 2.4 下載地址

    從官網下載 SonarQube 的最新版本並解壓到/usr/local/文件夾

    SonarQube

    添加SONAR_HOME、SONAR_RUNNER_HOME 環境變量,並將SONAR_RUNNER_HOME 加入PATH

  3. 修改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複製代碼
  4. 運行以下命令啓動 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.複製代碼
  5. 建立一個簡單的工程

    默認密碼是admin:admin,登錄管理員帳號之後,配置系統參數

    建立一個Demo 工程

    建立一個工程

    Demo 工程簡介

    Demo 工程簡介

    由於尚未進行過度析,因此Demo 暫時只能配置,在使用篇咱們會詳細介紹若是經過指令或自動化執行分析審查。

  6. 安裝一些必備插件,均可以從官網或者github 上搜索到

    Sonar支持多種插件,插件的下載地址爲:docs.codehaus.org/display/SON…

    將下載後的插件上傳到${SONAR_HOME}extensions\plugins目錄下,從新啓動sonar。

經常使用插件

(注意版本號兼容性問題)

個人資源

使用篇

使用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 初步構建代碼持續審查的工做完成。

問題篇

安裝中的問題

  1. 資源找尋的問題

    文中提到的資源文件,網上谷歌百度都用上,也找了好久,包括一些插件的問題,必須安裝的就是 Sonar-Qube,Runner 其實沒必要要安裝,由於Jenkins 裏有插件,能夠直接使用。

  2. 環境配置問題

    若是不經常使用指令的話,能夠不配置,直接經過絕對路徑作操做,環境配置的方法參考這篇文章

  3. 初始化時遇到Sorry 的問題

    遇到這種問題能夠去根目錄 /log/xx.log 中查看日誌,具體問題具體解決

    sorry

  4. 漢化包的問題

    若是你不習慣英文的使用,想作一作漢化的事情時,漢化包必定要對,若是有問題會致使服務啓動失敗。

    附上:漢化包下載地址

SonarQube 實際使用中遇到的問題及解決方案

在使用 SonarQube6.2 分析代碼質量時,可能會遇到的問題:

  1. Xcode 8 兼容性問題

    原有的xctool已不支持XCode8, 改用xcodebuild + xcpretty 來替代xctool環節生成對應的產出物。

    關於XCode8的兼容方案, 請看這篇文章

結束語

代碼質量管理對提升項目質量意義重大。本文介紹了 SonarQube 的工做原理,並從項目實戰的角度講解了使用 SonarQube 進行項目代碼質量管理的流程和注意事項。

代碼規範貴在堅持與執行力,自動審查只是作了提醒的做用,固然根據語言的規則,不少規範在使用者來說看似不合理或者很差用,有了這個工具,參與者們能夠切身感覺到團隊的成長。

參考文章

[實踐]iOS Sonar集成流程詳解

[實踐]Sonar Xcode8兼容

SonarQube代碼質量管理平臺安裝與使用

配置sonar、jenkins進行持續審查

相關文章
相關標籤/搜索