和重複勞動說再見-使用fastlane進行iOS打包

fastlane00

背景

初識fastlane

fastlane是一個經過簡單命令來完成諸如截圖、獲取證書、編譯、導出安裝包、提交iTunesConnect等一系列操做的工具,它同時支持iOS和Android。 你可以經過簡單的方式配置流程進行的順序,並經過很是簡單的命令執行其中的一個流程。固然它的簡單並不表明功能也簡陋,有開源社區的支持,更新迅速且有不少功能可以知足你的需求。 ios

fastlane01

爲何使用它

以前咱們使用的是jenkins內的Xcode integration進行編譯工做,可是其更新比較慢(至2017.12.20還未支持Xcode9),Xcode大版本更新後出現沒法繼續使用的問題。 後改用fastlane,發現其使用和配置還算簡單,有開源社區支持,更新迅速功能強大。且相比jenkins裏的插件,fastlane能夠單獨使用,也能夠被多種CI接入git

配置使用環境

fastlane使用的是ruby環境且對ruby有版本要求(官網要求是ruby2.0以上),因此若是須要的話更新一波ruby,而後經過gem安裝fastlane。github

更新ruby

更新ruby使用的是RVM工具,在命令行進行以下操做,安裝時可能出現進度不動,多半多是由於被牆了。shell

#安裝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的版本 api

fastlane02

由於我以前已經安裝過了,因此提示是已經安裝成功 ruby

fastlane03

安裝fastlane

若是ruby版本知足要求,能夠直接在命令行執行如下命令安裝fastlane,這個安裝比較順利沒出現報錯,若是有報錯能夠根據緣由搜索一下解決辦法。bash

#安裝fastlane
sudo gem install -n /usr/local/bin fastlane
複製代碼

配置fastlane

使用的環境搭建好了,就能夠進行這一步來配置fastlane了。markdown

初始化

執行默認的初始化app

cd 項目目錄
fastlane init
複製代碼

根據提示輸入信息,這一步我沒有按照提示處理,由於在有多個BundleID多個target的工程上使用,實際上生成的配置仍是要修改的。curl

若是你的項目只有一個bundle id也只有一個開發者帳號的話,能夠直接遵循官方的步驟配置。

fastlane06

初始化完成後能夠看到項目目錄裏多出了一個fastlane文件夾,內有兩個比較重要的文件AppfileFastfile

fastlane07
fastlane08

大體流程

經過在命令行執行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    "devhy1@xxxx.com"
team_id    "xxxxxxxxx1"

# 若是lane是ent換成Dev的配置
for_lane :ent do
  app_identifier    "com.devhy.testDev"
  apple_id    "devhy2@xxxx.com"
  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 = "xx2@xxxx.com"
# 開發者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: "devhy2@xxxx.com",
      # 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: "devhy2@xxxx.com",
      # 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_allafter_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相關的命令便可了。

fastlane-10

附錄

下載樣例配置

AppFile + Fastfile .Env + AppFile + Fastfile + Options傳遞參數

參考資料

fastlane - Github fastlane - 官方文檔

相關文章
相關標籤/搜索