1. 程式人生 > >[實踐]iOS Sonar整合流程詳解

[實踐]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 關係邏輯講解

  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知識, 建議有空的話先學學。

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支援通過指令碼構建, 一般再次設定一些環境與變數, 然後執行指令碼。一般此處的設定要結合具體的指令碼呼叫方式來決定, 所以再第六節再詳細介紹。

我當前的設定是這樣的:

  1. 先設定環境變數
  2. 跳轉到工程根目錄下
  3. 把指令碼copy到當前目錄下
  4. 執行指令碼

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.未來接入方式與成本

  1. 專案中新增.properties配置檔案, 修改配置項;
  2. 在Jenkins新增對應的專案;
  3. 然後? 沒有然後了。

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頁面上,但是其似乎只能止步於