前言
??作為一名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的,可以在回復中補充涡上。
集成流程及使用方法
1趾断、ruby
??因為Fastlane是ruby編寫的,所以我們首先保證電腦的ruby環(huán)境有正確安裝吩愧,打開終端芋酌,輸入如下命令來查看ruby版本。
ruby -v
這里保證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文件夾:
打開文件夾中的Fastfile冕广,里面則是執(zhí)行自動化打包任務的代碼,這里我是用sublime打開的偿洁,在sublime的菜單中撒汉,找到View——>Syntax中選擇ruby,即可高亮代碼:
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中找到:
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 教程