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

jopen 9年前發布 | 26K 次閱讀 Jenkins 項目構建

本文為webfrogs原創,轉載請注明作者及出處!

簡介


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

下載并運行


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

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

java -jar jenkins.war --httpPort=8888

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

http://localhost:8888/

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

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。如下圖所示:

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

E-mail設置

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

發送郵件使用的是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搭建iOS開發的CI服務器

注意:在設置郵箱時,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搭建iOS開發的CI服務器

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

觸發條件設置

下一步,設置build的觸發條件,由于是做Daily Build,所以在“Build Triggers”中,選擇“Build periodically”,然后在輸入框中輸入build的規則,這里,我們的規則是每個工作日的下午6點25到30分之間進行build,所以在輸入 框中輸入“H(25-30) 18 * * 1-5”(點擊輸入框右邊的問號,會有詳細的規則編寫說明),如下圖。 使用Jenkins搭建iOS開發的CI服務器

編譯設置

然后,進行對工程編譯的相關設置。這里,可以使用Jenkins自帶的xcode插件(需要安裝,參考上面git插件的安裝方法)來完成,也可以自 己編寫腳本來完成。編寫腳本時,可以直接使用Xcode的xcodebuild來寫,也可以使用非死book提供的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

如圖所示: 使用Jenkins搭建iOS開發的CI服務器

說明:如果不使用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”,在輸入框中輸入編譯失敗后郵件的通知者郵箱,如有多個,以空白字符分隔,如下圖: 使用Jenkins搭建iOS開發的CI服務器

至此,一個Daily Build的Job基本設置完成,點擊“Save”按鈕保存設置。在Job中,點擊“Build Now”,測試下我們剛才的配置。如果build失敗,可以點擊“Console Output”查看log來查找錯誤的地方。如果成功,在相應的build中,可以看到如下圖的內容: 使用Jenkins搭建iOS開發的CI服務器

單元測試


在本例中,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添加到版本控制中并上傳到遠程倉庫。如下圖

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

“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的結果里,可以看到相應的測試報告,點擊進去會有詳細的信息,如下圖:

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

最后


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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!