构建iOS持续集成平台(三)——CI服务器与自动化部署
http://www.infoq.com/cn/articles/build-ios-continuous-integration-platform-part3
CI服務器
寫到這兒,對于iOS開發者來說,需要準備好:
- 一個比較容易獲取的源代碼倉庫(包含源代碼)
- 一套自動化構建腳本
- 一系列圍繞構建的可執行測試
接下來就需要一個CI服務器來根據源代碼的變更觸發構建,監控測試結果。目前,業界比較流行的,支持iOS構建的CI服務器有Travis CI和Jenkins
Travis CI
Travis CI【20】是一個免費的云服務平臺,主要功能就是為開源社區提供免費的CI服務,對于商業用戶可以使用Travis Pro版本,其基本上支持所有目前主流的語言,Object-C自然也在其中。但是,Travis CI只支持github極大的限制了其應用場景。但是也由于其只支持github,其把和github的集成做到了極致的平滑,易用,因此,對于本就把github作為代碼托管平臺的項目來說,Travis CI可以做為第一選擇。
使用Travis CI只需要簡單的2步即可為你托管在github的項目增加一個CI服務器
第一步:在項目的根目錄下創建travis CI配置文件“.travis.yml”,在配置文件指定語言,環境要求,構建腳本等
language: objective-c before_install:- brew update- brew install xctool script: xctool -project LighterViewControllerDemo.xcodeproj -scheme LighterViewControllerDemo -sdkiphonesimulator test第二步:使用github賬號登陸Travis CI,在賬戶的repositories開啟該項目的自動構建功能,該設置會在github上該項目repository中開啟對Travis CI的Service Hook
相關廠商內容
去哪兒、京東、唯品會、天貓分享電商系統架構經驗
騰訊、歡聚時代、小米暢談運維新時代
智能硬件大幕拉開,意見領袖亮相ArchSummit架構師峰會
相關贊助商
全球架構師峰會,7月18-19日,深圳萬科會議中心舉辦,精彩呈現!
下圖就是我的一個iOS項目在Travis CI的構建記錄:
除此之外,Travis CI還非常貼心的提供了一個指示燈,可以讓開發者在自己的repository展示構建狀態。使用指示燈的方法很簡單,只需要在repository的README.md中添加下面這行代碼就行了。
[](https://travis-ci. org/xianlinbox/iOSCIDemo)效果如下:
Jenkins
Jenkins【21】經過多年的發展,其活躍的社區和豐富的插件讓其成為了業界最受歡迎的CI服務器。通過使用Xcode插件,可以非常方便在Jenkins中運行iOS項目的構建腳本。
安裝
Jenkins的安裝非常簡單,尤其是在Mac環境下使用Homebrew安裝,只需要簡單的使用“brew install jenkins”,即可成功安裝,這個安裝過程做的事情非常簡單,就是把對應版本的jenkins.war文件下載到對應的目錄“/usr/local/Cellar/jenkins/1.524/libexec/”。因此,如果沒有Homebrew,可以直接到官網下載安裝文件,自己安裝。
配置安裝完之后,只需要使用“java -jar */jenkins.war”即可啟動Jenkins,開發者可以自己創建一個bash alias簡化輸入,在用戶目錄下的.bashrc文件中添加如下代碼
aliasjenkins='java -jar /Applications/Jenkins/jenkins.war'啟動Jenkins之后,可以通過瀏覽器訪問http://localhost:8080查看Jenkins界面。
然后,開發者可以到Manage Plugins界面,安裝需要的插件:Xcode Plugin,Git Plugin,Github Plugin(我使用git做源代碼管理),Cocoapods Plugin。安裝好插件之后,需要重啟Jenkins,一切就緒之后,開始配置自己的iOS構建過程。
在Jenkins中配置一個iOS Job的步驟如下:
點擊“Add build step”添加構建步驟,如果已安裝Xcode插件,則可以在Step類型中看到Xcode選項:
選擇Xcode,可以看到Xcode構建step的所有配置選項:
點擊“Add build step”添加測試步驟,選擇“Execute shell”選項,然后,添加腳本,執行測試并生成期望的Report, 可以重復本步驟添加“Acceptaince Test”等構建步驟。
path-to/xctool.sh -workspaceAudioDemo.xcworkspace -scheme AudioDemo -sdkiphonesimulator -reporter junit:test-reports/junit-report.xml clean test點擊“Add post-build action”添加一個新的步驟,選擇“publish Junit test result report”,把測試報告展示在Jenkins中。
配置好之后,可以點擊Build Now運行Job,下圖是在Jenkins中運行iOS構建 Job的結果圖:
開發者可以點擊每次的構建,查看具體的構建信息及測試結果:
常見問題
啟動Jenkins提示運行“java”命令需要X11支持,
解決方法:這是因為在OS X Mountain Lion系統中不再內置X11,當需要使用X11時,可通過安裝XQuartz project得到支持,具體信息:http://support.apple.com/kb/HT5293
自動化部署
這兒的想談的“部署”不是傳統意義上的直接部署到產品環境的部署,而是指如何把最新版本的應用快速的部署到測試用戶的機器上以收集反饋,或者做一些探索性的測試。
在我寫第一個iOS應用的時候,我想把應用安裝到多個機器上測試的時候,需要非常繁瑣的步驟:
如果是測試機器在多個地理位置的時候,還需要把ipa文件發送到對應的地點,每個地點都需要重復的做第4,5步。 這樣一個繁瑣,且低效的過程讓開發者非常痛苦,直到TestFlight的出現。
TestFlight
TestFlight【22】就是一個專門解決上面提到的痛點的云服務方案,它可以幫助開發者:
- 輕松采集測試用戶的UDID和iOS 版本、硬件版本,并發送給開發者。
- 實時反饋應用是否成功安裝到測試機器
- 輕松部署最新版本應用到測試用機上。
- 開發者可以靈活選擇部署哪個版本到哪部分測試機器上。
使用使用Test Flight服務非常簡單,只需要到Test Flight注冊一個賬號。然后把鏈接發送給測試設備,測試設備只要打開該鏈接,并授權給Test Flight,在Test Flight的設備中心就可以看到這些設備。
而測試設備上,則會多一個Test Flight的應用。
當應用有了新的測試包之后,只需要將IPA上傳到TestFlight網站,然后勾選合適的測試用戶或者合適的設備,點擊Update & Notify。
TestFlight會向對應的測試設備發送更新通知,測試用戶只需在測試設備上打開TestFlight應用,點擊Install,TestFlight就會自動將新版本的IPA文件安裝到測試設備上。
另外,TestFlight還提供了Upload API,這樣就等于提供了和CI服務器集成的能力。其Upload API非常簡單,就是一個簡單的,帶有指定參數的HTTP POST請求,具體細節可參考官網:https://www.testflightapp.com/api/doc/。
在 CI服務器中,開發者可以在構建過程中,添加步驟通過upload API把通過測試的ipa文件自動上傳到TestFlight上,從而達到持續部署的目的。而像Jenkins這樣有豐富插件機制的CI服務器, 活躍的社區開發者們早為其開發了十分便于使用的TestFlight的插件。
在Jenkins中使用TestFlight插件也非常簡單,安裝好插件,重啟Jenkins,然后在項目的構建過程配置頁面的Post-build Actions中,點擊add post-build action,可以看到Upload to Testflight選項:
選擇之后,可以在頁面上看到TestFlight的配置項:
為了增強安全性,該插件把Token的設置移到了Jenkins的Global Setting界面:
配置好Token Pair之后,在在TestFlight的配置項 上選擇相應的pair即可,設置想要的參數,保存即可。
你如果不喜歡使用插件或者說使用的其它CI服務器的話,可以通過添加一個Execute shell步驟,直接通過代碼上傳構建好的ipa文件:
curl http://testflightapp.com/api/builds.json -F file=@testflightapp.ipa -F dsym=@testflightapp.app.dSYM.zip -F api_token='your_api_token' -F team_token='your_team_token' -F notes='This build was uploaded via the upload API' -F notify=True -F distribution_lists='Internal, QA'結語
《持續集成》一書中引用了Javaranch.com的創始人Kathy Sierra的一句話:
There's a big difference between saying, "Eat an apple a day" and actually eating the apple
正所謂知易行難,您幾乎很難聽到開發者說:“持續集成毫無價值”,但是,構建一個持續集成平臺并非易事,希望本文中介紹的iOS應用的構建過程,以及在構建過程的各個階段可以使用的一些優秀的類庫,服務,能夠讓iOS開發者們在想搭建一個持續集成平臺時有所參考,從而能夠更加堅定,且容易的為自己的項目搭建一個持續集成平臺。
參考文獻
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的构建iOS持续集成平台(三)——CI服务器与自动化部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lombok — Java代码自动生成
- 下一篇: 用 UrlRewriteFilter 实