guest@blog.cmj.tw: ~/posts $

CICD for iOS


The brief introduction of CICD for iOS.

簡單記錄一下如何透過 CICD 部署 iOS 套 TestFlight。需要的工具有:

  • GitHub Action
  • Fastlane

Steps

基本上、需要能夠可以在本機端 (local) 成功編譯跟執行你的 iOS APP。用 flutter 為例子, 就需要可以在 local 成功執行 flutter build iosflutter run

接下來攥寫你的 fastlane script,可以參考 fastlane 的官方文件。

  1. 先到 ios/ 資料夾下執行 fastlane init,會產生一個 fastlane 資料夾。 產生 FastfileAppfile (這邊可以選擇 2 Automate beta distribution to TestFlight)。
  2. 執行 fastlane match init 產生 Matchfile :選擇你的 storage (git、s3、… etc.) 並設定。 之後執行 fastlane match 建立並更新你的 certificate 跟 provisioning profile。

透過上面的步驟、就可以產生一個簡單的 fastlane script。下面則是一個簡單的 Fastfile

update_fastlane
default_platform(:ios)

platform :ios do
  desc "Push a new beta build to TestFlight"
  lane :beta do
    setup_ci if ENV['IS_CI']
    match(type: "appstore", readonly: is_ci)

    update_code_signing_settings(use_automatic_signing: false, path: "Runner.xcodeproj")
    build_app(workspace: "Runner.xcworkspace", scheme: "Runner")

    upload_to_testflight
  end
end

Tricky

下面是可能遇到的問題

1. 2FA

如果你的 Apple ID 開啟了 2FA,那麼你的 fastlane script 就會失敗。因為 fastlane 會詢問你的 2FA code,但是在 CICD 環境下是沒有辦法輸入的。解決方法是透過 app-specific password 來 取代你的 Apple ID password。

同時也需要使用 Connect API Key 來取代 upload_to_testflight,因為 upload_to_testflight 會詢問你的 2FA code。

2. Enable New Entitlement

如果你的 APP 有使用到 Push Notification 那你的 Apple 就需要開啟額外的 entitlement。 修改這個設定需要重新產生一個新的 provisioning profile,並且重新執行 fastlane match appstore

3. 缺少出口合規資訊

在早期美國有限制出口加密技術,所以需要在你的 APP 裡面加入一些合規資訊。在這邊可以透過在 Info.plist 裡面加入 ITSAppUsesNonExemptEncryption 來解決這個問題。