iOS持續(xù)集成:Jenkins+GitLab+蒲公英

前言

眾所周知浮还,現(xiàn)在App的競爭已經(jīng)到了用戶體驗為王借尿,質(zhì)量為上的白熱化階段戈咳。用戶們都是很挑剔的奉呛。如果一個公司的推廣團(tuán)隊好不容易砸了重金推廣了一個APP淋叶,好不容易有了一些用戶勿决,由于一次線上的bug導(dǎo)致一批的用戶在使用中紛紛出現(xiàn)閃退bug挠说,輕則刽肠,很可能前期推廣砸的錢都白費了搏屑,重則争涌,口碑不好,未來也提升不起用戶量來了辣恋。靜下心來分析一下問題的原因亮垫,無外乎就是質(zhì)量沒有過關(guān)就上線了模软。除去主觀的一些因素,很大部分的客觀因素我覺得可以被我們防范的饮潦。根據(jù)大神們提出的一套開發(fā)規(guī)范建議燃异,CI + TDD,就可以幫助我們極大程度的解決客觀因素继蜡。本文接下來主要討論

Continuous Integration

持續(xù)集成(簡稱CI)

目錄

1.為什么我們需要持續(xù)集成

2.持續(xù)化集成工具——Jenkins

3.iOS自動化打包命令——xcodebuild + xcrun 和 fastlane - gym 命令

4.打包完成自動化上傳 fir / 蒲公英 第三方平臺

5.完整的持續(xù)集成流程

6.Jenkins + Docker

一. 為什么我們需要持續(xù)集成

談到為什么需要的問題回俐,我們就需要從什么是來說起。那什么是持續(xù)集成呢稀并。

持續(xù)集成是一種軟件開發(fā)實踐:許多團(tuán)隊頻繁地集成他們的工作仅颇,每位成員通常進(jìn)行日常集成,進(jìn)而每天會有多種集成碘举。每個集成會由自動的構(gòu)建(包括測試)來盡可能快地檢測錯誤忘瓦。許多團(tuán)隊發(fā)現(xiàn)這種方法可以顯著的減少集成問題并且可以使團(tuán)隊開發(fā)更加快捷。

CI是一種開發(fā)實踐引颈。實踐應(yīng)該包含3個基本模塊耕皮,一個可以自動構(gòu)建的過程,自動編譯代碼线欲,可以自動分發(fā)明场,部署和測試。一個代碼倉庫李丰,SVN或者Git苦锨。最后一個是一個持續(xù)集成的服務(wù)器。通過持續(xù)集成趴泌,可以讓我們通過自動化等手段高頻率地去獲取產(chǎn)品反饋并響應(yīng)反饋的過程舟舒。

那么持續(xù)集成能給我們帶來些什么好處呢?這里推薦一篇文章嗜憔,文章中把Continuous integration(CI) andtest-driven development(TDD)分成了12個步驟秃励。然而帶來的好處成倍增加,有24點好處吉捶。


我來說說用了CI以后帶來的一些深有體會的優(yōu)點夺鲜。

1. 縮減開發(fā)周期,快速迭代版本

每個版本開始都會估算好開發(fā)周期呐舔,但是總會因為各種事情而延期币励。這其中包括了一些客觀因素。由于產(chǎn)品線增多珊拼,迭代速度越來越快食呻,給測試帶來的壓力也越來越大。如果測試都在開發(fā)完全開發(fā)完成之后再來測試,那就會影響很長一段時間仅胞。這時候由于集成晚就會嚴(yán)重拖慢項目節(jié)奏每辟。如果能盡早的持續(xù)集成,盡快進(jìn)入上圖的12步驟的迭代環(huán)中干旧,就可以盡早的暴露出問題渠欺,提早解決,盡量在規(guī)定時間內(nèi)完成任務(wù)莱革。

2. 自動化流水線操作帶來的高效

其實打包對于開發(fā)人員來說是一件很耗時峻堰,而且沒有很大技術(shù)含量的工作。如果開發(fā)人員一多盅视,相互改的代碼沖突的幾率就越大捐名,加上沒有產(chǎn)線管理機制,代碼倉庫的代碼質(zhì)量很難保證闹击。團(tuán)隊里面會花一些時間來解決沖突镶蹋,解決完了沖突還需要自己手動打包。這個時候如果證書又不對赏半,又要耽誤好長時間贺归。這些時間其實可以用持續(xù)集成來節(jié)約起來的。一天兩天看著不多断箫,但是按照年的單位來計算拂酣,可以節(jié)約很多時間!

