[實踐]iOS Sonar整合流程詳解
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知識, 建議有空的話先學學。
4.2 工具-HomeBrew
“gem管理器”, 通過該工具可以安裝別的gem工具, 類似cocoapods。
有了此工具後, 以下的工具都可通過該工具來安裝, 正確的使用方式是先search 工具, 再install工具
4.3 工具-XCTool
此工具是用來代替XCode在伺服器上執行Build, Test等命令, 類似xcodebuild。
安裝方法:$brew install 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
5.Jenkins
Jenkins一般被稱為"構建器", 說簡單點就是 "定時觸發 + 配置任務"。Jenkins可以通過協同很多別的工具工作, 本文就是通過.sh(指令碼)來協同SVN/Git 與 各個工具, 來生成檔案並傳給Sonar伺服器。
更多Jenkins的知識具體看這兩篇教程。
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時是以別的電腦來訪問的。
附:
5.3 構建設定
Jenkins支援通過指令碼構建, 一般再次設定一些環境與變數, 然後執行指令碼。一般此處的設定要結合具體的指令碼呼叫方式來決定, 所以再第六節再詳細介紹。
我當前的設定是這樣的:
- 先設定環境變數
- 跳轉到工程根目錄下
- 把指令碼copy到當前目錄下
- 執行指令碼
5.4 定時構建
可以指定每天幾點執行一次, 或每週五執行一次, 當然也可以點選左上角的"立即構建"立即執行。
例: 設定為週一到週五的9點30~9點45之間進行
6.更多說明
6.1 Sonar配置
其實我對Sonar的配置不是很清楚, 先留個坑吧。 只知道最後通過runner-sonar工具將生成的檔案傳給了Sonar伺服器, 至於Sonar的配置引數, 則是從.sonar-project.properties檔案裡面獲取的。
run-sonar.sh在第一個github連結裡面, 在6.4中將.sh修改了, 同學們請注意; .properties下載第二個連結裡面的。
附:
6.2 工程配置
按照教程的指導, 將run-sonar.sh和sonar-project.properties放到根目錄下, 修改.properties檔案的內容, 然後執行run-sonar.sh就可以了。檔案下載地址:https://github.com/mjdetullio/sonar-objective-c
我是將.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上下載, 然後修改吧..
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:sonar-reports/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.未來接入方式與成本
- 專案中新增.properties配置檔案, 修改配置項;
- 在Jenkins新增對應的專案;
- 然後? 沒有然後了。
9.何去何從
在XCode8之後, XCTool已不支援了, 對這點我用xcodebuild+xcpretty來進行了替換, 具體詳情看我的這篇文章: https://my.oschina.net/ChenTF/blog/806565
相關推薦
[實踐]iOS Sonar整合流程詳解
1. Sonar介紹 行業內提到"程式碼質量管理, 自動化質量管理", 一般指的都是通過Sonar來實現。本文的目標是實現在Sonar上顯示出iOS專案, 先看張最終的效果圖: 用Sonar能夠實現什麼? 技術債務(sonar根據"規則"掃描出不符合規則的程式碼)覆蓋率(單元測試
iOS APP上架流程詳解
復制 存儲 iphone6 調試 5.1 編輯 gre 9.png 待審核 iOS APP上架流程詳解 青蔥烈馬 2016.04.28 前言:作為一名 iOS 開發工程師, APP 的上架是必備技能. iOS 上架的流程主要可以簡單總結為: 一個包,兩個
iOS整合支付寶支付流程詳解
接入前期準備工作 接入前期準備工作包括商戶簽約和金鑰配置。 開發包整合流程:(這裡只是講述iOS) 將我們下載的sdk壓縮包解壓,找到客戶端demo(PS:sdk下載連結:支付寶SDK下載) 匯入程式碼。 步驟一:啟動Xcode,把剛剛解壓的壓縮檔
iOS 企業版賬號打包及釋出-圖文流程詳解
每一版Xcode升級之後,Archieve打包的介面都會略有調整,今天我們來講一下Xcode9的企業版打包流程。 假設現在我們已有蘋果企業版開發者賬號 $299的,並且已經建立好證書、說明檔案等前期準備工作。下面我們從Archieve說起。 一、打包 1、Product-Archieve
iOS開發從申請開發賬號到APP上架的整體流程詳解
應公司要求,寫一份文件從申請賬號一直到APP上架的整體流程,下面進入正文。 首先第一步,申請開發者賬號: 開發者賬號有三種,分別是個人,組織,教育機構,其中組織又分為公司和企業,其中個人和公司都是99美金/
GCD實踐——序列佇列/併發佇列與iOS多執行緒詳解
GCD(Grand Central Dispatch),是蘋果提供的一個解決多執行緒開發的解決方案。GCD會自動管理執行緒的生命週期(建立執行緒,排程任務,銷燬執行緒),完全不需要我們管理,我們只需要告訴幹什麼就行。同時GCD使用block來進行任務的執行,用起
Spring與mybatis的整合實踐之SqlSessionTemplate持久化模板詳解
今天用SqlSessionTemplate持久化模板來整合spring和mybatis,其實差別不大,就是spring的配置檔案裡改一下,測試類改一下就可以了,如下 這是spring控制檔案的主要內容,需要注意的就是不要忘了把sqlsession注入測試類 <!--
iOS AppStore企業賬號打包釋出APP流程詳解
一、通過企業賬號申請證書 1 Certificate Signing Request (CSR)檔案 在Mac系統中進入“鑰匙串訪問”,選擇“鑰匙串訪問”-“證書助理”-“從證書頒發機構請求證書…”,如圖1所示: —>填寫前兩項,並選擇“儲存
【Unity】ios平臺IAP內購和沙箱測試流程詳解(開發中遇到的坑)
Unity iOS內購 內購流程 1、在 AppStore 中建立相應的物品,建立內購沙盒測試賬號2、客戶端從後臺獲取相應的物品 ID (當然也可以再客戶端寫死,但後期擴充套件性就受限制了)3、依據相應的物品 ID 請求商品的相關資訊4、依據商品資訊建立訂單請求交易5
SpringBoot2 整合Kafka元件,應用案例和流程詳解
本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、搭建Kafka環境 1、下載解壓 -- 下載 wget http://mirror.bit.edu.cn/apache/kafka/2.2.0/kafka_2.11-2.2.0.tgz -- 解壓 tar -zxvf kafka_2.11-2.2
Linux啟動流程詳解
linux 詳解 啟動流程 grub mbr 內核 linux啟動流程第一部分 Linux啟動基礎知識1.1 linux centos6.8啟動流程圖 BIOS加電自檢à加載MBRà加載啟動grubà加載內核à啟動/sbin/i
OC學習小結之ios運行過程詳解
for cat 用戶 with res nbsp c學習 launch cati 1)ios核心類 UIView 視圖,屏幕上能看得見的東西都是視圖,例如:按鈕、文本標簽、和表格等 UIViewController:內部默認有個視圖(UIView),負責管理UIView的
CentOS安裝流程詳解
菜鳥取經路之linux系統安裝 對於剛剛接觸Linux的人們來說,遇到的第一個問題便是如何快速安裝一個Linux系統。我初次接觸 Linux時也是摸索許久才安裝成功。鑒於此,今天就給大家帶來完整詳細的Linux安裝過程。一、準備安裝所需的軟件 1、VMwareWorkstation
iOS 運行時詳解
序列 get not oci protocol caption 聲明 實現 att 註:本篇文章轉自:http://www.jianshu.com/p/adf0d566c887 一、運行時簡介 Objective-C語言是一門動態語言,它將很多靜態語言在編譯和鏈接時期做的事
iOS Code Signing: 解惑詳解
唯一標識 解惑 並且 iphone 條件 等於 個人開發 視覺 電腦 原文鏈接地址:http://www.cnblogs.com/andyque/archive/2011/08/30/2159086.html iPhone開發的代碼簽名 代碼簽名確保代碼的真實以及明確識
SSL協議握手工作流程詳解(雙向HTTPS流程)
包含 style strong 雙向認證 包括 返回 情況 身份認證 ssl 參考學習文檔:http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html SSL協議的工作流程: 服務器認證階段: 1)客戶端向服務
centos6啟動流程詳解
linux centos6 當我們在平常的工作學習的環境中使用linux時,我們只需要按一下開機鍵,系統就會自動為我們加載好相關配置,然後為我們打開操作界面,那麽在這個過程中究竟都發生了什麽,如果系統突然起不來了,那麽到底是啟動時的哪一部分發生了錯誤呢,下面,我們就來看看linux中的centos6啟動的
微信小程序支付及退款流程詳解
後臺 class receive 字典序 混亂 md5 package 清晰 超時時間 微信小程序的支付和退款流程 近期在做微信小程序時,涉及到了小程序的支付和退款流程,所以也大概的將這方面的東西看了一個遍,就在這篇博客裏總結一下。 首先說明一下,微信小程序支付的主要邏輯
Spring MVC整合Velocity詳解
springmvcvelocity一、Velocity簡介Velocity是一個基於java的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。當Velocity應用於web開發時,界面設計人員可以和java程序
SpringMVC框架及基本工作流程詳解
req isp 需要 用戶 數據呈現 工作流 esp servle 組件映射 傳統原生的JSP+Servlet在開發上過程上雖然簡單明了,JSP頁面傳遞數據到Servlet,Servlet整理數據(邏輯開發)或者從數據庫提取數據接著再轉發到JSP頁面上,但是其似乎只能止步於