使用Fastlane對iOS項目持續(xù)交付(自動打包)

前言

??作為一名iOS app開發(fā)者肝匆,在我的工作過程中澈缺,基本遵循如下的一個流程:分析需求郎仆、UI設計——>設計功能架構——>著手開發(fā)——>打測試包——>修復bug蜀涨、優(yōu)化功能瞎嬉。
  在所有這些工作中,項目打測試包對于一個開發(fā)人員來說厚柳,可以說是一項無腦又浪費時間的工作氧枣,很榮幸的是,我在公司負責iOS項目的打包别垮。
  那么來看看打包的時間都浪費在哪了便监。來看下打包的流程:Archive項目——>勾選一堆選項及下一步,打包用途碳想、app瘦身烧董、證書——>導出ipa包——>打開蒲公英——>上傳ipa包——>填寫項目描述、安裝密碼——>發(fā)布測試包胧奔。如此這般下來逊移,真的是被惡心吐了,手動的操作是一方面龙填,另一方面胳泉,在進行編譯項目、導出ipa岩遗、上傳ipa這些操作時胶背,則需要等待很長時間,只有等待上一步耗時操作完成喘先,才能進行下一步钳吟,無疑很浪費時間。
  那么當然會有一種辦法窘拯,能為我們解決這個問題红且,因為懶才是科技進步的第一生產(chǎn)力。

Fastlane

??這里就要引入一個概念了涤姊,叫持續(xù)集成暇番,引用下百度百科的介紹:

持續(xù)集成是一種軟件開發(fā)實踐,即團隊開發(fā)成員經(jīng)常集成他們的工作思喊,通常每個成員每天至少集成一次壁酬,也就意味著每天可能會發(fā)生多次集成。每次集成都通過自動化的構建(包括編譯,發(fā)布舆乔,自動化測試)來驗證岳服,從而盡早地發(fā)現(xiàn)集成錯誤。

??而今天文章的主角就是Fastlane希俩,一套ruby編寫的持續(xù)集成工具集吊宋。通過Fastlane可以實現(xiàn)自動打包、發(fā)布颜武、截取app圖片等工作璃搜,而Fastlane可以執(zhí)行通過ruby代碼或者Fastlane提供的一些工具編寫的腳本來實現(xiàn)這些工作。以下皆以打包發(fā)布到蒲公英為例鳞上,因為蒲公英為開發(fā)者提供了Fastlane的蒲公英插件这吻,允許開發(fā)者通過Fastlane上傳ipa包到蒲公英,fir好像也提供了Fastlane的插件篙议,具體沒去了解橘原,如果有使用fir的,可以在回復中補充涡上。

Fastlane

集成流程及使用方法

1趾断、ruby

??因為Fastlane是ruby編寫的,所以我們首先保證電腦的ruby環(huán)境有正確安裝吩愧,打開終端芋酌,輸入如下命令來查看ruby版本。

 ruby -v
查看ruby版本

  這里保證ruby版本在2.0以上就好了雁佳。如果低于2.0脐帝,就需要升級ruby了,這里不提了糖权,百度谷歌都有教程堵腹。

2、安裝Fastlane

??首先安裝Xcode命令行工具星澳,因為編譯疚顷、打包等操作,雖然是Fastlane幫我們做的禁偎,但本質(zhì)上還是通過Xcode中的構建工具來完成的腿堤。在終端中運行如下命令,則會安裝Xcode命令行工具:

xcode-select --install

??然后安裝Fastlane:

sudo gem install fastlane --verbose

??如果發(fā)現(xiàn)最后報了這樣的錯誤:

ERROR:  While executing gem ... (TypeError)
    no implicit conversion of nil into String

??則更新gem版本如暖,然后再次安裝Fastlane:

sudo gem update --system

??如果報錯:

ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/bin directory.

??則嘗試使用如下命令進行安裝:

sudo gem install -n /usr/local/bin fastlane

??如果還安裝失敗笆檀。。盒至。去官網(wǎng)看看別的安裝方法吧:Getting started with fastlane for iOS
??為了檢查Fastlane是否成功安裝酗洒,可以通過下面的命令來查看Fastlane版本號:

fastlane --version

3士修、為項目初始化Fastlane

??如果Fastlane正確安裝了,就可以為我們的項目初始化Fastlane了棋嘲,首先通過終端黔州,CD到項目目錄,也就是項目的.xcodeproj文件所在位置。然后執(zhí)行Fastlane初始化命令:

fastlane init

??這里如果一直卡在bundle update,那應該就是被墻了,這時候來到項目目錄下甩骏,找到Gemfile福青,打開Gemfile將里面的內(nèi)容修改為如下:

#source "https://rubygems.org"
source "https://ruby.taobao.org"

gem "fastlane"

??重開終端指厌,運行bundle update就好了。
??然后安裝蒲公英插件,安裝后有個y/n的選擇,選擇y:

