iOS Sonar集成流程詳解

所有文章目錄:http://my.oschina.net/ChenTF/blog/677112

本篇文章地址:  http://my.oschina.net/ChenTF/blog/708646

對您有幫助的話, 還請"贊" 一下哦, 有問題可留言或加QQ羣:323276186

關於XCode8的兼容方案, 請看我的這篇文章:https://my.oschina.net/ChenTF/blog/80656

1. Sonar介紹

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

1240

用Sonar能夠實現什麼?

技術債務(sonar根據"規則"掃描出不符合規則的代碼)

覆蓋率(單元測試覆蓋率)

重複(重複的代碼, 有利於提醒封裝)

結構

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

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

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

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

2. 概述

Sonar原生並不支持iOS, 所以就需要我們自己按照Sonar原理來安裝各個工具, 並將各個工具連接起來, 生成質量結果, 並由Jenkins來實現自動化執行。

但由於涉及到的知識範圍很廣, 不僅需要iOS開發技術, 還需要運維知識和各個命令工具的使用方法。 而且國內外的資料少的相當可憐, 沒有最佳實踐, 沒有專門的第三方平臺, 造成很多東西都是一步步試錯出來的, 一步一坎, 所以用了很長時間。

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

3. 宏觀介紹

3.1 配置關係圖

1240

3.2 涉及到的知識點

XCTool工具

OClint工具

Gcovr工具

Git, SVN命令

Linux命令

Jenkins工具

Sonar工具

Shell語法

Sonar-runner工具

3.3 關係邏輯講解

每個項目添加一個配置文件(.properties), 爲了在Jenkins上調用命令時能自動填充項目設置;

在Jenkins上安裝各個工具(XCTool, OCLint, gcovr, sonar-runner) 與 .sh腳本, Jenkins服務器可以從代碼倉庫clone下代碼, 然後通過.sh腳本與.properties配置文件來調用各個“工具”, 然後每個項目生成對應的“文件”;

在 .sh腳本 最後會通過sonar-runner將生成的 ”文件” 傳給Sonar服務器, Sonar服務器以圖形化的形式顯示出對應的結果。

具體傳遞給哪個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 新建一個工程

1240

5.2 代碼倉庫設置

5.2.1 SVN

1240

關於credential:

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

5.2.2 Git方式

1240

git的Credentials設置:

1240

設置好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支持通過腳本構建, 一般再次設置一些環境與變量, 然後執行腳本。一般此處的設置要結合具體的腳本調用方式來決定, 所以再第六節再詳細介紹。

1240

我當前的設置是這樣的:

先設置環境變量

跳轉到工程根目錄下

把腳本copy到當前目錄下

執行腳本

5.4 定時構建

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

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

1240

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 [email protected]:~/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上下載, 然後修改吧..

elseecho-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 

testecho-n'Computing coverage report'

# We do it for every xcodeproject (in case of workspaces)

7.成果

7.1 技術債務

1240

不僅可以顯示出有多少不符合”規則”的代碼片段,還能根據代碼倉庫的提交歷史對應到時誰的問題

7.2 覆蓋率

1240

可以檢測到單元測試的覆蓋範圍,監督單元測試覆蓋範圍。

7.3 重複

1240

檢測到相似的代碼片段,提醒將常用的功能封裝起來,提高重用性。

7.4 結構

1240

項目的文件結構

7.5 代碼

1240

7.6 問題

1240

8.未來接入方式與成本

項目中添加.properties配置文件, 修改配置項;

在Jenkins添加對應的項目;

然後? 沒有然後了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章