先說一下這次體驗(yàn)的結(jié)果,將自己的一個(gè)項(xiàng)目提交到了flow.ci上,實(shí)現(xiàn)了基本的iOS持續(xù)集成的功能,它讓我們程序員的世界更美好了一點(diǎn)點(diǎn)。本文篇幅較長(zhǎng),如果你沒時(shí)間看可以直接跳到 #詳細(xì)流程# 標(biāo)題下,或者可以直接到flow.ci官網(wǎng)馬上進(jìn)行體驗(yàn)。
1. 為什么需要iOS持續(xù)集成
持續(xù)集成是敏捷開發(fā)的重要實(shí)踐之一,設(shè)想這樣一個(gè)場(chǎng)景,你正在考慮如何寫一個(gè)正則表達(dá)式把HTML5里面的信息提取出來,正當(dāng)你寫到一半的時(shí)候,測(cè)試人員突然來到你后面對(duì)你說:“后端上接口了,你給這臺(tái)iPhone 7打個(gè)線上的包我過一下吧”。這時(shí)候你剛剛想到一半的思路瞬間消失了,然后你只能中斷當(dāng)前的工作,切換一下git分支,將上個(gè)版本重新編譯一遍給測(cè)試。如果這時(shí)候storyboard布局還變動(dòng)了...那你只好和測(cè)試人員大眼瞪小眼直到Xcode把應(yīng)用安裝好了。可是如果你的項(xiàng)目里使用了持續(xù)集成,你就能獲得以下優(yōu)點(diǎn):
- 迭代速度加快,甚至每次commit都可以交付可運(yùn)行的代碼,而測(cè)試人員可以盡早進(jìn)入測(cè)試環(huán)節(jié)。
- 花費(fèi)在編譯,分發(fā)這樣低技術(shù)含量的時(shí)間變少,打包的成功率提高,節(jié)省更多時(shí)間。
- 可以接入測(cè)試腳本,在交付給測(cè)試人員之前就把低級(jí)錯(cuò)誤發(fā)現(xiàn)出來,比如接口問題,編譯問題等。
2. 1 為什么選擇flow.ci
主要是因?yàn)榇罱ㄗ越ǖ姆?wù)器是非常耗時(shí)耗力的!
首先,iOS工程需要在MacOS環(huán)境下編譯,這個(gè)iOS閉源的特點(diǎn)使得我們?cè)谶x擇服務(wù)器上有極大的限制。同時(shí),每個(gè)團(tuán)隊(duì)自建的服務(wù)器可能會(huì)有一定程度的不同。在錯(cuò)誤發(fā)生的時(shí)候,你的經(jīng)驗(yàn)決定了你能否準(zhǔn)確定位錯(cuò)誤,到底是服務(wù)器問題?Pod問題?證書問題?還是代碼問題?
flow.ci 配置非常簡(jiǎn)單,迄今為止,我對(duì) flow.ci 的體驗(yàn)大部分情況下還很好。至于定價(jià)方面,因?yàn)檫€處于內(nèi)測(cè)階段,flow.ci 在內(nèi)測(cè)期間完全免費(fèi)。
2.2 為什么最近才開始
是的,我知道你聽得最多是Jenkins
,第二多是Travis CI
。
Jenkins
需要你有一臺(tái)CI服務(wù)器,除非你想把自己的Mac Pro貢獻(xiàn)出來,不然還是申請(qǐng)一臺(tái)Mac Mini當(dāng)CI服務(wù)器。Jenkins+gitlab+fir.im已經(jīng)是一個(gè)比較成熟的持續(xù)集成解決方案了,網(wǎng)絡(luò)上也有一大堆教程,不過問題是需要處理的細(xì)節(jié)比較多,個(gè)人覺得很麻煩,而且有些問題并不是那么容易找到解決方案的。
Travis CI
目前只對(duì)Github上的項(xiàng)目提供持續(xù)集成服務(wù),對(duì)于商業(yè)項(xiàng)目來說,很少會(huì)考慮直接放在github上。
因?yàn)?flow.ci 對(duì)iOS的集成是在11月4日左右內(nèi)測(cè),也就是說,這個(gè)功能是一個(gè)最近才上線的。據(jù)說主要是因?yàn)樾枰罅縈ac服務(wù)器比較難找,這直接導(dǎo)致了我從 flow.ci 剛剛出現(xiàn)的時(shí)候就一直關(guān)注到現(xiàn)在才用上...真的蠻久了。而且這塊功能算是內(nèi)測(cè)中的內(nèi)測(cè),目前(11月17日)還需要向官方發(fā)郵件,等對(duì)方提供內(nèi)測(cè)資格。
新上線的功能直接導(dǎo)致了文檔不全,如果出了一些問題,沒有現(xiàn)成的文檔可以參考。幸虧官方團(tuán)隊(duì)提供了一個(gè)討論組,反正我在獲得內(nèi)測(cè)資格之后,馬上進(jìn)行實(shí)驗(yàn),然后馬上就碰到問題,在Google一番未果之后求助于討論組,官方人員在第二天回復(fù)了我的問題,完美解決。
3. 詳細(xì)流程
3.1 前期準(zhǔn)備
- 獲取mobileprovision文件和p12,是的,iOS打包內(nèi)測(cè)版時(shí),需要發(fā)布證書及相關(guān)簽名文件。具體步驟可以參考這里。
- 整理工程項(xiàng)目,提交到對(duì)應(yīng)的代碼倉(cāng)庫(kù)里。
3.2 開始創(chuàng)建工作流
首先打開flow.ci的操作面板,點(diǎn)擊創(chuàng)建項(xiàng)目
。你可以開始選擇代碼倉(cāng)庫(kù)。目前flow.ci 有四個(gè)代碼倉(cāng)庫(kù)類型可選,分別是
GitHub
(世界最大的同性交友網(wǎng)站)
Gitlab
(大部分公司會(huì)使用gitlab自建git倉(cāng)庫(kù))
Bitbucket
(類似中國(guó)碼云服務(wù),支持私有倉(cāng)庫(kù))
Coding
(國(guó)內(nèi)的代碼托管服務(wù),支持公有和私有倉(cāng)庫(kù),界面做的很棒,我覺得速度蠻快的)
3.3 授權(quán)
github和coding在賬戶登錄的情況下會(huì)向你詢問是否提供授權(quán)(Auth)
,否則的話會(huì)要求你提供 RSA Key
和倉(cāng)庫(kù)地址。如果你不知道的話,可以打開終端,輸入命令cd ~/.ssh
,將想要集成平臺(tái)的RSA文件內(nèi)容提供給flow.ci 。
3.4 配置工作流內(nèi)容
選擇好想要持續(xù)集成的倉(cāng)庫(kù)之后,點(diǎn)擊創(chuàng)建第一個(gè)工作流來開始接下來的設(shè)置。
直接拉到底部,選擇iOS模板
感覺你的工程設(shè)置對(duì)應(yīng)的Xcode版本,之后提交工程匹配的證書
MobildProvision
和p12
文件。如果找不到的話可以點(diǎn)擊這里來查看。下面設(shè)置
構(gòu)建參數(shù)
,其實(shí)如果你本身有使用xcode自動(dòng)構(gòu)建的經(jīng)驗(yàn)的話,這幾個(gè)參數(shù)和xcodebuild
是直接對(duì)應(yīng)的。你可以在工程根目錄下,在終端使用 xcodebuild -list
命令查看信息來幫你確定下面五個(gè)輸入?yún)?shù)。FLOW_IOS_COMPILE_WORKSPACE
如果你是集成了CocoaPods的話,這里寫的應(yīng)該是你的工程名.xcworkspace
! 注意的是這個(gè)地方如果不為空,那么FLOW_IOS_COMPILE_PROJECT
就應(yīng)該設(shè)置為空,二者取其一。FLOW_IOS_COMPILE_PROJECT
如果你是一個(gè)小項(xiàng)目而且沒有集成CocoaPods的話,可以填工程名.xcodeproj
! 注意的是這個(gè)地方如果不為空,那么FLOW_IOS_COMPILE_WORKSPACE
就應(yīng)該設(shè)置為空,二者取其一。FLOW_IOS_COMPILE_SCHEME
填Targets
下面的,如果有多個(gè)就需要指定你想要打包的targetFLOW_IOS_COMPILE_SDK
保持默認(rèn)值即可FLOW_IOS_COMPILE_CONFIGURATION
Debug搞定!一個(gè)簡(jiǎn)單的工作流就添加到了你的項(xiàng)目里。我們繼續(xù)添加其他設(shè)置。
3.5 根據(jù)需求自定義工作流
- 觸發(fā)器 提供了根據(jù)事件觸發(fā)打包的Hook,包括Push、Pull、Tag操作,你也可以設(shè)置幾個(gè)定時(shí)任務(wù),比如每天下班后執(zhí)行一次打包。
- 初始化 提供了初始化時(shí)候顯示的一些信息,同時(shí)為一些編譯時(shí)候的變量進(jìn)行賦值,下方提供了自定義輸出的模板可供選擇。
- Git倉(cāng)庫(kù)克隆 即服務(wù)器
git clone
操作 - 緩存 即pod安裝包依賴,可以選擇啟用緩存,那么flow.ci只會(huì)在第一次的時(shí)候添加依賴(pod install)之后編譯就繼續(xù)使用第一次打包的pod文件。
- 安裝
- 編譯 即編譯時(shí)候的一些變量,大部分出錯(cuò)是在這里設(shè)置錯(cuò)了,在自動(dòng)化打包的時(shí)候會(huì)有對(duì)應(yīng)的提示信息。
- 完成后,提供了Email和slack提醒方式,你可以選擇在成功或者是失敗的情況下發(fā)送郵件到指定郵箱。
3.6 分發(fā)到Fir.im
fir.im 為開發(fā)者提供測(cè)試應(yīng)用極速發(fā)布的服務(wù),測(cè)試人員可以通過生成的二維碼直接掃描安裝測(cè)試版應(yīng)用。工作流中在完成后的左上角有一個(gè)+
,點(diǎn)擊之后選擇fir.im上傳插件
,將你在fir.im
里的token寫在FIR_API_TOKEN
中即可。其他兩個(gè)參數(shù)可以不填。
3.7 一些小細(xì)節(jié)
-
fir.im上的二維碼掃描后進(jìn)入安裝,但是手機(jī)報(bào)告無法安裝該應(yīng)用
- 可能是在MobileProvision中沒有將這臺(tái)手機(jī)添加到測(cè)試列表中。 -
Code signing is required for product type 'Application' in SDK 'iOS 10.1'
關(guān)閉Automatically manage signing,在signing中手動(dòng)選擇mobileprovision
證書名。 -
You cannot specify both an Xcode project and a workspace.
編譯變量FLOW_IOS_COMPILE_WORKSPACE
和FLOW_IOS_COMPILE_PROJECT
選擇一個(gè)填就好了。 -
The workspace named "XXX" does not contain a scheme named "XXX".
查看你是不是選擇對(duì)了Scheme。如果確認(rèn)自己寫的是正確的,那么在檢查Manage scheme
是否開啟shared
。
4. 下一步目標(biāo)
集成單元測(cè)試和UI測(cè)試
5. 相關(guān)資源
flow.ci 討論組
Fir.im 應(yīng)用分發(fā)
flow.ci官方網(wǎng)站
(轉(zhuǎn)載請(qǐng)注明來源)