Flutter 的持續交付
如何自動化 Flutter 應用的持續構建和釋出。
遵循 Flutter 的持續交付最佳實踐,以確保您的應用程式能夠頻繁地交付給 Beta 測試人員並進行驗證,而無需訴諸手動工作流程。
CI/CD 選項
#有許多持續整合 (CI) 和持續交付 (CD) 選項可幫助自動化應用程式的交付。
具有內建 Flutter 功能的一體化選項
#將 fastlane 與現有工作流程整合
#您可以使用 fastlane 與以下工具整合
本指南演示如何設定 fastlane,然後將其與您現有的測試和持續整合 (CI) 工作流程整合。有關更多資訊,請參閱“將 fastlane 與現有工作流程整合”。
fastlane
#fastlane 是一種開源工具套件,用於自動化您的應用的釋出和部署。
本地設定
#建議您在遷移到基於雲的系統之前,先在本地測試構建和部署過程。您也可以選擇從本地機器執行持續交付。
- 安裝 fastlane
gem install fastlane或brew install fastlane。訪問 fastlane 文件 以獲取更多資訊。 - 建立一個名為
FLUTTER_ROOT的環境變數,並將其設定為您的 Flutter SDK 的根目錄。(這對於部署 iOS 的指令碼是必需的) - 建立您的 Flutter 專案,準備就緒後,請確保您的專案可以透過以下方式構建:
flutter build appbundle;以及
flutter build ipa。
- 為每個平臺初始化 fastlane 專案。
在您的 [project]/android目錄中,執行fastlane init。
在您的 [project]/ios目錄中,執行fastlane init。
- 編輯
Appfile以確保它們具有應用程式的足夠元資料。
檢查 [project]/android/fastlane/Appfile中的package_name是否與 AndroidManifest.xml 中的包名稱匹配。
檢查 [project]/ios/fastlane/Appfile中的app_identifier是否也與 Info.plist 的 bundle identifier 匹配。填寫apple_id、itc_team_id、team_id以及您的相應帳戶資訊。
- 設定您的本地登入憑據以訪問商店。
按照 Supply 設定步驟 操作,並確保 fastlane supply init成功同步來自您的 Play Store 控制檯的資料。像對待您的密碼一樣對待 .json 檔案,不要將其檢入任何公共原始碼控制儲存庫。
您的 iTunes Connect 使用者名稱已在 Appfile的apple_id欄位中。使用FASTLANE_PASSWORDshell 環境變數設定您的 iTunes Connect 密碼。否則,您將在上傳到 iTunes/TestFlight 時收到提示。
- 設定程式碼簽名。
按照 Android 應用簽名步驟 操作。
在 iOS 上,使用分發證書而不是開發證書進行建立和簽名,以便您準備好使用 TestFlight 或 App Store 進行測試和部署。- 在您的 Apple Developer Account 控制檯 中建立並下載一個分發證書。
open [project]/ios/Runner.xcworkspace/,並在您的目標的設定窗格中選擇分發證書。
- 為每個平臺建立一個
Fastfile指令碼。
在 Android 上,請按照 fastlane Android Beta 部署指南 操作。您的編輯可能很簡單,只需新增一個呼叫 upload_to_play_store的lane。將aab引數設定為../build/app/outputs/bundle/release/app-release.aab以使用flutter build已經構建的 app bundle。
在 iOS 上,請按照 fastlane iOS Beta 部署指南 操作。您可以指定歸檔路徑以避免重新構建專案。例如rubybuild_app( skip_build_archive: true, archive_path: "../build/ios/archive/Runner.xcarchive", ) upload_to_testflight
您現在可以執行本地部署,或將部署過程遷移到持續整合 (CI) 系統。
本地執行部署
#- 構建釋出模式應用。
flutter build appbundle。
flutter build ipa。
- 在每個平臺上執行 Fastfile 指令碼。
cd android然後fastlane [您建立的 lane 的名稱]。
cd ios然後fastlane [您建立的 lane 的名稱]。
雲構建和部署設定
#首先,請按照“本地設定”部分中描述的步驟進行操作,以確保該過程有效,然後再遷移到 Travis 等雲系統。
主要需要考慮的是,由於雲實例是短暫且不可信的,因此您不會將您的憑據(例如您的 Play Store 服務帳戶 JSON 或您的 iTunes 分發證書)留在伺服器上。
持續整合 (CI) 系統通常支援加密的環境變數來儲存私有資料。您可以使用 --dart-define MY_VAR=MY_VALUE 在構建應用時傳遞這些環境變數。
請注意不要在您的測試指令碼中將這些變數值回顯到控制檯。 這些變數在合併之前在拉取請求中不可用,以確保惡意行為者無法建立一個列印這些金鑰的拉取請求。請小心處理您接受和合並的拉取請求中的這些金鑰的互動。
-
使登入憑據短暫有效。
在 Android 上- 從
Appfile中刪除json_key_file欄位,並將 JSON 的字串內容儲存在您的 CI 系統的加密變數中。在您的Fastfile中直接讀取環境變數。upload_to_play_store( ... json_key_data: ENV['<variable name>'] ) - 序列化您的上傳金鑰(例如,使用 base64),並將其儲存為 CI 系統的加密環境變數。您可以在 CI 系統的安裝階段使用以下方法對其進行反序列化:bash
echo "$PLAY_STORE_UPLOAD_KEY" | base64 --decode > [path to your upload keystore]
- 從
在 iOS 上- 將本地環境變數
FASTLANE_PASSWORD移動到 CI 系統上的加密環境變數中使用。 - CI 系統需要訪問您的分發證書。fastlane 的 Match 系統建議用於在機器之間同步您的證書。
- 將本地環境變數
-
建議使用 Gemfile 而不是每次在 CI 系統上使用不確定性的
gem install fastlane,以確保 fastlane 依賴項在本地和雲機器之間保持穩定和可重現。但是,此步驟是可選的。- 在您的
[project]/android和[project]/ios資料夾中,建立一個包含以下內容的Gemfile:source "https://rubygems.org" gem "fastlane" - 在兩個目錄中,執行
bundle update並將Gemfile和Gemfile.lock檢入原始碼控制。 - 在本地執行時,使用
bundle exec fastlane代替fastlane。
- 在您的
-
在您的儲存庫根目錄中建立 CI 測試指令碼,例如
.travis.yml或.cirrus.yml。- 請參閱 fastlane CI 文件 以獲取 CI 特定設定。
- 將您的指令碼分片,以便在 Linux 和 macOS 平臺上執行。
- 在 CI 任務的設定階段,執行以下操作:
- 確保 Bundler 可用,使用
gem install bundler。 - 在
[project]/android或[project]/ios中執行bundle install。 - 確保 Flutter SDK 可用並在
PATH中設定。 - 對於 Android,請確保 Android SDK 可用,並且設定了
ANDROID_SDK_ROOT路徑。 - 對於 iOS,您可能需要指定對 Xcode 的依賴項(例如,
osx_image: xcode9.2)。
- 確保 Bundler 可用,使用
- 在 CI 任務的指令碼階段:
- 執行
flutter build appbundle或flutter build ios --release --no-codesign --config-only,具體取決於平臺。 cd android或cd iosbundle exec fastlane [您建立的 lane 的名稱]
- 執行
Xcode Cloud
#Xcode Cloud 是一個持續整合和交付服務,用於構建、測試和分發 Apple 平臺的應用程式和框架。
要求
#- Xcode 13.4.1 或更高版本。
- 已註冊 Apple Developer Program。
自定義構建指令碼
#Xcode Cloud 識別 自定義構建指令碼,可以在指定時間執行其他任務。它還包括一組 預定義的環境變數,例如 $CI_WORKSPACE,它是克隆的儲存庫的位置。
克隆後腳本
#利用克隆後自定義構建指令碼,該指令碼在 Xcode Cloud 克隆您的 Git 儲存庫後執行,請按照以下說明操作:
在 ios/ci_scripts/ci_post_clone.sh 中建立一個檔案,並新增以下內容。
#!/bin/sh
# Fail this script if any subcommand fails.
set -e
# The default execution directory of this script is the ci_scripts directory.
cd $CI_PRIMARY_REPOSITORY_PATH # change working directory to the root of your cloned repo.
# Install Flutter using git.
git clone https://github.com/flutter/flutter.git --depth 1 -b stable $HOME/flutter
export PATH="$PATH:$HOME/flutter/bin"
# Install Flutter artifacts for iOS (--ios), or macOS (--macos) platforms.
flutter precache --ios
# Install Flutter dependencies.
flutter pub get
# Install CocoaPods using Homebrew.
HOMEBREW_NO_AUTO_UPDATE=1 # disable homebrew's automatic updates.
brew install cocoapods
# Install CocoaPods dependencies.
cd ios && pod install # run `pod install` in the `ios` directory.
exit 0
此檔案應新增到您的 git 儲存庫並標記為可執行。
git add --chmod=+x ios/ci_scripts/ci_post_clone.sh
工作流程配置
#一個 Xcode Cloud 工作流程 定義了在觸發工作流程時 CI/CD 過程中執行的步驟。
要在 Xcode 中建立新的工作流程,請按照以下說明操作:
-
選擇 產品 > Xcode Cloud > 建立工作流程 以開啟 建立工作流程 表格。
-
選擇工作流程應附加到的產品(應用程式),然後單擊 下一步 按鈕。
-
下一個表格顯示了 Xcode 提供的預設工作流程的概述,可以透過單擊 編輯工作流程 按鈕進行自定義。
分支更改
#預設情況下,Xcode 建議分支更改條件,該條件會在您的 Git 儲存庫的預設分支發生任何更改時啟動新的構建。
對於您應用的 iOS 版本,您希望 Xcode Cloud 在您修改 Flutter 包或修改 lib\ 和 ios\ 目錄中的 Dart 或 iOS 原始碼檔案後觸發您的工作流程,這是合理的。
這可以透過使用以下檔案和資料夾條件來實現:
下一個構建編號
#Xcode Cloud 預設將新工作流程的構建編號設定為 1,並在每次成功構建後遞增。如果您正在使用具有更高構建編號的現有應用,則需要配置 Xcode Cloud 以在其構建中使用正確的構建編號,只需在您的迭代中指定 Next Build Number 即可。
請檢視 設定 Xcode Cloud 構建的下一個構建編號 以獲取更多資訊。