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

前言

??作為一名iOS app開發(fā)者,在我的工作過程中,基本遵循如下的一個(gè)流程:分析需求、UI設(shè)計(jì)——>設(shè)計(jì)功能架構(gòu)——>著手開發(fā)——>打測試包——>修復(fù)bug、優(yōu)化功能。
  在所有這些工作中,項(xiàng)目打測試包對于一個(gè)開發(fā)人員來說,可以說是一項(xiàng)無腦又浪費(fèi)時(shí)間的工作,很榮幸的是,我在公司負(fù)責(zé)iOS項(xiàng)目的打包。
  那么來看看打包的時(shí)間都浪費(fèi)在哪了。來看下打包的流程:Archive項(xiàng)目——>勾選一堆選項(xiàng)及下一步,打包用途、app瘦身、證書——>導(dǎo)出ipa包——>打開蒲公英——>上傳ipa包——>填寫項(xiàng)目描述、安裝密碼——>發(fā)布測試包。如此這般下來,真的是被惡心吐了,手動的操作是一方面,另一方面,在進(jìn)行編譯項(xiàng)目、導(dǎo)出ipa、上傳ipa這些操作時(shí),則需要等待很長時(shí)間,只有等待上一步耗時(shí)操作完成,才能進(jìn)行下一步,無疑很浪費(fèi)時(shí)間。
  那么當(dāng)然會有一種辦法,能為我們解決這個(gè)問題,因?yàn)閼胁攀强萍歼M(jìn)步的第一生產(chǎn)力。

Fastlane

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

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

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

Fastlane

集成流程及使用方法

1、ruby

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

 ruby -v
查看ruby版本

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

2、安裝Fastlane

??首先安裝Xcode命令行工具,因?yàn)榫幾g、打包等操作,雖然是Fastlane幫我們做的,但本質(zhì)上還是通過Xcode中的構(gòu)建工具來完成的。在終端中運(yùn)行如下命令,則會安裝Xcode命令行工具:

xcode-select --install

??然后安裝Fastlane:

sudo gem install fastlane --verbose

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

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

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

sudo gem update --system

??如果報(bào)錯(cuò):

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

??則嘗試使用如下命令進(jìn)行安裝:

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

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

fastlane --version

3、為項(xiàng)目初始化Fastlane

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

fastlane init

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

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

gem "fastlane"

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

fastlane add_plugin pgyer

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


fastlane文件夾

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


Fastfile里的內(nèi)容

4、創(chuàng)建一個(gè)lane

??Fastlane以lane為單位,去執(zhí)行一個(gè)自動化任務(wù),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,代表了一個(gè)叫custom_lane的任務(wù),后面的do,則表示需要執(zhí)行的操作。這里就不講怎么寫代碼了(因?yàn)槲乙膊粫uby?。‖F(xiàn)用現(xiàn)找就好了),我把我項(xiàng)目中的Fastfile貼上來,講解下Fastfile做了哪些事(見代碼中的注釋):

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


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

#從蒲公英平臺拿到的api_key和user_key,下面我會講怎么拿到這兩個(gè)key,存在下面兩個(gè)變量中
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

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

api_key和user_key

4、執(zhí)行腳本

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

fastlane ios dev

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


符合我們的代碼邏輯

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


編譯文件

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

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


上傳到蒲公英

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

?

一些問題匯總

如果在打包的時(shí)候提示如下錯(cuò)誤,找不到Scheme:



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


?

總結(jié)與思考

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,802評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,762評論 2 372

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