3. 隨時可部署

有了持續(xù)集成以后仲义,我們可以以天為單位來打包婶熬,這種高頻率的集成帶來的最大的優(yōu)點就是可以隨時部署上線。這樣就不會導(dǎo)致快要上線埃撵,到處是漏洞赵颅,到處是bug,手忙腳亂弄完以后還不能部署暂刘,嚴(yán)重影響上線時間饺谬。

4. 極大程度避免低級錯誤

我們可以犯錯誤,但是犯低級錯誤就很不應(yīng)該谣拣。這里指的低級錯誤包括以下幾點:編譯錯誤募寨,安裝問題,接口問題森缠,性能問題绪商。

以天為單位的持續(xù)集成,可以很快發(fā)現(xiàn)編譯問題辅鲸,自動打包直接無法通過。打完包以后腹殿,測試掃碼無法安裝独悴,這種問題也會立即被暴露出來例书。接口問題和性能問題就有自動化測試腳本來發(fā)現(xiàn)。這些低級問題由持續(xù)集成來暴露展現(xiàn)出來刻炒,提醒我們避免低級錯誤决采。

二. 持續(xù)化集成工具——Jenkins

Jenkins 是一個開源項目,提供了一種易于使用的持續(xù)集成系統(tǒng)坟奥,使開發(fā)者從繁雜的集成中解脫出來树瞭,專注于更為重要的業(yè)務(wù)邏輯實現(xiàn)上。同時 Jenkins 能實施監(jiān)控集成中存在的錯誤爱谁,提供詳細(xì)的日志文件和提醒功能晒喷,還能用圖表的形式形象地展示項目構(gòu)建的趨勢和穩(wěn)定性。

根據(jù)官方定義访敌,Jenkins有以下的用途:

1.構(gòu)建項目

2.跑測試用例檢測bug

3.靜態(tài)代碼檢測

4.部署

關(guān)于這4點凉敲,實際使用中還是比較方便的:

1.構(gòu)建項目自動化打包可以省去開發(fā)人員好多時間,重要的是寺旺,Jenkins為我們維護(hù)了一套高質(zhì)量可用的代碼爷抓,而且保證了一個純凈的環(huán)境。我們經(jīng)常會出現(xiàn)由于本地配置出錯而導(dǎo)致打包失敗的情況∽杷埽現(xiàn)在Jenkins就是一個公平的評判者蓝撇,它無法正確的編譯出ipa,那就是有編譯錯誤或者配置問題陈莽。開發(fā)人員沒必要去爭論本地是可以運行的渤昌,拉取了誰誰誰的代碼以后就不能運行了。共同維護(hù)Jenkins的正常編譯传透,因為Jenkins的編譯環(huán)境比我們本地簡單的多耘沼,它是最純凈無污染的編譯環(huán)境。開發(fā)者就只用專注于編碼朱盐。這是給開發(fā)者帶來的便利群嗤。

2.這個可以用來自動化測試。在本地生成大批的測試用例兵琳。每天利用服務(wù)器不斷的跑這些用例狂秘。每天每個接口都跑一遍∏。看上去沒必要者春,但是實際上今天運行正常的系統(tǒng),很可能由于今天的代碼改動清女,明天就出現(xiàn)問題了钱烟。有了Jenkins可以以天為單位的進(jìn)行回歸測試,代碼只要有改動,Jenkins就把所有的回歸測試的用例全部都跑一遍拴袭。在項目工期緊張的情況下读第,很多情況測試都不是很重視回歸測試,畢竟很可能測一遍之后是徒勞的“無用功”拥刻。然而由于回歸測試不及時怜瞒,就導(dǎo)致到最后發(fā)版的時候系統(tǒng)不可用了,這時候回頭查找原因是比較耗時的般哼,查看提交記錄吴汪,看到上百條提交記錄,排查起來也是頭疼的事情蒸眠。以天為單位的回歸測試能立即發(fā)現(xiàn)問題漾橙。測試人員每天可以專注按單元測試,一周手動一次回歸測試黔宛。這是給測試者帶來的便利近刘。

