利用fastlane進行專案的自動化構建

Doliant發表於2019-05-02

fastlane

在一個iOS專案進行到了測試和釋出階段,一般都會經歷一次又一次的打包-截圖-上傳及metadata填寫及修改的過程。這點做伺服器開發的同學就要比我們幸福太多了,因為這一部分的工作他們可以交付給運維同學來完成。那我們就只能自己手動去做這些重複且耗時的操作了麼?答案並不是,fastlane就給我們提供了一整套工具來幫助我們實現自動化。

一、Fastlane簡介及配置安裝

1.簡介

fastlane是一套基於ruby開發的自動化構建工具,為專案的釋出流程提供一整套解決方案。

2.安裝

2.1 確保安裝了最新版的Xcode command line tools

對使用Xcode進行開發的iOS開發者是標配,若發現提示沒有安裝的話嘗試使用以下命令安裝

xcode-select --install 
複製程式碼

2.2 選擇安裝方式

安裝方式一共有三種:

homebrew installer script RubyGem
brew cask install fastlane 下載安裝包,執行安裝指令碼 sudo gem install fastlane -NV

筆者專案中都使用到了cocoapods本地有Ruby環境,因此選擇了第三種安裝方案

2.3 安裝bundler

若你的ruby環境中沒有安裝bundler,執行以下命令安裝bundler

sudo gem install bundler
複製程式碼

3.配置

進入專案的根目錄中

3.1 初始化

fastlane init
複製程式碼

初始化的過程中會詢問您的APPID和密碼,請放心它只會把密碼資訊存在本地的keychain中,並不會傳到雲端伺服器。

初始化的過程中會有四個選項,分別是為四種不同的任務建立配置:

  1. 自動化截圖
  2. 自動建立TestFlight測試版釋出專案
  3. 自動建立Appstore釋出專案
  4. 手動設定自己需要任務的配置

第一次建立可以選擇第三項,它會自動檢測當前專案的App NameApp bundleID並輸出在控制檯,若資訊有誤可以在確認資訊的時候選擇n然後去配置檔案中手動編輯。接著會詢問是否需要在ITUADC中建立專案,若選擇了y會生成類似下圖的目錄結構,其中AppfileFastfile這兩個核心檔案必然會被建立。

fastlane
├── Appfile
├── Deliverfile
├── Fastfile
├── metadata
│   ├── copyright.txt
│   ├── en-US
│   │   ├── description.txt
│   │   ├── keywords.txt
│   │   ├── marketing_url.txt
│   │   ├── name.txt
│   │   ├── privacy_url.txt
│   │   ├── release_notes.txt
│   │   └── support_url.txt
│   ├── primary_category.txt
│   ├── primary_first_sub_category.txt
│   ├── primary_second_sub_category.txt
│   ├── secondary_category.txt
│   ├── secondary_first_sub_category.txt
│   ├── secondary_second_sub_category.txt
│   └── zh-Hans
│       ├── description.txt
│       ├── keywords.txt
│       ├── marketing_url.txt
│       ├── name.txt
│       ├── privacy_url.txt
│       ├── release_notes.txt
│       └── support_url.txt
└── screenshots
    ├── README.txt
複製程式碼

若選擇了n可以在之後使用fastlane提供的對應功能的命令來生成配置檔案。

筆者已經習慣了自己手動去設定相關的配置檔案,一般都直接使用第四種方式建立任務。

3.2 使用Gemfile管理fastlane的版本和依賴

cocoapods一樣,fastlane也可以使用Gemfile來管理對應的版本和依賴。

在執行init操作的時候會自動生成一個Gemfile內容如下:

source "https://rubygems.org"

gem "fastlane"
複製程式碼

可以直接在此處指定fastlane的版本資訊。

致辭我們的初始化操作就完成了。

二、Fastlane的理念及元件

在上一步初始化的操作中,生成了兩個核心檔案Appfile以及Fastfile,其中Appfile存放的是你appbundleID以及appID

Fastfile是我們實際的自動化流程操作實現檔案,我們會將相關動作在其中實現。

1.理念

Fastlane有兩個重要的概念:

  • action: 每一個動作就是action,對應一條命令。
  • lane: 某個操作流程,比如釋出appstore的包的一系列action集合是一個lane,釋出adhoc包又是一個lane

當執行fastlane命令列工具的時候會讀取fastlane目錄下的Fastfile檔案,執行相應lane中的action操作

一個簡單的流程:

lane :dependence_manager do
# 執行cocoapods屬於一個action
cocoapods
# 執行carthage屬於一個action
carthage
end
複製程式碼

2.元件

fastlane提供了一套工具集,涵蓋了釋出流程大多數可能會使用到的操作,主要包括幾個大類:

  • 測試: scan-自動生成測試工具,並可以生成HTML報告
  • 構建: gym-專案打包工具、cocoapod-執行pod install操作
  • 截圖: snapshot-截圖工具(需要編寫UI測試)、framekit-生成帶邊框的截圖
  • 專案: increment_build_number:增加專案構建次數
  • 簽名: match-同步簽名資訊和專案provision profilecert-同步ADC中的證書資訊、register_device-向ADC中新增新的裝置
  • 文件: appledoc-根據原始碼生成Apple風格的程式碼文件
  • Beta: testflight-將專案釋出至testflight
  • 推送: pem-獲取推送證書
  • 釋出: deliver-將專案釋出至appstore
  • 版本控制: git pull-這就不用解釋了
  • 通知: Slack-將打包資訊告知你的開發組

fastlane提供的工具非常之多,以上只列舉了部分常用的元件,想了解更多請訪問Fastlane Actions文件

3.第三方外掛

