iOS Sonar 集成流程

https://gold.xitu.io/entry/5781e6872e958a0054c93368html

全部文章目錄:http://my.oschina.net/ChenTF/blog/677112java

轉載請註明出處, 有用的話請贊一下哦。ios

1. Sonar介紹

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

查看圖片github

     用Sonar可以實現什麼?objective-c

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

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

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

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

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

2. 概述

    Sonar原生並不支持iOS, 因此就須要咱們本身按照Sonar原理來安裝各個工具, 並將各個工具鏈接起來, 生成質量結果, 並由Jenkins來實現自動化執行。

    但因爲涉及到的知識範圍很廣, 不只須要iOS開發技術, 還須要運維知識和各個命令工具的使用方法。 並且國內外的資料少的至關可憐, 沒有最佳實踐, 沒有專門的第三方平臺, 形成不少東西都是一步步試錯出來的, 一步一坎, 因此用了很長時間。

     不過最後都將每一個工具, 每一個步驟打通, 將各個工具鏈接起來, 整理成.sh腳本 和 .properties配置文件, 這樣在後續新添項目時會很輕鬆。

3. 宏觀介紹

3.1 配置關係圖

查看圖片

3.2 涉及到的知識點

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

3.3 關係邏輯講解

  1. 每一個項目添加一個配置文件(.properties), 爲了在Jenkins上調用命令時能自動填充項目設置;
  2. 在Jenkins上安裝各個工具(XCTool, OCLint, gcovr, sonar-runner) 與 .sh腳本, Jenkins服務器能夠從代碼倉庫clone下代碼, 而後經過.sh腳本與.properties配置文件來調用各個「工具」, 而後每一個項目生成對應的「文件」;
  3. 在 .sh腳本 最後會經過sonar-runner將生成的 」文件」 傳給Sonar服務器, Sonar服務器以圖形化的形式顯示出對應的結果。
  4. 具體傳遞給哪一個sonar服務器與項目名, 都是在.properties中進行配置

4.環境配置

4.1 基礎知識

     其實Sonar的展現是將一系列的報告文件轉換獲得的, 文件又是經過各個工具生成的, 因此須要先安裝工具。

     涉及到的工具包括(1.xctool 2.oclint, 3.gcovr, 4.sonar-runner), 雖然涉及的工具比較多, 每一個用法均可詳細的單獨講, 但不建議在開始時就深刻了解這些, 本文會將用到的地方進行講解, 後續深刻了解請看給出的推薦資料。

     在接下來的步驟中, 須要具有基礎的Linuxl知識與Shell知識, 建議有空的話先學學。

     Linux教程: http://c.biancheng.net/cpp/html/2726.html

     Shell教程: http://c.biancheng.net/cpp/view/6994.html

4.2 工具-HomeBrew

    「gem管理器」, 經過該工具能夠安裝別的gem工具, 相似cocoapods。

     安裝方法: http://brew.sh/index_zh-cn.html

     詳細介紹: https://github.com/Homebrew/brew/blob/master/share/doc/homebrew/README.md#readme

     有了此工具後, 如下的工具均可經過該工具來安裝, 正確的使用方式是先search 工具, 再install工具    

4.3 工具-XCTool

     此工具是用來代替XCode在服務器上執行Build, Test等命令, 相似xcodebuild。

     安裝方法:$brew install xctool

     詳細介紹: https://github.com/facebook/xctool

4.4  工具-OCLint

     OCLint是一個靜態分析工具, 能夠檢測OC代碼, 發現語法漏洞。用該工具來生成代碼質量報告(技術債務)。

     安裝方式:

     $ brew install Caskroom/cask/oclint

     $ brew tap oclint/formulae

     $ brew install oclint  (不走上面的命令直接install oclint的話, 下載的版本不是最新版, 文檔將不能正常生成)

4.5 工具-Gcovr

     該工具是用來生成單元測試覆蓋率的文檔的

     安裝方式: $brew install gcovr

4.6 環境-JDK

     教程: http://jingyan.baidu.com/article/ce09321b7c111f2bff858fea.html

5.Jenkins

     Jenkins通常被稱爲"構建器", 說簡單點就是 "定時觸發 + 配置任務"。Jenkins能夠經過協同不少別的工具工做, 本文就是經過.sh(腳本)來協同SVN/Git 與 各個工具, 來生成文件並傳給Sonar服務器。

     更多Jenkins的知識具體看這兩篇教程。

     http://www.cnblogs.com/zz0412/p/jenkins02.html

     http://www.cnblogs.com/horizonli/p/5330073.html

5.1 新建一個工程

查看圖片

5.2 代碼倉庫設置

5.2.1 SVN

查看圖片

關於credential:

          Jenkins檢測到當前服務器訪問不了代碼倉庫時, 會提示你設置權限, 進入Credential, 設置帳號密碼就能夠了。

5.2.2 Git方式

查看圖片

git的Credentials設置:

查看圖片

設置好username與private key(能訪問git電腦的私鑰)就能夠了, Passphrase會自動生成。