3.這個是靜態(tài)代碼分析,可以檢測出很多代碼的問題臀晃,比如潛在的內(nèi)存泄露的問題觉渴。由于Jenkins所在環(huán)境的純凈,還是可以發(fā)現(xiàn)一些我們本地復(fù)雜環(huán)境無法發(fā)現(xiàn)的問題徽惋,進(jìn)一步的提高代碼質(zhì)量案淋。這是給質(zhì)檢帶來的便利。

4.隨時部署险绘。Jenkins在打包完成之后可以設(shè)定之后的操作踢京,這個時候往往就是提交app到跑測試用例的系統(tǒng),或者部署到內(nèi)測平臺生成二維碼宦棺。部署中不能安裝等一些低級問題隨之立即暴露瓣距。測試人員也只需要掃一下二維碼即可安裝,很方便代咸。這也算是給測試帶來的便利蹈丸。

Jenkins的安裝


在Mac環(huán)境下,我們需要先安裝JDK,網(wǎng)頁搜索:JDK Mac版呐芥,基本第一個搜索結(jié)果就是逻杖,下載完安裝,然后在Jenkins的官網(wǎng)https://jenkins.io/下載最新的war包思瘟。

下載完成后荸百,打開終端,進(jìn)入到war包所在目錄滨攻,執(zhí)行以下命令:

java -jar jenkins.war --httpPort=8888

httpPort指的就是Jenkins所使用的http端口够话,這里指定8888蓝翰,可根據(jù)具體情況來修改。

進(jìn)入war包所在目錄更鲁,執(zhí)行命令


安裝完畢的圖片

待Jenkins啟動后霎箍,在瀏覽器頁面輸入以下地址:

http://localhost:8888

這個時候可能會報上圖的錯誤。出現(xiàn)這個問題的原因就是Java環(huán)境有問題澡为,重新Java環(huán)境即可。

這個時候如果你重啟電腦會發(fā)現(xiàn)Jenkins給你新增了一個用戶景埃,名字就叫Jenkins媒至,不過這個時候你不知道密碼。你可能會去試密碼谷徙,肯定是是不對的拒啰,因為初始密碼很復(fù)雜。這個時候正確做法是打開http://localhost:8888會出現(xiàn)下圖的重設(shè)初始密碼的界面完慧。

按照提示谋旦,找到/Users/wsh/.jenkins/secrets/initialAdminPassword 這個目錄下的initialAdminPassword文件,復(fù)制出密碼屈尼,就可以填到網(wǎng)頁上去重置密碼了册着。如下圖

輸入密碼,進(jìn)入下一步
左邊為下載全部插件脾歧,右邊為自定義下載插件
我選的是左邊下載全部插件
正在逐個下載插件

坑一:就在上圖所示的這一步下載的時候甲捏,基本上最后肯定有幾個插件沒有下載好,然后就停在這里不動了鞭执,不管怎么都不動司顿,然后關(guān)機重啟,重新進(jìn)入.wars所在的文件路徑,在終端執(zhí)行java -jar jenkins.war --httpPort=8888命令才能在輸入http://localhost:8888后能登錄Jenkins登錄界面兄纺,才跳到下圖所示的管理員用戶注冊頁面大溜。

管理員用戶注冊頁面

一路安裝過來,輸入用戶名估脆,密碼钦奋,郵件這些,就算安裝完成了旁蔼,點擊save and finish 按鈕就會出現(xiàn)下圖的頁面锨苏。

點擊start using jenkins 按鈕就結(jié)束了Jenkins的安裝步驟,這樣就打開Jenkins管理頁面了棺聊,接下來是Jenkins的配置步驟伞租。

Jenkins的配置


在安裝下面插件之前如果你之前安裝Jenkins時有的插件沒有安裝成功,選擇系統(tǒng)管理->管理插件頁面會有下圖的提示頁面限佩,需要手動搜索安裝沒成功的插件葵诈,然后才能安裝下面的幾個插件裸弦。

1.安裝GitLab插件

因為我們用的是GitLab來管理源代碼,Jenkins本身并沒有自帶GitLab插件作喘,所以我們需要依次選擇系統(tǒng)管理->管理插件理疙,在“可選插件”中選中“GitLab Plugin”和“Gitlab Hook Plugin”這兩項,然后安裝泞坦。

