使用Jenkins搭建iOS開發的CI伺服器
[http://webfrogs.me/2013/12/31/jenkins-ios-ci/?utm_campaign=ios_wiki_dev_issue_1&utm_source=ios_wiki_com&utm_medium=website]
目錄
簡介
持續整合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
E-mail設定
Jenkins可以在適當的時機發送郵件通知,比如自動化構建失敗時。這就需要對E-mail的傳送進行相關的設定。
傳送郵件使用的是SMTP協議,首先要設定Jenkins的管理員郵箱,在Manage Jenkins->Configure System
接下來設定郵件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
,專案地址點這裡。待研究之後再寫下相關的經驗吧