關於公鑰私鑰的介紹:

     通常的SSH方式是在git服務器的SSH設置裏面添加本身當前電腦的公鑰(id_rsa.pub)。而後當前電腦訪問Git服務器時就能直接訪問了。

     但Jenkins須要在Git上設置好當前電腦的私鑰後, 還須要將當前電腦的私鑰(id_rsa)保存在Jenkins配置中。猜想是訪問git時是以別的電腦來訪問的。

Git教程 :http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

5.3 構建設置

     Jenkins支持經過腳本構建, 通常再次設置一些環境與變量, 而後執行腳本。通常此處的設置要結合具體的腳本調用方式來決定, 因此再第六節再詳細介紹。

查看圖片

我當前的設置是這樣的:

  1. 先設置環境變量
  2. 跳轉到工程根目錄下
  3. 把腳本copy到當前目錄下
  4. 執行腳本

5.4 定時構建

     能夠指定天天幾點執行一次, 或每週五執行一次, 固然也能夠點擊左上角的"當即構建"當即執行。

例: 設置爲週一到週五的9點30~9點45之間進行

查看圖片

6.更多說明

6.1 Sonar配置

     本項目的配置指導來源於"https://github.com/octo-technology/sonar-objective-c", 後發現教程中的配置很差用, 最後找到這篇Fork的文章"https://github.com/mjdetullio/sonar-objective-c", 最後是按照第二篇的設置進行的。sonar的配置具體看第二篇文章

     其實我對Sonar的配置不是很清楚, 先留個坑吧。 只知道最後經過runner-sonar工具將生成的文件傳給了Sonar服務器, 至於Sonar的配置參數, 則是從.sonar-project.properties文件裏面獲取的。

     Sonar官網: http://www.javatips.net/blog/sonarqube-tutorial

     Sonar安裝: http://www.uml.org.cn/jchgj/201307251.asp

6.2 工程配置

     按照教程的指導, 將run-sonar.sh和sonar-project.properties放到根目錄下, 修改.properties文件的內容, 而後執行run-sonar.sh就能夠了。

     我是將.properties隨項目走, 由於每一個項目的配置不同, 而run-sonar.sh是固定不變的, 因此放在了Jenkins服務器上, 再執行構建時將其拷貝到當前目錄下。

介紹些配置過程當中用到的命令, 方便你們:

$ ssh 用戶名@服務器地址     // 經過bash訪問遠程服務器

$ scp /Users/xxx/Documents/svn/run-sonar.sh pmo-mini@111.222.2.444:~/opt/iosShell/run-sonar.sh  // 將本地的sh文件copy到遠程服務器對應的位置

$ chmod u=rxw run-sonar.sh // 修改文件權限, 使其爲可讀可寫可執行

6.3 腳本執行流程與生成物介紹

     clear 

     build

     test        :     TEST-report.xml

     gcovr     :     coverage-xxx.xml

     oclint     :      oclint.xml

     TEST-report.xml 是經過xctool的test命令生成的, 若是生成失敗會有2, 3行的默認文本, 這時就能夠證實是執行到test時失敗了, 建議先用xcode執行測試, 把環境調通了, 更多單元測試文章, 請看個人 "iOS單元測試入門與配置"篇;

     coverage-XiangMu.xml 是單測覆蓋率報告, 若是你的單測覆蓋率有誤, 看這個文檔。走完test後, 在XCode的路徑文件下, 會生成項目的覆蓋率報告, 而後gcovr命令根據這些報告生成覆蓋率報告。 通常覆蓋率報告有問題都是test環節有問題

     oclint.xml 是技術債務報告, 通常build環節沒有問題, 這個報告就沒問題。

6.4 腳本分享

    由於github上的腳本執行時到test命令就錯誤了, 因此將我修改後的分享出來。

    沒有找到能上次文件的地方, 把腳本因此內容全貼出來太浪費地方了, 就分享修改的地方吧, 你們從github上下載, 而後修改吧..

else echo -n 'Running tests using xctool' # runCommand sonar-reports/TEST-report.xml $xctoolCmdPrefix -scheme "$testScheme" -reporter junit GCC_GENERATE_TEST_COVERAGE_FILES=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES test # ctf:這個命令出錯, 用下面的命令代替 $xctoolCmdPrefix -scheme "$testScheme" -reporter junit:TEST-report.xml GCC_GENERATE_TEST_COVERAGE_FILES=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES test echo -n 'Computing coverage report' # We do it for every xcodeproject (in case of workspaces)

7.成果

7.1 技術債務

查看圖片

          不只能夠顯示出有多少不符合」規則」的代碼片斷,還能根據代碼倉庫的提交歷史對應到時誰的問題

7.2 覆蓋率

查看圖片

    能夠檢測到單元測試的覆蓋範圍,監督單元測試覆蓋範圍。

7.3 重複

查看圖片

          檢測到類似的代碼片斷,提醒將經常使用的功能封裝起來,提升重用性。

7.4 結構

查看圖片

      項目的文件結構    

7.5 代碼

查看圖片

7.6 問題

查看圖片

8.將來接入方式與成本

  1. 項目中添加.properties配置文件, 修改配置項;
  2. 在Jenkins添加對應的項目;
  3. 而後? 沒有而後了。
相關文章
相關標籤/搜索