2.安裝Xcode插件

同安裝GitLab插件的步驟一樣窖贤,我們依次選擇系統(tǒng)管理->管理插件,在“可選插件”中選中“Xcode integration”安裝贰锁。

3.安裝簽名證書管理插件

iOS打包內(nèi)測版時赃梧,需要發(fā)布證書及相關(guān)簽名文件,因此這兩個插件對于管理iOS證書非常方便豌熄。還是在系統(tǒng)管理->管理插件授嘀,在“可選插件”中選中“Credentials Plugin”和“Keychains and Provisioning Profiles Management”安裝。

4.安裝腳本插件

這個插件的功能主要是用于在build后執(zhí)行相關(guān)腳本锣险。在系統(tǒng)管理->管理插件蹄皱,在“可選插件”中選中“Post-Build Script Plug-in”安裝。

好了芯肤,插件安裝完巷折,可以正式開始自動化構(gòu)建了!7鬃薄盔几!

自動化構(gòu)建


在Jenkins中,所有的任務(wù)都是以“item”為單位的掩幢。接下來我們就新建一個iOS的項目來開始自動化構(gòu)建逊拍。點擊“新建”,輸入item的名稱际邻,選擇“構(gòu)建一個自由風(fēng)格的軟件項目”芯丧,然后點擊“OK”。

源碼管理:

這里用到的是GitLab世曾,先需要配置SSH缨恒,我們可以在Jenkins的證書管理中添加SSH。在Jenkins管理頁面轮听,選擇“Credentials”骗露,然后選擇“Global credentials (unrestricted)”,點擊“Add Credentials”血巍,如下圖所示萧锉,我們填寫自己的SSH信息,然后點擊“Save”述寡,這樣就把SSH添加到Jenkins的全局域中去了柿隙。


注意到了嗎叶洞,這一步需要在你的文本框輸入你的Key如果你已經(jīng)配置好了你的SSH證書搜索你的文件 ~/.ssh/id_rsa 這個文件打開復(fù)制到上面的文本框就是了。

如果正常的配置正確的話禀崖,是不會出現(xiàn)下圖中的那段紅色的警告衩辟。如果有下圖的提示,就說明Jenkins還沒有連通GitLab或者SVN波附,那就請再檢查SSH Key是否配置正確艺晴。

注意:

1.git地址的選擇:要用SSH的,把下面的url部分復(fù)制上就可以了

2.上面的 Credentials文本框 ?選擇你剛才創(chuàng)建的SSH

3.Branch Specifier (blank for 'any') 那邊就填寫你的開發(fā)分支如:*/develop1.4.0

構(gòu)建觸發(fā)器設(shè)置

此部分可以參考我下面的參考資料中的第二篇文章中的描述掸屡。

構(gòu)建環(huán)境設(shè)置

iOS打包需要簽名文件和證書财饥,所以這部分我們勾選“Keychains and Code Signing Identities”和“Mobile Provisioning Profiles”。

這里我們又需要用到Jenkins的插件折晦,在系統(tǒng)管理頁面,選擇“Keychains and Provisioning Profiles Management”沾瓦。



注意:上圖顯示uoload keychain or Provisioning Profiles文件满着,就遇到了一點小“坑”,我當(dāng)時以為是需要證書和描述文件贯莺,但是這里需要的 Keychain 和 描述文件风喇,并不是cer或者p12證書文件。

1.這個Keychain其實在/Users/管理員用戶名/Library/keychains/login.keychain,把你找到的login.keychain文件拖到上面箭頭指的按鈕下缕探,點擊upload按鈕魂莫,Keychain設(shè)置好了之后,Jenkins會把這個Keychain拷貝到/Users/Shared/Jenkins/Library/keychains這里爹耗,(Library是隱藏文件)耙考。

2.Provisioning Profiles其實在~/Library/MobileDevice/路徑下,跟上面一樣潭兽,拖到找到的描述文件到上面尖頭指的按鈕下倦始,點擊upload按鈕上傳,然后描述文件也直接拷貝到/Users/Shared/Jenkins/Library/MobileDevice文件目錄下山卦。

這樣我們的Adhoc證書和簽名文件就已經(jīng)在Jenkins中配置好了鞋邑,回到我們新建的item,找到構(gòu)建環(huán)境账蓉,按下圖選好自己的相關(guān)證書和簽名文件枚碗。