fastlane內部提供了足夠多的工具,同時也支援第三方的外掛接入。可以使用

fastlane search_plugins
複製程式碼

命令來檢視所有可用第三方外掛。

這裡介紹兩個最常用的外掛:

  • firim: 將測試包釋出到firim
fastlane add_plugin firim
複製程式碼
  • pgyer: 將測試包釋出到蒲公英
fastlane add_plugin pgyer
複製程式碼

三、Fastlane實踐之旅

由於fastlane提供的元件相當之多,專案實踐中並不一定都能用上。比如snapshot截圖工具,由於公司的宣傳頁面都是使用的UI切圖,筆者也一直沒有具體實踐的機會。這一部分只能介紹下筆者在專案中實際用過的元件,要是您想要了解的部分並沒有被提及,fastlane提供了十分詳細的文件可以參考。

1.match-同步證書及provision profile利器

在多人開發的iOS專案中,大部分新手應該都鬧出過刪證書的笑話,尤其是一些小公司用的個人開發者賬號去開發公司專案,成員之間就需要依靠證書的P12檔案來進行證書的傳遞,這種方式效率又低管理又不方便。

fastlanematch命令就提供了一套基於git的證書和provision profile管理方案。通過match生成的證書和provision profile將會同步到一個你指定的git地址,需要的成員通過match去下拉專案需要的證書到本地,match會自己負責和ADC證書及provision profile的同步操作。

1.1 match初始化

通過命令

match init
複製程式碼

會讓你輸入一個git地址,這個地址就是證書的存放位置,同時會在專案中的fastlane中建立一個matchfileFastfile同級,其中的內容就是此git地址

1.2 生成證書和provision profile

# 生成appstore釋出證書及provision profile
fastlane match appstore

# 生成adhoc釋出證書及provision profile
fastlane match adhoc

# 生成除錯證書
fastlane match development
複製程式碼

這一步match會檢測ADC中是否有需要的證書和provision profile要是有就直接下載到本地,要是沒有就直接在ADC中建立

match自動建立的provision profile如圖:

image

完全不用自己手動在ADC中建立了是不是非常方面

1.3 在Xcode中配置證書和provision profile

到了這一步其實就和手動建立配置證書一樣了,就不再贅述。

1.4 在Fastlanefile中配置證書操作的lane

貼上在專案中的實際配置

desc "Init develope environment"
  lane :config do
    match(type: "appstore", app_identifier: AppID, readonly: true)
    match(type: "adhoc", app_identifier: AppID, readonly: true)
    cocoapods
  end
複製程式碼

以上配置完成之後,團隊新加入成員或者更換了裝置後只要執行

fastlane config 
複製程式碼

命令即可同步整套開發釋出環境,相當方便。

2.sigh-選擇正確的provision profile

matchprovision profile下載到本地,sigh在打包之前確認對應使用的provision profile

用法如下:

sync_code_signing(type: "appstore", 
                  readonly: true, 
            app_identifier: AppID)
複製程式碼

3.gym-編譯打包工具

action就是對應的XcodeArchive操作

# gym是build_app命令的一個別名
build_app(workspace: "xxxxxx.xcworkspace", 
              scheme: "xxxxxxxx",
              configuration: "release",
              # 輸出.ipa檔案的路徑
              output_directory: "./Package/AppStore",
              export_method: "app-store")
複製程式碼

4.deliver-釋出工具

fastlane init的時候若是沒有允許fastlane自動同步專案在ADC中的metadata。可以使用

fastlane deliver init 
複製程式碼

來建立ADC中需要的metadata檔案,會在專案中的fastlane目錄下建立metadata資料夾以及Deliverfile檔案。

若是ADC中已經存在了metadata資訊,則可以使用

fastlane deliver download_metadata
複製程式碼

來同步ADC上的metadata資訊。

注意:若是ADC中存在已經編輯好的metadata沒有同步到本地,則deliver上去的metadata會覆蓋原有的metadata

實際在Fastfile中的用法很簡單就一行程式碼:

# deliver是upload_to_app_store的一個別名兩個方法用法一致
upload_to_app_store
複製程式碼

5.完整發布appstore的lane

Fastfile中如下:

desc "upload release version"
  lane :release do
    sync_code_signing(type: "appstore", 
                  readonly: true, 
            app_identifier: AppID)
    build_app(workspace: "xxxxx.xcworkspace", 
              scheme: "xxxxxxx",
              configuration: "release",
              output_directory: "./Package/AppStore",
              export_method: "app-store")
    upload_to_app_store
  end
複製程式碼

只要在命令列執行

fastlane release
複製程式碼

即可完全自動化釋出的流程,極大的節省了開發者的時間。

6.釋出到fir.im或蒲公英

upload_to_app_store替換為firimpgyer外掛提供的上傳方法即可。

firim(firim_api_token:"xxxxxxxxxxxxxxxxxx")

四、總結

fastlane是一套及其強大的自動化構建工具,善用action可以定製很多個性化操作,筆者只是拋磚引玉提供了一套滿足最基本釋出需求的方案。如果您有更好的方案,歡迎郵件交流。

由於筆者所在公司並沒有專門的iOS打包機,很遺憾沒有實踐fastlane+jekins的機會。但身為軟體開發工程師尋找更"輕鬆"的工作方式應該是我們一直以來的追求,筆者在今後的工作中也會持續在這個方向發力。

五、參考文獻

小團隊的自動化釋出: whlsxl.github.io/index.html

How to Set Up Fastlane: blog.metova.com/how-to-set-…

fastlane官方文件: docs.fastlane.tools/

六、縮寫釋義

ADC: Apple Developer Center

ITC: iTunes Connect

相關文章