Fastlane自動打包
Fastlane
這裡就要引入一個概念了,叫持續整合,引用下百度百科的介紹:
持續整合是一種軟體開發實踐,即團隊開發成員經常整合他們的工作,通常每個成員每天至少整合一次,也就意味著每天可能會發生多次整合。每次整合都通過自動化的構建(包括編譯,釋出,自動化測試)來驗證,從而儘早地發現整合錯誤。
而今天文章的主角就是Fastlane,一套ruby編寫的持續整合工具集。通過Fastlane可以實現自動打包、釋出、擷取app圖片等工作,而Fastlane可以執行通過ruby程式碼或者Fastlane提供的一些工具編寫的指令碼來實現這些工作。以下皆以打包釋出到蒲公英為例,因為蒲公英為開發者提供了Fastlane的蒲公英外掛,允許開發者通過Fastlane上傳ipa包到蒲公英,fir好像也提供了Fastlane的外掛,具體沒去了解,如果有使用fir的,可以在回覆中補充。
整合流程及使用方法
1、ruby
因為Fastlane是ruby編寫的,所以我們首先保證電腦的ruby環境有正確安裝,開啟終端,輸入如下命令來檢視ruby版本。
ruby -v
檢視ruby版本
這裡保證ruby版本在2.0以上就好了。如果低於2.0,就需要升級ruby了,這裡不提了,百度谷歌都有教程。
2、安裝Fastlane
首先安裝Xcode命令列工具,因為編譯、打包等操作,雖然是Fastlane幫我們做的,但本質上還是通過Xcode中的構建工具來完成的。在終端中執行如下命令,則會安裝Xcode命令列工具:
xcode-select --install
然後安裝Fastlane:
sudo gem install fastlane --verbose
如果發現最後報了這樣的錯誤:
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
如果還安裝失敗。。。去官網看看別的安裝方法吧:Getting started with fastlane for iOS
為了檢查Fastlane是否成功安裝,可以通過下面的命令來檢視Fastlane版本號:
fastlane --version
3、為專案初始化Fastlane
如果Fastlane正確安裝了,就可以為我們的專案初始化Fastlane了,首先通過終端,CD到專案目錄,也就是專案的.xcodeproj檔案所在位置。然後執行Fastlane初始化命令:
fastlane init
這裡如果一直卡在bundle update,那應該就是被牆了,這時候來到專案目錄下,找到Gemfile,開啟Gemfile將裡面的內容修改為如下:
#source "https://rubygems.org"
source "https://ruby.taobao.org"
gem "fastlane"
重開終端,執行bundle update就好了。
然後安裝蒲公英外掛,安裝後有個y/n的選擇,選擇y:
fastlane add_plugin pgyer
初始化結束後,會提示選擇Fastlane的用途,一共是四個選項,我選了最後一個,自定義,然後開啟專案目錄,會發現多了一個fastlane資料夾:
fastlane資料夾
開啟資料夾中的Fastfile,裡面則是執行自動化打包任務的程式碼,這裡我是用sublime開啟的,在sublime的選單中,找到View——>Syntax中選擇ruby,即可高亮程式碼:
Fastfile裡的內容
4、建立一個lane
Fastlane以lane為單位,去執行一個自動化任務,Fastfile中的程式碼如下:
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,則表示需要執行的操作。這裡就不講怎麼寫程式碼了(因為我也不會ruby啊!現用現找就好了),我把我專案中的Fastfile貼上來,講解下Fastfile做了哪些事(見程式碼中的註釋):
platform :ios do #指定持續整合物件的平臺名稱
lane :dev do|options| #給lane命名
branch = options[:branch]
#這裡我們專案為了區分線上環境和測試環境,而做了兩個target
#關於target區分環境的方法,可以參考我同事的簡書文章https://www.jianshu.com/p/23cc84d40423
#下面程式碼通過在終端輸入1或者其他數字來選擇要打包的target
#puts是ruby中的輸出,gets為獲取終端中輸入的文字,gets需要指定STDIN包中的gets方法,否則會識別為其他包中的gets方法,具體為什麼我也不知道
puts "請選擇要打的scheme:(1:專案Target1,else: 專案Target2)"
scheme = STDIN.gets
# 通過判斷輸入內容,來區分一些打包資訊,1後面加
是因為在終端輸入1再敲回車的時候scheme就包含了回車的內容,所以scheme == "1
"
if scheme == "1
"
#專案中target的名稱,以QQ為例,如果我的target叫QQ,則下面填寫QQ,如果是wechat,就填wechat
schemeName = "專案Target1"
#打包的用途,也就是app-store, package, ad-hoc, enterprise, development這幾個中的一個,這裡我們專案的target1用的是公司帳號,打的是開發包
export_method = "development"
else
schemeName = "專案Target2"
#這裡我們專案的target2用的是企業帳號,打的是企業包
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
如上程式碼,從頭到尾讀下來,其實就是一個很簡單的輸入變數——>定義幾個變數——>呼叫一個名為gym的打包方法,將定義的變數作為引數傳進去——>呼叫一個名為pgyer的方法上傳ipa,將前面定義好的變數作為引數傳進去。
至於蒲公英的api_key和user_key,可以在蒲公英官網的我的應用——>之前釋出的應用——>API中找到:
api_key和user_key
4、執行指令碼
cd到專案目錄,輸入如下命令來執行我們自己定義的lane,格式如下fastlane+指令碼第一行中的platform名+指令碼第二行中的lane名:
fastlane ios dev
可以發現Fastlane開始執行任務了,並且符合我們的程式碼邏輯:
符合我們的程式碼邏輯
同時可以看到Fastlane在編譯我們的檔案,這裡執行的是gym方法:
編譯檔案
最後會生成dSYM檔案以及ipa:
打包結果
接下來會繼續上傳ipa到蒲公英:
上傳到蒲公英
可以看出,gym打包用時275秒,pgyer上傳到蒲公英是58秒,用時一共是5分半,速度是非常快的,而且不需要人為的去進行各種操作。最後開啟蒲公英就會發現我們的app已經上傳上去了,而且設定好了下載密碼、版本資訊等。
一些問題彙總
如果在打包的時候提示如下錯誤,找不到Scheme:
那麼找到xcode的Manage Schemes,然後將你要打包的target的shared勾選上,再打包就可以了:
總結與思考
以上就實現了我們的自動化打包並上傳到蒲公英的功能,可以說是非常方便省時的了,雖然還是需要五分半的時間,但相比之前的各種複雜操作、各種等待,已經是質的飛躍了。
而Fastlane能做的並不僅限於這些工作,參考Fastlane官方文件,可以發現很多其他功能:Fastlane文件,比如自動釋出到AppStore,自動上傳app截圖到itunes connect等等,這些功能我暫時還用不上(上線的時候還是要自己把關下,手動好一些,並且上線也不是經常性的),大家可以根據自己的需求找一些資料來嘗試下,本篇文章的主旨還是滿足大家的最基本的需求,也建立在我個人的真實使用場景下。
另外,由於Fastlane採用ruby編寫,則Fastlane的一個lane任務可以做的定製化,就不止我編寫的那些簡單內容了,當然我也只是為了滿足我個人的需求,所以做了很簡單定製,如果有對ruby感興趣的同學或精通ruby的大神,完全可以對lane任務做更好的定製,比如上傳完後彈出系統提示框,通知我們上傳完成等更便利的功能(上面指令碼中已經補充了這一功能)。
參考文章:
使用 Fastlane 上傳 App 到蒲公英
Getting started with fastlane for iOS
使用 fastlane 實現對 iOS Multi-Target 的一鍵打包部署
iOS自動化打包釋出(Jenkins + Fastlane + GitLab + 蒲公英)
Ruby 教程