注意:

上圖在選擇證書的時候,可能沒有可選項铸本,這時候點擊下方的保存按鈕肮雨,再進(jìn)入這個構(gòu)建環(huán)境,就會選擇剛才你創(chuàng)建的證書和描述文件了归敬。


Xcode配置

點擊“增加構(gòu)建步驟”酷含,選擇“Xcode”鄙早。

依次按下圖填寫項目信息:

我們選擇的是jenkins給我們提供的Xcode方式打包,沒有選擇腳本的方式(其實腳本的方式更好椅亚,因為不會因為mac系統(tǒng)升級而Jenkins 的版本沒有相應(yīng)的升級導(dǎo)致打包不了的情況)


依次填寫你的

1.工程 Target名(一般為工程名)

2.打包方式一般為 Release

3.打包完成的ipa名稱

4.ipa文件存放路徑 (我這里是$workspace/build/限番,照寫就行

繼續(xù)設(shè)置

我這里keychain path中的keychain名字就是自己鑰匙串的路徑啊,大家記得用你自己的路徑啊呀舔,在/Users/管理員用戶名/Library/keychains/login.keychain下找到login.keychain文件拖到文本框內(nèi)弥虐,然后輸入鑰匙串的密碼。


我打碼的部分一般填你的工程名就可以了媚赖,或者schema分支名字霜瘪,然后點擊保存就可以了返回主頁,點擊構(gòu)建惧磺,發(fā)現(xiàn)你成功生成了ipa 文件啊,此時完成了一大半了颖对,就缺上傳蒲公英 第三方平臺了。


三. iOS自動化打包命令——xcodebuild + xcrun 和 fastlane - gym 命令

在日常開發(fā)中磨隘,打包是最后上線不可缺少的環(huán)節(jié)缤底,如果需要把工程打包成 ipa 文件,通常的做法就是在 Xcode 里點擊 「Product -> Archive」番捂,當(dāng)整個工程 archive 后个唧,然后在自動彈出的 「Organizer」 中進(jìn)行選擇,根據(jù)需要導(dǎo)出 ad hoc设预,enterprise 類型的 ipa 包徙歼。雖然Xcode已經(jīng)可以很完美的做到打包的事情,但是還是需要我們手動點擊5鳖枕,6下魄梯。加上我們現(xiàn)在需要持續(xù)集成,用打包命令自動化執(zhí)行就順其自然的需要了耕魄。

1. xcodebuild + xcrun命令

Xcode為我們開發(fā)者提供了一套構(gòu)建打包的命令画恰,就是xcodebuild

和xcrun命令。xcodebuild把我們指定的項目打包成.app文件吸奴,xcrun將指定的.app文件轉(zhuǎn)換為對應(yīng)的.ipa文件允扇。

具體的文檔如下, xcodebuild官方文檔则奥、xcrun官方文檔

NAME

xcodebuild – build Xcode projects and workspaces

SYNOPSIS

1.xcodebuild [-project name.xcodeproj] [[-target targetname] … | -alltargets] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]

2.xcodebuild [-project name.xcodeproj] -scheme schemename [[-destination destinationspecifier] …] [-destination-timeout value] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]

3.xcodebuild -workspace name.xcworkspace -scheme schemename [[-destination destinationspecifier] …] [-destination-timeout value] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]

4.xcodebuild -version [-sdk [sdkfullpath | sdkname]] [infoitem]

5.xcodebuild -showsdks

6.xcodebuild -showBuildSettings [-project name.xcodeproj | [-workspace name.xcworkspace -scheme schemename]]

7.xcodebuild -list[-project name.xcodeproj | -workspace name.xcworkspace]

8.xcodebuild -exportArchive -archivePath xcarchivepath -exportPath destinationpath -exportOptionsPlist path

9.xcodebuild -exportLocalizations -project name.xcodeproj -localizationPath path [[-exportLanguage language] …]

10.xcodebuild -importLocalizations -project name.xcodeproj -localizationPath path

上面10個命令最主要的還是前3個考润。

接下來來說明一下參數(shù):

-project -workspace:這兩個對應(yīng)的就是項目的名字。如果有多個工程读处,這里又沒有指定糊治,則默認(rèn)為第一個工程。

