1. 程式人生 > Android開發 >fastlane的使用及檔案編寫

fastlane的使用及檔案編寫

背景

我們在開發過程中總免不了需要經歷發測、上傳等環節。這開發環節中,我們需要打不同環境的包,上傳對應的分發後臺(例如”蒲公英“、TestFlight、iTunes Connect)等。每次的手動打包的過程中,我們都要選擇對應的環境、對應打包的證書、正確的target等工作。萬一上述步驟哪一步選錯了,輕者得重新走一遍上述的流程,更嚴重點還有可能會把測試服的資料傳到正式服去了。仔細想想後患無窮。有沒有一種方法可以在設定好一系列的任務流程後,只需要一句程式碼就可以自動幫我們完成上面提及的一些列操作。既減少我們手動操作的同時,還能減少選擇環境證書導致錯誤的方法呢?有!fastlane就能幫到你。

fastlane

fastlane是一個自動化構建工具,主要包含測試、打包、釋出等功能,它內部是由ruby實現的,是一款自動化非常高的指令碼工具。

安裝

mac自帶的ruby,需要 sudo許可權 sudo gem install fastlane

初始化

在專案根目錄(通俗一點就是跟你.xcworkspace、Podfile檔案同級的t地方)下,初始化Fastlane: fastlane init

選擇對應需要的功能後完成初始化,這裡我們選擇4。

在初始化完成後我們看到在根目錄下生成了一個fastlane的資料夾還有一個Gemfile檔案

-fastlane
  -Fastfile(儲存有關開發者賬號相關資訊)
  -Appfile(核心檔案,主要用於 命令列呼叫和處理具體的流程,lane相對於一個方法或者函式)
-Gemfile(Gemfile是我們建立的一個用於描述gem之間依賴的檔案。gem是一堆Ruby程式碼的集合,它能夠為我們提供呼叫)
複製程式碼

至此我們完成了第一步,fastlans的初始化。開啟Fastfile我們就可以看見fastlane的核心檔案了。

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
複製程式碼

我們只需要在命令列敲fastlane custom_lane就可以執行這個自定義的任務。但當然由於我們啥都沒設定,他並不會有任何效果。

Fastfile檔案編寫

和我們iOS的ViewController一樣,fastlane也是有生命週期的。fastlane的生命週期為

執行順序 方法名 說明
1 before_all 在執行 lane 之前只執行一次
2 before_each 每次執行 lane 之前都會執行一次
3 lane 自定義的任務
4 after_each 每次執行 lane 之後都會執行一次
5 after_all 在執行 lane 成功結束之後執行一次
6 error 在執行上述情況任意環境報錯都會中止並執行一次

lane

lane是fastfile中的方法定義標籤,可以理解為函式。fastlane 都是基於ruby,所以fastfile中也是使用ruby語法的。

定義一個簡單的無參lane
lane :noParam_lane
    puts "這是一個無引數的lane"
end

複製程式碼

呼叫方法fastlane noParam_lane

定義一個帶參的lane,在fastfile中option類似於一個字典集。我們可以通過 option[:configuration] 取其中value
lane :param_lane do |option| 
   param = option[:param]
   puts "這是一個有引數的lane"
   puts param
end
複製程式碼

呼叫方法param_lane(param: '我是引數')

Action

除開我們自定義fastfile中的方法,fastlane還提供了很多已經寫好的獨立的方法庫,也就是Actions。 常見的action可以查閱Actions 或呼叫fastlane程式碼fastlane actions

舉例

下面我們舉一個簡單的打包例子

APP_NAME = "XXX"
SCHEME = "XXX"
platform :ios do
  #在執行lane前先跑一遍cocoapods
  before_all do
    cocoapods
  end

  #debug包
  lane :iosDebug do
    package(configuration: "Debug",method:"development")
  end

  #release包
  lane :iosRelease do
    package(configuration: "Release",method:"ad-hoc")
  end

    #釋出包
  lane :iosAppStore do
    package(configuration: "Release",method:"app-store"")
  end

  #打包函式
  lane :package do |option|
     #打包
     gym(
      scheme: "#{SCHEME}",
      export_method: option[:method],configuration: option[:configuration],include_symbols: true,include_bitcode: false,export_xcargs: "-allowProvisioningUpdates"
      )
      
  end
複製程式碼

首先我們在Fastfile中全域性定義了幾個引數分別用於儲存應用名、SCHEME等公用引數。在上一章節中我們說過fastlane的生命週期中有一個before_all(在執行 lane 之前只執行一次),我們在這個方法中先更新了一遍cocoaPods。然後定義了3個lane,分別對應我們開發過程中測試服發測、正式服發測、以及上傳appstore的3種打包流程。在流程中通過對configuration 和method 的傳參達到配置不同打包環境的效果。

switch lane

我們可以從程式碼中看到,iosDebug、iosRelease、iosAppStore 3個lane最後都呼叫了一個公用的lane package。這種在一個lane中呼叫另一個lane的使用方式我們把它命名為switch lane

gym

gym其實是actionbuild_app的別名。按照他的官方的說法,使用gym來構建ipa檔案,會比其他構建工具還要快30%(真香)。

gym的引數有非常多取幾個比較常用的來講一下

| 引數名 | 解釋 |預設值| |: --------: | :-----: | :----: | | workspace | workspace檔案的路徑| | | project | project檔案的路徑| | | scheme | 要打包專案的scheme| | | clean | 打包前要不要clean一下(最好還是clean一下吧,這個預設值是不clean的)|false | | output_directory | 打包後匯出的目錄|*(根目錄) | | output_name | 匯出ipa的名字| | | configuration | 打包的配置| ”Release”| | include_symbols | ipa檔案應包含符號表嗎| | | include_bitcode | ipa檔案應包含include_bitcode嗎| | | export_method | 匯出有效值的方法,有效值包括:app-store,ad-hoc,package,enterprise,development,developer-id| | 其他詳細的不常用的就不復制貼上了大家可以看build_app這裡 。

執行打包

有了上面對打包方法的封裝,我們只需要根據不同的打包需求。測試服發測呼叫iosDebug;正式服發測呼叫iosRelease;打appstore包呼叫iosAppStore 即可獲得我們想要的不同環境的包了。

上傳蒲公英

我們在發測過程中還有上傳到軟體分發後臺的操作,這個功能fastlane同樣幫我們封裝成外掛了。我們只需要在在終端中,輸入以下命令,即可安裝蒲公英的 fastlane 外掛。 fastlane add_plugin pgyer

安裝完畢後,我們在Fastfile裡需要上傳到蒲公英的lane中加入相應的命令即可在得到ipa包後直接上傳蒲公英

#debug包
lane :iosDebug do
  package(configuration: "Debug",method:"development")
  pgyer(api_key: "7f15xxxxxxxxxxxxxxxxxx141",user_key: "4a5bcxxxxxxxxxxxxxxx3a9e")
end

#release包
lane :iosRelease do
  package(configuration: "Release",method:"ad-hoc")
  pgyer(api_key: "7f15xxxxxxxxxxxxxxxxxx141",user_key: "4a5bcxxxxxxxxxxxxxxx3a9e")
end
複製程式碼

PS:api_key和user_key在蒲公英的後臺獲取。

最後再呼叫一下lane:

可以看到在執行完cocoaPods、打包、上傳蒲公英3個操作後。lane結束了任務!幫我們省了9分鐘呢!9分鐘打局王者他不香麼!

拓展

有一個振奮人心的訊息是:fastlane支援Swift編寫了!!!Swift成為世界最好的語言指日可待!其實用法跟ruby版本類似,我也根據說明檔案寫了一下,如果是熟悉Swift程式碼編寫的同行應該很容易上手。但其實這個fastlane.swift只是基於ruby的封裝,並不是原生的Swift。但還是足以讓iOS開發者興奮的。不過侷限於當前的bate版本是不支援外掛的,因此像上文提及的上傳到蒲公英這些操作fastlane.swift還無法實現。所以實用性還是不能跟ruby原生版本相提並論的。或許將來的某天fastlane.swift正式版釋出可以解決這一問題,到時候我再補充Swift版本。Fastlane的開發者們加油吧!期待正式版釋出!

參考資料:

Fastlane/Jenkins:一人團隊也用得上的 Continuous Delivery 系統

Fastlane官網

Fastlane(一):用法