背景
初識fastlane
fastlane是一個通過簡單指令來完成諸如截圖、獲驗證書、編譯、導出安裝包、送出iTunesConnect等一系列操作的工具,它同時支援iOS和Android。 你能夠通過簡單的方式配置流程進行的順序,并通過非常簡單的指令執行其中的一個流程。當然它的簡單并不代表功能也簡陋,有開源社群的支援,更新迅速且有很多功能能夠滿足你的需求。
為什麼使用它
之前我們使用的是jenkins内的Xcode integration進行編譯工作,但是其更新比較慢(至2017.12.20還未支援Xcode9),Xcode大版本更新後出現無法繼續使用的問題。 後改用fastlane,發現其使用和配置還算簡單,有開源社群支援,更新迅速功能強大。且相比jenkins裡的插件,fastlane可以單獨使用,也可以被多種CI接入。
配置使用環境
fastlane使用的是ruby環境且對ruby有版本要求(官網要求是ruby2.0以上),是以如果需要的話更新一波ruby,然後通過gem安裝fastlane。
更新ruby
更新ruby使用的是RVM工具,在指令行進行如下操作,安裝時可能出現進度不動,多半可能是因為被牆了。
#安裝RVM工具
RVMcurl -L get.rvm.io | bash -s stable
#列出可安裝的ruby版本(有原始的ruby也有其他版本的版本)
rvm list known
#根據剛才列出的ruby版本,安裝一個ruby版本
rvm install ruby-xxxxx(xxx為版本号)
複制代碼
列出來ruby的版本,選擇#MRI Rubies這一大類下面的,我裝的是2.4的版本
因為我之前已經安裝過了,是以提示是已經安裝成功
安裝fastlane
如果ruby版本滿足要求,可以直接在指令行執行以下指令安裝fastlane,這個安裝比較順利沒出現報錯,如果有報錯可以根據原因搜尋一下解決辦法。
#安裝fastlane
sudo gem install -n /usr/local/bin fastlane
複制代碼
配置fastlane
使用的環境搭建好了,就可以進行這一步來配置fastlane了。
初始化
執行預設的初始化
cd 項目目錄
fastlane init
複制代碼
根據提示輸入資訊,這一步我沒有按照提示處理,因為在有多個BundleID多個target的工程上使用,實際上生成的配置還是要修改的。
如果你的項目隻有一個bundle id也隻有一個開發者賬号的話,可以直接遵循官方的步驟配置。
初始化完成後可以看到項目目錄裡多出了一個fastlane檔案夾,内有兩個比較重要的檔案Appfile和Fastfile
大緻流程
通過在指令行執行
fastlane [lane-name]
以執行
fastlane/Fastfile
中的一個
lane
。 這個操作會依次從.env檔案、Appfile檔案、Deliverfile檔案讀取配置資訊,最後由Fastfile中的邏輯來進行工作。
配置和使用
fastlane可以通過配置 .env檔案、Appfile、Deliverfile、Fastfile 來完成各種工作。
其中Fastfile是最核心的用來控制流程走向的配置檔案,.env和Appfile可以輔助Fastfile來設定一些參數,Deliverfile可用于配置送出iTunesConnect的一些參數。
需要檢視,樣例配置可直接前往下載下傳樣例配置
Appfile
Appfile是用來配置一些類似于AppleID、BundleID參數(參數是fastlane已經定義好的,新增的并沒有用,如果想新增變量需要使用.env方式),可以在Fastfile中使用,AppleID、BundleID等其實會被一些actions直接調用,并不需要寫出來傳遞。
普通配置方式
直接在Appfile裡填寫app_identifier、apple_id、team_id等,然後根據lane的不同可以設定成不同。
# 預設配置
app_identifier "com.devhy.test"
apple_id "[email protected]"
team_id "xxxxxxxxx1"
# 如果lane是ent換成Dev的配置
for_lane :ent do
app_identifier "com.devhy.testDev"
apple_id "[email protected]"
team_id "xxxxxxxxx2"
end
複制代碼
使用.env配置方式
.env這個檔案的作用是作為環境變量的配置檔案,在fastlane init進行初始化後并不會自動生成,如果需要可以自己建立。
執行時預設會讀取
.env
和
.env.default
檔案裡的配置。通過執行
fastlane [lane-name] --env [envName]
來指定使用配置檔案
.env.[envName]
,讀取順序是
.env -> .env.default -> .env.<envName>
,相同的變量名會被後面的覆寫。
如我建了檔案.env.myDev,裡面寫了一些參數,那在執行的時候使用
fastlane [lane-name] --env myDev
即可,想在Appfile、Deliverfile、Fastfile等調用,直接使用
ENV['keyName']
即可
# .env.myDev檔案
# bundle id
App_Identifier = "com.devhy.testDev"
# 開發者賬号
Apple_Id = "[email protected]"
# 開發者TeamId
Team_Id = "xxxxxxxxx2"
# project的target scheme名稱
Scheme = "HYTestDev"
複制代碼
# Appfile使用.env方式直接讀取變量即可
app_identifier ENV['App_Identifier']
apple_id ENV['Apple_Id']
team_id ENV['Team_Id']
複制代碼
注意:因為是.env檔案是.開頭檔案,預設是在finder中隐藏的,需要通過執行一下指令來顯示
# 設定隐藏檔案可見
defaults write com.apple.finder AppleShowAllFiles TRUE
# 重新開機finder服務以生效
killall Finder
複制代碼
配置方式對比
普通配置方式:簡單易懂,但不能自定義變量,且每個lane想不一樣都要寫一個for_lane .env配置方式:功能性強,但配置起來稍微麻煩一點
Deliverfile
Deliverfile是用來配置上傳到iTunesConnect所需資訊的,由于我們主要用fastlane來打包,釋出是手動将ipa包送出稽核,由于沒有進行過嘗試是以該檔案配置方式就不叙述了。
Fastfile
Fastfile是對流程進行控制的核心檔案,需要設定支援的平台和在一些環節裡需要做的事情。
基本結構
Fastfile主要是根據設定的平台,可以在before_all、after_all、error中做一些操作 以及 建立一些lane作為關鍵的執行邏輯,可以在其中使用fastlane内置的action,也可以調用自建action,還可以調用别的lane
# 因為fastlane存在新老版本相容問題,是以一般會指定fastlane版本
fastlane_version "2.62.0"
default_platform :ios
platform :ios do
# 所有lane執行之前,可以做如執行cocoapods的pod install
before_all do
cocoapods
end
# 名字叫ent的lane,指令行裡執行fastlane ent
lane :ent do
# 執行一些action,如cert下載下傳證書,sigh下載下傳pp檔案,gym進行編譯和導出包
end
# 執行fastlane store即可
lane :store do
# 調用一些action
# 調用别的lane,比如send_msg
send_msg
end
lane :send_msg do
# 調用一些action
end
# 所有lane完成之後,可以适用參數lane來區分
after_all do |lane|
end
# 所有lane失敗之後,可以适用參數lane來區分
error do |lane, exception|
end
end
複制代碼
Fastfile樣例
下面的Fastfile樣例是配置了
.env+Appfile
後進行編寫,因為這樣在配置action時,可以省去一些入參。 因為使用了Appfile,
cert
的username、team_id 以及
sigh
的app_identifier、username、team_id 可以不用傳入了,fastlane在執行時會自己去從Appfile裡取。以及之前在.env環境配置中設定了一個Scheme的字段,那麼gym的scheme我們可以使用ENV['Scheme']來調用。
fastlane_version "2.62.0"
default_platform :ios
platform :ios do
before_all do
cocoapods
end
lane :store do
# action(cert),下載下傳[開發者證書.cer]
# 下載下傳的檔案會存在項目根目錄的build檔案夾下
# fastlane會讓你在指令行登入開發者賬号,登入成功後,會在你的[鑰匙串]中建立一個 {deliver.[username]} 的登入賬戶
cert(
# Appfile設定了這邊就可以不用了
# username: "[email protected]",
# team_id: "xxxxxxxxx2",
# 下載下傳.cer檔案的位置
output_path: "build",
)
# action(sigh),下載下傳[安裝app比對的Provision Profile檔案(pp檔案)]
# 建議自己去蘋果開發者網站證書中手動處理一波provision_profile
# 建議用 bundleId_導出方式 來命名比如:
# 企業包pp檔案叫 testDev_InHouse.mobileprovision
sigh(
# Appfile設定了這邊就可以不用了
# app_identifier: "com.devhy.testDev",
# username: "[email protected]",
# team_id: "xxxxxxxxx2",
# 下載下傳pp檔案的位置
output_path: "build",
# 自動下載下傳簽名時,adc裡pp名字,不寫也可以會根據你的bundle id、adhoc與否去下載下傳最新的一個
# provisioning_name: "testDev_InHouse",
# 僅下載下傳不建立,預設是false
readonly: true,
# 因為是根據BundleID下載下傳,導緻adhoc和appstore會優先appstore,導緻最後導出報錯,如果是adhoc包請設定為true
adhoc: true,
)
# 編譯配置,編譯的scheme,導出包方式
gym(
# 使用.env配置的環境變量
scheme: ENV['Scheme'],
# app-store, ad-hoc, package, enterprise, development, developer-id
export_method: "enterprise",
# 輸出日志的目錄
buildlog_path: "fastlanelog",
# 輸出編譯結果
output_directory: "build",
include_bitcode: false
)
end
after_all do |lane|
end
error do |lane, exception|
end
end
複制代碼
actions
在fastlane中使用的諸如cer()、sigh()、gym()都是action,其本質是預先寫好的ruby腳本(如:sigh.rb),fastlane中有很多已經寫好的actions,當然也可以自己進行編寫。
指令行常用的操作有:
- 檢視所有Action
fastlane actions
- 檢視某個Action的參數說明
如(fastlane action [action_name]
)fastlane action gym
配置後的使用
編寫完各種配置後怎麼使用?其實使用方法還是比較簡單的, 不使用.env配置,執行
fastlane [lane_name]
即可 使用某個.env配置,執行
fastlane [lane_name] --env [env_name]
即可
比如我在需要執行樣例的Fastfile的store,并使用.env.myDev配置,那我可以執行
fastlane store --env myDev
進階使用
options參數傳遞
在執行shell腳本之類的都是可以傳遞一些參數的,fastlane也是有的,
options
就是存儲了我們在指令行中執行lane時傳遞的參數的字典,在
befor_all
、
after_all
、各種
lane
裡都可以使用這個
options
傳遞參數
# 使用key:value來傳遞一組對應的參數
fastlane ent key:value key2:value2
複制代碼
接收參數
platform :ios do
before_all do |lane, options|
#options參數
value = options[:key]
value2 = options[:key2]
end
lane :ent do
...
end
end
複制代碼
private_lane
私有lane其實就像開發的時候的私有方法一樣,外部是使用不到的,如在指令行中使用
fastlane deal_param
是執行不了的,但在Fastfile内部可以調用到。
platform :ios do
# 相當于全局變量
build_config = "debug"
before_all do |lane, options|
# 調用私有lane deal_param 并将options傳遞過去
deal_param options
end
lane :ent do
# ...
end
# 私有lane,比如把傳入的build參數進行一下處理
private_lane :deal_param do |options|
build_config = build_config ? build_config : "debug"
build_config.capitalize!
end
end
複制代碼
自建Action
執行
fastlane new_action
,指令行提示輸入自建的action名稱,輸入後fastlane會幫助生成一個action編寫的模版ruby檔案,在模版中編寫自己的Action邏輯,具體因為暫時沒有寫過,請檢視官方的文檔。
與jenkins搭配使用
因為fastlane可以在指令行中使用,是以隻要在jenkins中,建構的一些環節中使用
Excute Sell
方式,然後輸入fastlane相關的指令即可了。
附錄
下載下傳樣例配置
AppFile + Fastfile .Env + AppFile + Fastfile + Options傳遞參數
參考資料
fastlane - Github fastlane - 官方文檔