Fastlane 自動打包上傳 iOS App

每當開始出現一些重複性的工作時,我們就做一個工具來幫我們自動完成這些任務,比如寫完 code 後操作 git 的 commit/push/merge、截圖、跑測試等等。

而 Fastlane 就是通過 Ruby 撰寫的整合性工具,其中包含了可以處理構建、測試、上傳、屏幕截圖等一系列工具,目前已經被Google收購了。

關於 Fastlane

Fastlane 包含了打包、簽名、測試、部署、發布等等移動開發中會涉及到的工具,當然我們也是可以通過 ruby 來自己寫 plugin 的。

iOS 方面初期應該會用到這些:

  • Scan – run tests.
  • Gym – build app.
  • Deliver – upload screenshots, metadata, app to App Store.
  • Snapshot – automate taking localized screenshots.
  • Pilot – Upload a new binary to iTunes Connect for TestFlight beta testing.
  • Sigh – 處理配置 (Provisioning profiles) 相關工作。

更多的工具可以看看官方的 Actions 列表

持續集成中的重複工作

當我們完成一部分開發內容以後,會進行發布到 Testflight 上進行測試,而這過程可能是這樣的:

  1. 在負責發布的電腦上執行 git pull 拿到最新的 code。
  2. 執行 pod install 來安裝/更新依賴包。
  3. 修改 Xcode中的 version/build 號。
  4. 通過 Xcode 將 code 進行 Archive 編譯和打包。
  5. 選擇一個要上傳的 ipa 文件(上一步 archive 的 ipa 檔案)
  6. 通過 Xcode 或者 Application Loader 上傳 ipa 檔案。
  7. 等待上傳處理完成,登入 itunes connect 選擇要測試的版本。
  8. commit code(因為修改了 Xcode 中 version/build 號碼)

每一次打完一段 code 以後就要這樣做一次,而這裡都還包括測試的環節,這樣重複性的工作真的佔用了不少時間。

安裝&初始化Fastlane

可以通過 Ruby Gem 來安裝 Fastlane:

在Xcode項目中初始化Fastlane:

初始化的過程會要求填寫 iTunes Connect 帳號等資訊,如果是全新的項目,會幫你在 iTunes Connect 中建立 App。

設定完成後可以看到 Xcode 項目中會多一個 faselane 目錄。

Appfile

這裡放的是和 App 有關的資訊,包括 app identifier,apple id、team id…等等。

需要注意的是,如果你的帳號同時有多個 team,可以在這裡直接設定 itc_team_id 或者 itc_team_name,因為如果沒有設定的話,
在 fastlane 執行發布相關的任務時,會詢問使用者要用哪一個 team,這樣就沒辦法自動化了。

可以在這裡看更多有關 Appfile 的設定

Deliverfile

可以在這裡直接設定 app identifier 和 user name(Apple user ID),如果你的帳號同時有多個 team 的話。

也可以在具體執行任務的時候加入,比如pilot(team_name: “Don Chen”)

可以在這裡看更多有關 Deliverfile 的設定

Fastfile

這裡放的是具體要執行的命令,一個打包上傳到TestFlight的例子:

其中 pilot 指定了 team_name 是因為我的帳號有多個 team,需要指定一個。

其中 lane 代表任務, beta 代表任務的名稱。

然後在 terminal 中執行任務:

而 increment_build_number 是自動讓 build 號碼增加 1,這個需要搭配 Xcode 設定。

這個任務的 lane 取名叫做 beta,於是在 terminal 中之行 fastlane iOS beta,就會開始自動執行任務了。

  • increment_build_number – build 號碼增加 1
  • gym(scheme: “Lab-Fastlane”)  – build 項目
  • pilot(team_name: “Tung Chen”) – 上傳到 TestFlight ( iTunes connect ) 上。

需要注意的是:

而目前 iTunes Connect 會要求 App 填寫「出口合規證明」,如果沒有對 code 另外進行加密可以直接設定為 No。

在 info.plist 中可以設定:


Fastlane Metadata

前面我們以發布 app 到 TestFlight 為例子,接下來會說明和 release 有關的內容。

  • copyright.txt – 填寫 copyright 信息,比如 Copyright (c) 2017 Don
  • primary_category.txt  – 填寫主分類,比如 Games
  • primary_first_sub_category.txt – 填寫分類,比如 Card
  • primary_second_sub_category.txt  – 填寫 second_sub 分類,比如 Casino

而發布方面的資訊,也可以根據不同的應用市場來創建資料:

可以到這裡看到更多關於 Deliver 的設定

截圖(Screenshots)

這裡我們要用到 snapshot 這個工具

首先我們需要加入 iOS UI Test Bundle,File -> new target -> iOS UI Test Bundle。

然後在我們的項目中初始化 snapshot:

這時候 fastlane fold 裡面會多一個 SnapshotHelperXcode8.swift,把這個文件直接拖到剛才建立的 UITests 中。

Sanpfile

除了剛才提到的 SnapshotHelper 以外,還會看到一個 snapfile 的設定檔。

  • devices: 可以指定想要開啟的設備類型,要注意大小寫敏感比如打「iPhone 7 plus」不會過,要打「iPhone 7 Plus」。
  • languages:可以指定要設備的語言,這樣做多國語言的時候,截圖就可以有不同語言的畫面了
  • output_directory:截圖的保存的路徑。
  • clear_previous_screenshots:每一次截圖是不是要清理原本的檔案。

這裡可以看到更多有關 Sanpshots 的設定


UITests

通過 UITests 來執行截圖任務,其中 snapshot (“圖片名稱”) – 這是截圖的方法,參數是圖片名稱。

terminal 中輸入 fastlane snapshot 開始截圖任務

更新:Xcode 9 以後模擬器會被關起來,在關起來以後再手動打開就可以看到跑測試的流程。

執行的過程會看到 testing 在執行任務、切換語言等等,最後會在 screenshots 中看到我們的圖片:

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *