使用Jenkins搭建iOS開發的CI服務器

目錄

    簡介 
    下載並運行 
    Jenkins配置 
        安裝git插件 
        E-mail設置 
    自動化構建 
        遠程倉庫設置 
        觸發條件設置 
        編譯設置 
        編譯後行爲設置 
    單元測試 
    最後html

簡介

持續集成CI(continuous integration)是一種能夠增長項目可見性,下降項目失敗風險的開發實踐。iOS開發中CI的選擇有不少,好比可使用Apple提供的Bots來完成自動化構建和單元測試,其優勢就是和Xcode深度集成,只需幾步配置就能夠完成,缺點就是不夠靈活,可定製化程度不高。這篇文章主要講解如何使用開源社區的一個CI工具Jenkins來搭建iOS開發的CI環境。若是是搭建單獨CI服務器的話,就須要一臺單獨的mac機器了。java

下載並運行

打開Jenkins的官網,在頁面的右側,點擊下載最新版本的Jenkins的war包。ios

下載完成後,打開terminal,進入到war包所在目錄,執行命令:git

java -jar jenkins.war --httpPort=8888

httpPort指定的就是Jenkins所使用的http端口,這裏指定8888,可根據具體狀況修改。待Jenkins啓動後,打開瀏覽器輸入地址:github

http://localhost:8888/

即可以打開Jenkins的管理界面了。web

Jenkins配置

安裝git插件

Jenkins默認沒有安裝git插件,須要手動選擇安裝。進入Jenkins的管理界面,依次選擇Manage Jenkins->Manage Plugins,選中「Available」選項,在頁面的右上角的「Filter」中輸入git過濾條件,在全部列出的結果中,選中「Git Client Plugin」和「Git Server Plugin」這兩個選項,而後點擊按鈕「Download now and install after restart」。等待插件下載安裝成功後,重啓Jenkins。以下圖所示:shell

圖片

E-mail設置

Jenkins能夠在適當的時機發送郵件通知,好比自動化構建失敗時。這就須要對E-mail的發送進行相關的設置。xcode

發送郵件使用的是SMTP協議,首先要設置Jenkins的管理員郵箱,在Manage Jenkins->Configure System的「Jenkins Location」中設置「System Admin e-mail address」爲須要的郵箱,也就是Jenkins發送郵件的發件人。瀏覽器

接下來設置郵件SMTP的相關信息,在「E-mail Notification」區域中,點擊「Advanced...」按鈕,而後進行設置,首先填寫SMTP服務器地址,選中「Use SMTP Authentication」的複選框,而後輸入用戶名和密碼,最後在「Test configuration by sending test e-mail」中輸入一個測試郵箱來測試郵件是否能發送成功。若是成功,會有相關提示,以下圖所示。服務器

圖片

注意:在設置郵箱時,Jenkins管理員郵箱要與SMTP中設置的發送郵箱爲同一個郵箱,不然在使用好比qq郵箱或者是163郵箱時,就會報錯。

自動化構建

在Jenkins中,全部的任務都是以「Job」爲單位的。下面以新建一個iOS項目Daily Build的自動化構建Job爲例來作一個演示。

在Jenkins管理的首頁左側,點擊「New Job」,接下來輸入Job的名字,這裏輸入「Dailybuild」,選擇「Build a free-style software project」而後點擊「OK」,進入下一個頁面。

遠程倉庫設置

首先進行版本控制的相關設置,這裏咱們選擇git。輸入git的倉庫地址,而後選擇須要build的分支,另外,在「Additional Behaviours」中,還能夠選擇一些額外的git操做。以下圖。

圖片

提示:Jenkins使用當前用戶.ssh目錄下的公私鑰來進行git的相關操做。

觸發條件設置

下一步,設置build的觸發條件,因爲是作Daily Build,因此在「Build Triggers」中,選擇「Build periodically」,而後在輸入框中輸入build的規則,這裏,咱們的規則是每一個工做日的下午6點25到30分之間進行build,因此在輸入框中輸入「H(25-30) 18 * * 1-5」(點擊輸入框右邊的問號,會有詳細的規則編寫說明),以下圖。圖片

編譯設置

而後,進行對工程編譯的相關設置。這裏,可使用Jenkins自帶的xcode插件(須要安裝,參考上面git插件的安裝方法)來完成,也能夠本身編寫腳原本完成。編寫腳本時,能夠直接使用Xcode的xcodebuild來寫,也可使用Facebook提供的xctool來作。但在本例中使用的是本人遍寫的makefile來完成編譯打包。這個makefile的功能有:指定Provisioning Profile打包編譯,生成itms-services協議相關文件並以scp或者ftp方式上傳到服務器來實現ota功能,發送郵件通知和iMessage通知。使用的makefile的github地址在這裏,裏面有使用說明。

點擊「Add build step」按鈕,選擇「Execute shell」,在command中輸入一下內容:

#!/bin/zsh
make clean
make
make upload
make sendEmail
make sendIMsg

如圖所示:圖片

說明:若是不使用iMessage通知,能夠去掉第一行和最後一行,不然,Jenkins默認的shell會致使iMessage通知不能正常發送。

編譯後行爲設置

工程成功編譯之後,咱們能夠設置編譯出來的ipa文件(甚至能夠直接是ota文件),將其與本次build的相關結果放到一塊兒,提供下載。也能夠在build失敗時,發送郵件提醒。設置以下。

點擊「Add post-build action」選擇「Archive the artifacts」,在輸入框中輸入「build/*.ipa」,就能夠將編譯打包後的ipa文件集成。點擊「Add post-build action」選擇「E-mail Notification」,在輸入框中輸入編譯失敗後郵件的通知者郵箱,若有多個,以空白字符分隔,以下圖:圖片

至此,一個Daily Build的Job基本設置完成,點擊「Save」按鈕保存設置。在Job中,點擊「Build Now」,測試下咱們剛纔的配置。若是build失敗,能夠點擊「Console Output」查看log來查找錯誤的地方。若是成功,在相應的build中,能夠看到以下圖的內容:圖片

單元測試

在本例中,iOS工程的單元測試選擇xcode自帶的XCTest框架(Xcode5以前叫作OCUnit)。建立單元測試Job和自動化構建的Job過程同樣,只在觸發構建規則,build的腳本和編譯後的規則有些不一樣。如下只說明不一樣的地方。

單元測試的觸發規則應該在git倉庫的每次有新提交時就觸發執行,因此在"Build Triggers"中,選擇「Poll SCM」,在規則中寫入「H/10 * * * *」,意思是每十分鐘輪詢一次遠程倉庫,若是有新的提交,則開始構建。能夠根據本身需求來設置輪詢的時間間隔。

接下來是在build中輸入單元測試腳本。這裏須要有一些準備,首先,因爲Jenkins只接收Junit的單元測試報告,這裏要安裝一個將腳本執行結果的ocunit格式的測試報告轉化爲JUnit報告格式的腳本,該項目名叫OCUnit2JUnit,項目地址點這裏。安裝很是簡單,命令行下執行gem install ocunit2junit(可能須要sudo權限)。第二步,須要在當前項目工程中,將項目schemes共享,並上傳到遠程倉庫。在工程中選擇「Manage Schemes」在彈出的菜單中勾選「Shared」,而後在git中將相應的shared shceme添加到版本控制中並上傳到遠程倉庫。以下圖

圖片

「Build」配置中,依然選擇「Execute shell」,shell的內容以下:

xcodebuild test -scheme testCI -sdk iphonesimulator7.0 -destination OS=7.0,name="iPhone Retina (4-inch)" -configuration Debug  2>&1 | ocunit2junit

這裏的單元測試是在模擬器中進行,若是測試服務器鏈接着iOS設備,也能夠設置在iOS設備中進行,只需修改上述shell的參數便可。

最後是編譯後行爲的設置,這裏要將測試報告加入。點擊「Add post-build action」選擇「Publish JUnit test result report」,輸入內容test-reports/*.xml保存設置。

接下來在單元測試的Job中,點擊「Build Now」來測試一下Job的配置,若是配置正確,則會看到模擬器啓動,而後運行了一下程序,以後在build的結果裏,能夠看到相應的測試報告,點擊進去會有詳細的信息,以下圖:

圖片

最後

羋峮在《豆瓣ios自動化測試實踐和經驗》(視頻地址PPT地址)中提到Jenkins還能夠集成UIAutomation來進行iOS的UI方面的自動化測試,而且還發布了他們本身封裝的UI測試工具ynm3k,項目地址點這裏。待研究以後再寫下相關的經驗吧。

相關文章
相關標籤/搜索