-target:打包對應(yīng)的targets罚舱,如果沒有指定這默認(rèn)第一個井辜。

-configuration:如果沒有修改這個配置绎谦,默認(rèn)就是Debug和Release這兩個版本,沒有指定默認(rèn)為Release版本粥脚。

-buildsetting=value ...:使用此命令去修改工程的配置窃肠。

-scheme:指定打包的scheme。

上面這些是最最基本的命令刷允。

上面10個命令的第一個和第二個里面的參數(shù)冤留,其中 -target

和 -configuration 參數(shù)可以使用 xcodebuild -list

獲得,-sdk 參數(shù)可由 xcodebuild -showsdks

獲得树灶,[buildsetting=value ...] 用來覆蓋工程中已有的配置纤怒。可覆蓋的參數(shù)參考官方文檔

Xcode Build Setting Reference天通。

build

Build the target in the build root (SYMROOT). This is the default action, and is used if no action is given.

analyze

Build and analyze a target or scheme from the build root (SYMROOT). This requires specifying a scheme.

archive

Archive a scheme from the build root (SYMROOT). This requires specifying a scheme.

test

Test a scheme from the build root (SYMROOT). This requires specifying a scheme and optionally a destination.

installsrc

Copy the source of the project to the source root (SRCROOT).

install

Build the target and install it into the target’s installation directory in the distribution root (DSTROOT).

clean

Remove build products and intermediate files from the build root (SYMROOT).

上面第3個命令就是專門用來打帶有Cocopods的項目泊窘,因為這個時候項目工程文件不再是xcodeproj了,而是變成了xcworkspace了像寒。

再來說說xcrun命令州既。

Usage:

PackageApplication [-s signature] application [-o output_directory] [-verbose] [-plugin plugin] || -man || -help

Options:

[-s signature]: certificate name to resign application before packaging

[-o output_directory]: specify output filename

[-plugin plugin]: specify an optional plugin

-help: brief help message

-man: full documentation

-v[erbose]: provide details during operation

參數(shù)不多,使用方法也很簡單萝映,xcrun -sdk iphoneos -v PackageApplication + 上述一些參數(shù)。

參數(shù)都了解之后阐虚,我們就來看看該如何用了序臂。下面這個是使用了xcodebuild + xcrun命令寫的自動化打包腳本

# 工程名

APP_NAME="YourProjectName"

# 證書

CODE_SIGN_DISTRIBUTION="iPhone Distribution: Shanghai ******* Co., Ltd."

# info.plist路徑

project_infoplist_path="./${APP_NAME}/Info.plist"

#取版本號

bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")

#取build值

bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${project_infoplist_path}")

DATE="$(date +%Y%m%d)"

IPANAME="${APP_NAME}_V${bundleShortVersion}_${DATE}.ipa"

#要上傳的ipa文件路徑

IPA_PATH="$HOME/${IPANAME}"

echo ${IPA_PATH}

echo "${IPA_PATH}">> text.txt

//下面2行是沒有Cocopods的用法

echo "=================clean================="

xcodebuild -target "${APP_NAME}"? -configuration 'Release' clean

echo "+++++++++++++++++build+++++++++++++++++"

xcodebuild -target "${APP_NAME}" -sdk iphoneos -configuration 'Release' CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" SYMROOT='$(PWD)'

//下面2行是集成有Cocopods的用法

echo "=================clean================="

xcodebuild -workspace "${APP_NAME}.xcworkspace" -scheme "${APP_NAME}"? -configuration 'Release' clean

echo "+++++++++++++++++build+++++++++++++++++"

xcodebuild -workspace "${APP_NAME}.xcworkspace" -scheme "${APP_NAME}" -sdk iphoneos -configuration 'Release' CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" SYMROOT='$(PWD)'

xcrun -sdk iphoneos PackageApplication "./Release-iphoneos/${APP_NAME}.app" -o ~/"${IPANAME}"


針對Xcode 9 在 Jenkins 中使用 Xcode integration 插件打包失敗的處理,目前為止实束,最好的解決辦法參考這篇文章

2. gym 命令

說到gym奥秆,就要先說一下fastlane。fastlane是一套自動化打包的工具集咸灿,用 Ruby 寫的构订,用于 iOS 和 Android 的自動化打包和發(fā)布等工作。gym是其中的打包命令避矢。