fastlane add_plugin pgyer

??初始化結束后碴里,會提示選擇Fastlane的用途,一共是四個選項,我選了最后一個壳炎,自定義,然后打開項目目錄蹂季,會發(fā)現(xiàn)多了一個fastlane文件夾:


fastlane文件夾

  打開文件夾中的Fastfile冕广,里面則是執(zhí)行自動化打包任務的代碼,這里我是用sublime打開的偿洁,在sublime的菜單中撒汉,找到View——>Syntax中選擇ruby,即可高亮代碼:


Fastfile里的內(nèi)容

4涕滋、創(chuàng)建一個lane

??Fastlane以lane為單位睬辐,去執(zhí)行一個自動化任務,F(xiàn)astfile中的代碼如下:

default_platform(:ios)

platform :ios do
  desc "Description of what the lane does"
  lane :custom_lane do
    # add actions here: https://docs.fastlane.tools/actions
  end
end

??lane:custom_lane宾肺,代表了一個叫custom_lane的任務溯饵,后面的do,則表示需要執(zhí)行的操作锨用。這里就不講怎么寫代碼了(因為我也不會ruby胺峥!現(xiàn)用現(xiàn)找就好了)增拥,我把我項目中的Fastfile貼上來啄巧,講解下Fastfile做了哪些事(見代碼中的注釋):

platform :ios do     #指定持續(xù)集成對象的平臺名稱
lane :dev do|options|      #給lane命名
branch = options[:branch]


#這里我們項目為了區(qū)分線上環(huán)境和測試環(huán)境寻歧,而做了兩個target
#關于target區(qū)分環(huán)境的方法,可以參考我同事的簡書文章http://www.reibang.com/p/23cc84d40423
#下面代碼通過在終端輸入1或者其他數(shù)字來選擇要打包的target
#puts是ruby中的輸出秩仆,gets為獲取終端中輸入的文字码泛,gets需要指定STDIN包中的gets方法,否則會識別為其他包中的gets方法澄耍,具體為什么我也不知道
puts "請選擇要打的scheme:(1:項目Target1噪珊,else: 項目Target2)"      
scheme = STDIN.gets
#  通過判斷輸入內(nèi)容,來區(qū)分一些打包信息齐莲,1后面加\n是因為在終端輸入1再敲回車的時候scheme就包含了回車的內(nèi)容痢站,所以scheme == "1\n"
if scheme == "1\n" 
#項目中target的名稱,以QQ為例铅搓,如果我的target叫QQ瑟押,則下面填寫QQ搀捷,如果是wechat星掰,就填wechat
  schemeName = "項目Target1"
#打包的用途,也就是app-store, package, ad-hoc, enterprise, development這幾個中的一個嫩舟,這里我們項目的target1用的是公司帳號氢烘,打的是開發(fā)包
  export_method = "development"      
 else
  schemeName = "項目Target2"
#這里我們項目的target2用的是企業(yè)帳號,打的是企業(yè)包
  export_method = "enterprise"      
end

#從蒲公英平臺拿到的api_key和user_key家厌,下面我會講怎么拿到這兩個key播玖,存在下面兩個變量中
api_key = "xxxxxxxxxxxxxxxxxxx"
user_key = "xxxxxxxxxxxxxxxxxxx"



#輸入蒲公英上傳ipa包后輸入的版本描述信息
puts "請輸入版本描述:"
desc = STDIN.gets



puts "開始打包 #{schemeName}"
# 開始打包
gym(
#指定scheme的名字
scheme: "#{schemeName}",
#輸出的ipa名稱
output_name:"#{schemeName}",
# 是否清空以前的編譯信息 true:是
clean:true,
# 指定打包方式,Release 或者 Debug
configuration:"Release",
# 指定打包所使用的輸出方式饭于,目前支持app-store, package, ad-hoc, enterprise, development
export_method:"#{export_method}",
# 指定輸出文件夾蜀踏,這里會保存我們最后生成的ipa文件,也就是存到了我們上面提到的fastlane文件夾中的build文件夾中
output_directory:"./fastlane/build",
)

puts "開始上傳到蒲公英"
#開始上傳ipa到蒲公英掰吕,這里用的是蒲公英提供的插件
#update_description代表更新信息果覆,password代表安裝密碼
pgyer(update_description: "#{desc}", api_key: "#{api_key}", user_key: "#{user_key}", password: "1111", install_type: "2")



#在上傳完ipa后,打開ipa的存放文件夾殖熟,起到提示上傳完成的作用
system "open ../fastlane/build"

end
end

??如上代碼局待,從頭到尾讀下來,其實就是一個很簡單的輸入變量——>定義幾個變量——>調(diào)用一個名為gym的打包方法菱属,將定義的變量作為參數(shù)傳進去——>調(diào)用一個名為pgyer的方法上傳ipa钳榨,將前面定義好的變量作為參數(shù)傳進去
??至于蒲公英的api_key和user_key纽门,可以在蒲公英官網(wǎng)的我的應用——>之前發(fā)布的應用——>API中找到:

