The brief introduction of CICD for iOS.
簡單記錄一下如何透過 CICD 部署 iOS 套 TestFlight。需要的工具有:
- GitHub Action
- Fastlane
Steps
基本上、需要能夠可以在本機端 (local) 成功編譯跟執行你的 iOS APP。用 flutter 為例子,
就需要可以在 local 成功執行 flutter build ios
跟 flutter run
。
接下來攥寫你的 fastlane script,可以參考 fastlane 的官方文件。
- 先到 ios/ 資料夾下執行
fastlane init
,會產生一個fastlane
資料夾。 產生Fastfile
跟Appfile
(這邊可以選擇 2 Automate beta distribution to TestFlight)。 - 執行
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
來解決這個問題。