天天看點

和重複勞動說再見-使用fastlane進行iOS打包背景配置使用環境配置fastlane進階使用附錄

背景

初識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,當然也可以自己進行編寫。

指令行常用的操作有:

  1. 檢視所有Action

    fastlane actions

  2. 檢視某個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 - 官方文檔