所有文章目錄: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項目, 先看張最終的效果圖:
用Sonar能夠實現什么?
技術債務(sonar根據"規則"掃描出不符合規則的代碼)
覆蓋率(單元測試覆蓋率)
重復(重復的代碼, 有利于提醒封裝)
結構
問題1: "規則"指的是什么?
在Sonar工具中配置檢測工具(規則), 然后sonar根據規則檢測"質量報告文件", 得出問題數目。 比如本文配置的規則是OCLint
問題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 關系邏輯講解
每個項目添加一個配置文件(.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?新建一個工程
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支持通過腳本構建, 一般再次設置一些環境與變量, 然后執行腳本。一般此處的設置要結合具體的腳本調用方式來決定, 所以再第六節再詳細介紹。
我當前的設置是這樣的:
先設置環境變量
跳轉到工程根目錄下
把腳本copy到當前目錄下
執行腳本
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上下載, 然后修改吧..
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 技術債務
不僅可以顯示出有多少不符合”規則”的代碼片段,還能根據代碼倉庫的提交歷史對應到時誰的問題
7.2 覆蓋率
可以檢測到單元測試的覆蓋范圍,監督單元測試覆蓋范圍。
7.3 重復
檢測到相似的代碼片段,提醒將常用的功能封裝起來,提高重用性。
7.4 結構
項目的文件結構
7.5 代碼
7.6 問題
8.未來接入方式與成本
項目中添加.properties配置文件, 修改配置項;
在Jenkins添加對應的項目;
然后? 沒有然后了。