可持續(xù)構(gòu)建和部署,對(duì)于移動(dòng)端泉瞻,尤其是iOS端脉漏,不是一件容易的事情。因?yàn)楣疽婚_(kāi)始就有專人在開(kāi)發(fā)和維護(hù)可持續(xù)構(gòu)建平臺(tái)袖牙,所以這塊并沒(méi)有吃過(guò)太多苦侧巨。但是對(duì)中小團(tuán)隊(duì)的困境,我通過(guò)腦補(bǔ)鞭达,深有體會(huì)司忱。直到fastlane橫空出世,終于有一個(gè)神器可以大大減少無(wú)線開(kāi)發(fā)者的重復(fù)勞動(dòng)畴蹭。fastlane在github上的star數(shù)量可以表明它受歡迎的程度坦仍。
fastlane通過(guò)一系列的lane和action/plugin,將CI/CD過(guò)程中主要的環(huán)節(jié)自動(dòng)化起來(lái)叨襟。
因?yàn)樘O果Developer Member Center和iTunes Connect的接口并沒(méi)有公開(kāi)繁扎,并且Xcode每年都要發(fā)版,帶動(dòng)MC和iTC也要跟著更新芹啥,所以fastlane發(fā)版非常頻繁锻离。比如最近發(fā)布了2.38.1版本,以支持iOS 11和Xcode 9墓怀。
本來(lái)想寫一個(gè)??講一下fastlane的基本使用汽纠,直到我找到一篇絕好的文章:fastlane Tutorial: Getting Started,我覺(jué)得我就沒(méi)有必要費(fèi)這個(gè)勁兒了傀履。
這篇文章非常歡快地把App從創(chuàng)建虱朵、打包到提交審核等關(guān)鍵流程都介紹了一下。只要對(duì)著文章把相關(guān)的變量钓账,比如bundle id改成自己的就行碴犬。
以前提交審核最苦逼的事情莫過(guò)于等待蘋果處理完二進(jìn)制,然后才能勾選上做測(cè)試或者提交審核梆暮,fastlane甚至?xí)恢钡却M(jìn)制處理完服协,并且?guī)兔ψ龊罄m(xù)處理,所以不用再守在電腦旁邊啦啦粹。不過(guò)提交審核需要用戶最后確認(rèn)一下關(guān)鍵信息偿荷,這個(gè)還是比較關(guān)鍵的,自動(dòng)化做了也不太放心唠椭。
基于fastlane做一個(gè)可持續(xù)構(gòu)建平臺(tái)是一件非常容易的事情跳纳。事實(shí)上,只要構(gòu)建平臺(tái)的機(jī)器上安裝了fastlane贪嫂,用戶執(zhí)行一下fastlane ios release
就好了寺庄,fastlane接管了所有的工作。構(gòu)建平臺(tái)要做的是提供機(jī)器和一些必要的UI界面力崇,比如查看日志斗塘。事實(shí)上,主流的CICD平臺(tái)也都在積極擁抱fastlane亮靴,比如travis-ci和flow.ci逛拱。
我也嘗試一下在Jenkins里面運(yùn)行fastlane。下載和安裝好Jenkins之后台猴,創(chuàng)建一個(gè)項(xiàng)目朽合,接著去配置項(xiàng)目,添加一個(gè)腳本如下饱狂。因?yàn)樵诰W(wǎng)頁(yè)中沒(méi)法做交互選擇曹步,所以記得指明FASTLANE_ITC_TEAM_ID
和FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD
這兩個(gè)環(huán)境變量。
接著點(diǎn)立即構(gòu)建休讳,可以去控制臺(tái)看到很多日志讲婚,可以看到最后構(gòu)建成功了。
Mac上有兩個(gè)坑俊柔。一個(gè)是如果在Jenkins官網(wǎng)下載Mac OS X的pkg包安裝筹麸,安裝完成之后活合,就會(huì)啟動(dòng)Jenkins服務(wù),這個(gè)服務(wù)是以Jenkins
這個(gè)用戶啟動(dòng)的物赶,各種無(wú)權(quán)限訪問(wèn)當(dāng)前用戶資源白指。并且這個(gè)進(jìn)程用kill -9
殺死后還會(huì)重啟,感覺(jué)有服務(wù)在保護(hù)它酵紫。
$ ps aux | grep jenkins
jenkins 82494 0.0 0.8 4435172 67252 ?? Ss 12:23下午 1:04.30 /usr/bin/java -Dfile.encoding=UTF-8 -XX:PermSize=256m -XX:MaxPermSize=512m -Xms256m -Xmx512m -Djava.io.tmpdir=/Users/Shared/Jenkins/tmp -jar /Applications/Jenkins/jenkins.war --httpPort=8080
為了繞開(kāi)這個(gè)問(wèn)題告嘲,我手動(dòng)啟動(dòng)Jenkins,并且把端口改成9090奖地,這樣就是以當(dāng)前用戶啟動(dòng)的服務(wù)橄唬。
$ /usr/bin/java -Dfile.encoding=UTF-8 -XX:PermSize=256m -XX:MaxPermSize=512m -Xms256m -Xmx512m -Djava.io.tmpdir=/Users/Shared/Jenkins/tmp -jar /Applications/Jenkins/jenkins.war --httpPort=9090
$ ps aux | grep jenkins
henshao 89248 0.1 3.0 5155436 249804 s000 S+ 4:01下午 1:27.86 /usr/bin/java -jar /Applications/Jenkins/jenkins.war --httpPort=9090
另外一個(gè)坑就是提示下面這個(gè)錯(cuò)誤。解決這個(gè)問(wèn)題只需要在腳本的最前面增加#!/bin/bash --login
就好了参歹。
rvm is not a function selecting rubies with 'rvm use ...' will not work
最后再推薦一下Fastlane實(shí)戰(zhàn)這幾篇文章仰楚,真的非常棒。