fastlane 的官網(wǎng)看這里, fastlane 的 github 看這里

要想使用gym悼瘾,先要安裝fastlane。

sudo gem install fastlane --verbose

fastlane包含了我們?nèi)粘>幋a之后要上線時候進(jìn)行操作的所有命令审胸。

deliver:上傳屏幕截圖亥宿、二進(jìn)制程序數(shù)據(jù)和應(yīng)用程序到AppStore

snapshot:自動截取你的程序在每個設(shè)備上的圖片

frameit:應(yīng)用截屏外添加設(shè)備框架

pem:可以自動化地生成和更新應(yīng)用推送通知描述文件

sigh:生成下載開發(fā)商店的配置文件

produce:利用命令行在iTunes Connect創(chuàng)建一個新的iOS app

cert:自動創(chuàng)建iOS證書

pilot:最好的在終端管理測試和建立的文件

boarding:很容易的方式邀請beta測試

gym:建立新的發(fā)布的版本,打包

match:使用git同步你成員間的開發(fā)者證書和文件配置

scan:在iOS和Mac app上執(zhí)行測試用例

整個發(fā)布過程可以用fastlane描述成下面這樣

lane :appstore do

increment_build_number

cocoapods

xctool

snapshot

sigh

deliver

frameit

sh "./customScript.sh"

slack

end

Ps:這里可能大家還會聽過一個命令叫 xctool

xctool是官方xcodebuild命令的一個增強實現(xiàn)砂沛,輸出的內(nèi)容比xcodebuild直觀可讀得多烫扼。通過brew即可安裝。

brew install xctool

使用gym自動化打包碍庵,腳本如下

#計時

SECONDS=0

#假設(shè)腳本放置在與項目相同的路徑下

project_path=$(pwd)

#取當(dāng)前時間字符串添加到文件結(jié)尾

now=$(date +"%Y_%m_%d_%H_%M_%S")

#指定項目的scheme名稱

scheme="DemoScheme"

#指定要打包的配置名

configuration="Adhoc"

#指定打包所使用的輸出方式映企,目前支持app-store, package, ad-hoc, enterprise, development, 和developer-id悟狱,即xcodebuild的method參數(shù)

export_method='ad-hoc'

#指定項目地址

workspace_path="$project_path/Demo.xcworkspace"

#指定輸出路徑

output_path="/Users/your_username/Documents/"

#指定輸出歸檔文件地址

archive_path="$output_path/Demo_${now}.xcarchive"

#指定輸出ipa地址

ipa_path="$output_path/Demo_${now}.ipa"

#指定輸出ipa名稱

ipa_name="Demo_${now}.ipa"

#獲取執(zhí)行命令時的commit message

commit_msg="$1"

#輸出設(shè)定的變量值

echo "===workspace path: ${workspace_path}==="

echo "===archive path: ${archive_path}==="

echo "===ipa path: ${ipa_path}==="

echo "===export method: ${export_method}==="

echo "===commit msg: $1==="

#先清空前一次build

gym --workspace ${workspace_path} --scheme ${scheme} --clean --configuration ${configuration} --archive_path ${archive_path} --export_method ${export_method} --output_directory ${output_path} --output_name ${ipa_name}

#輸出總用時

echo "===Finished. Total time: ${SECONDS}s==="

四. 打包完成自動化上傳 fir / 蒲公英 第三方平臺

要上傳到 fir / 蒲公英 第三方平臺,都需要注冊一個賬號堰氓,獲得token挤渐,之后才能進(jìn)行腳本化操作。

1. 自動化上傳fir

安裝fir-clifir的命令行工具

需要先裝好ruby再執(zhí)行

gem install fir-cli

#上傳到fir

fir publish ${ipa_path} -T fir_token -c "${commit_msg}"

2.自動化上傳蒲公英

#蒲公英上的User Key

uKey="7381f97070*****c01fae439fb8b24e"

#蒲公英上的API Key

apiKey="0b27b5c145*****718508f2ad0409ef4"

#要上傳的ipa文件路徑

IPA_PATH=$(cat text.txt)

rm -rf text.txt

#執(zhí)行上傳至蒲公英的命令

echo "++++++++++++++upload+++++++++++++"

curl -F "file=@${IPA_PATH}" -F "uKey=${uKey}" -F "_api_key=${apiKey}" http://www.pgyer.com/apiv1/app/upload