api_key和user_key

4薛耻、執(zhí)行腳本

??cd到項目目錄,輸入如下命令來執(zhí)行我們自己定義的lane赏陵,格式如下fastlane+腳本第一行中的platform名+腳本第二行中的lane名

fastlane ios dev

??可以發(fā)現(xiàn)Fastlane開始執(zhí)行任務了饼齿,并且符合我們的代碼邏輯:


符合我們的代碼邏輯

??同時可以看到Fastlane在編譯我們的文件愤钾,這里執(zhí)行的是gym方法:


編譯文件

??最后會生成dSYM文件以及ipa:
打包結果

??接下來會繼續(xù)上傳ipa到蒲公英:


上傳到蒲公英

  可以看出,gym打包用時275秒候醒,pgyer上傳到蒲公英是58秒能颁,用時一共是5分半,速度是非车挂快的伙菊,而且不需要人為的去進行各種操作。最后打開蒲公英就會發(fā)現(xiàn)我們的app已經(jīng)上傳上去了敌土,而且設置好了下載密碼镜硕、版本信息等。

?

一些問題匯總

如果在打包的時候提示如下錯誤返干,找不到Scheme:



  那么找到xcode的Manage Schemes兴枯,然后將你要打包的target的shared勾選上,再打包就可以了:


?

總結與思考

??以上就實現(xiàn)了我們的自動化打包并上傳到蒲公英的功能矩欠,可以說是非常方便省時的了财剖,雖然還是需要五分半的時間,但相比之前的各種復雜操作癌淮、各種等待躺坟,已經(jīng)是質(zhì)的飛躍了。
  而Fastlane能做的并不僅限于這些工作乳蓄,參考Fastlane官方文檔咪橙,可以發(fā)現(xiàn)很多其他功能:Fastlane文檔,比如自動發(fā)布到AppStore虚倒,自動上傳app截圖到itunes connect等等美侦,這些功能我暫時還用不上(上線的時候還是要自己把關下,手動好一些魂奥,并且上線也不是經(jīng)常性的)菠剩,大家可以根據(jù)自己的需求找一些資料來嘗試下,本篇文章的主旨還是滿足大家的最基本的需求捧弃,也建立在我個人的真實使用場景下赠叼。
  另外,由于Fastlane采用ruby編寫违霞,則Fastlane的一個lane任務可以做的定制化嘴办,就不止我編寫的那些簡單內(nèi)容了,當然我也只是為了滿足我個人的需求买鸽,所以做了很簡單定制涧郊,如果有對ruby感興趣的同學或精通ruby的大神,完全可以對lane任務做更好的定制眼五,比如上傳完后彈出系統(tǒng)提示框妆艘,通知我們上傳完成等更便利的功能(上面腳本中已經(jīng)補充了這一功能)彤灶。
  參考文章:
  使用 Fastlane 上傳 App 到蒲公英
  Getting started with fastlane for iOS
  使用 fastlane 實現(xiàn)對 iOS Multi-Target 的一鍵打包部署
  iOS自動化打包發(fā)布(Jenkins + Fastlane + GitLab + 蒲公英)
  Ruby 教程

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市批旺,隨后出現(xiàn)的幾起案子幌陕,更是在濱河造成了極大的恐慌,老刑警劉巖汽煮,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搏熄,死亡現(xiàn)場離奇詭異,居然都是意外死亡暇赤,警方通過查閱死者的電腦和手機心例,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鞋囊,“玉大人止后,你說我怎么就攤上這事×锔” “怎么了译株?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逗扒。 經(jīng)常有香客問我古戴,道長欠橘,這世上最難降的妖魔是什么矩肩? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮肃续,結果婚禮上黍檩,老公的妹妹穿的比我還像新娘。我一直安慰自己始锚,他們只是感情好刽酱,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瞧捌,像睡著了一般棵里。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姐呐,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天殿怜,我揣著相機與錄音,去河邊找鬼曙砂。 笑死头谜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鸠澈。 我是一名探鬼主播柱告,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼截驮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了际度?” 一聲冷哼從身側響起葵袭,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乖菱,沒想到半個月后眶熬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡块请,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年娜氏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墩新。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡渠鸽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猬膨,到底是詐尸還是另有隱情勤婚,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布臣疑,位于F島的核電站盔憨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏讯沈。R本人自食惡果不足惜郁岩,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缺狠。 院中可真熱鬧问慎,春花似錦、人聲如沸挤茄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穷劈。三九已至笼恰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歇终,已是汗流浹背社证。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留练湿,地道東北人猴仑。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辽俗。 傳聞我的和親對象是個殘疾皇子疾渣,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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