繼續(xù)回到構(gòu)建后操作

這里看我的操作吧豆赏,如下圖挣菲,選擇增加構(gòu)建后操作步驟,選擇 Execute a set of scripts


將上面自動化上傳蒲公英的腳本輸入上圖的位置就可以了掷邦,點擊保存白胀。再次點擊下圖的按鈕。

大功告成8Ц凇;蚋堋!P怠O蚯馈!E呶P勒葱!

五. 完整的持續(xù)集成流程

經(jīng)過上面的持續(xù)化集成赏迟,現(xiàn)在我們就擁有了如下完整持續(xù)集成的流程

六. Jenkins + Docker

關(guān)于Jenkins的部署,其實是分以下兩種:

單節(jié)點(Master)部署

這種部署適用于大多數(shù)項目拇囊,其構(gòu)建任務(wù)較輕硅急,數(shù)量較少覆享,單個節(jié)點就足以滿足日常開發(fā)所需。

多節(jié)點(Master-Slave)部署

通常規(guī)模較大营袜,代碼提交頻繁(意味著構(gòu)建頻繁)撒顿,自動化測試壓力較大的項目都會采取這種部署結(jié)構(gòu)。在這種部署結(jié)構(gòu)下荚板,Master通常只充當(dāng)管理者的角色凤壁,負(fù)責(zé)任務(wù)的調(diào)度,slave節(jié)點的管理跪另,任務(wù)狀態(tài)的收集等工作客扎,而具體的構(gòu)建任務(wù)則會分配給slave節(jié)點。一個Master節(jié)點理論上可以管理的slave節(jié)點數(shù)是沒有上限的罚斗,但通常隨著數(shù)量的增加徙鱼,其性能以及穩(wěn)定性就會有不同程度的下降,具體的影響則因Master硬件性能的高低而不同。

但是多節(jié)點部署又會有一些缺陷袱吆,當(dāng)測試用例變得海量以后厌衙,會造成一些問題,于是有人設(shè)計出了下面這種部署結(jié)構(gòu)绞绒,Jenkins + Docker


由于筆者現(xiàn)在的項目還處于單節(jié)點(Master)部署婶希,關(guān)于多節(jié)點(Master-Slave)部署也沒有實踐經(jīng)驗,改進(jìn)版本的Docker更是沒有接觸過蓬衡,但是如果有這種海量測試用例喻杈,高壓力的大量復(fù)雜的回歸測試的需求的,那推薦大家看這篇文章狰晚。

參考資料

博客一: http://www.reibang.com/p/c69deb29720d

博客二:http://www.reibang.com/p/41ecb06ae95f

博客三:http://www.reibang.com/p/7f999e97b2ee#

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筒饰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子壁晒,更是在濱河造成了極大的恐慌瓷们,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秒咐,死亡現(xiàn)場離奇詭異谬晕,居然都是意外死亡,警方通過查閱死者的電腦和手機携取,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門攒钳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雷滋,你說我怎么就攤上這事夕玩。” “怎么了惊豺?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長禽作。 經(jīng)常有香客問我尸昧,道長,這世上最難降的妖魔是什么旷偿? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任烹俗,我火速辦了婚禮,結(jié)果婚禮上萍程,老公的妹妹穿的比我還像新娘幢妄。我一直安慰自己,他們只是感情好茫负,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布蕉鸳。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪潮尝。 梳的紋絲不亂的頭發(fā)上榕吼,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音勉失,去河邊找鬼羹蚣。 笑死,一個胖子當(dāng)著我的面吹牛乱凿,可吹牛的內(nèi)容都是我干的顽素。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼徒蟆,長吁一口氣:“原來是場噩夢啊……” “哼胁出!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起后专,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤划鸽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后戚哎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裸诽,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年型凳,在試婚紗的時候發(fā)現(xiàn)自己被綠了丈冬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡甘畅,死狀恐怖埂蕊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疏唾,我是刑警寧澤蓄氧,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站槐脏,受9級特大地震影響喉童,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜顿天,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一堂氯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牌废,春花似錦咽白、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春三妈,著一層夾襖步出監(jiān)牢的瞬間畜埋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工畴蒲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悠鞍,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓模燥,卻偏偏與公主長得像咖祭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蔫骂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容