使用 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 專案。
- 在您的
[專案]/android
目錄中,執行fastlane init
。 - 在您的
[專案]/ios
目錄中,執行fastlane init
。
- 在您的
- 編輯
Appfile
,以確保它們包含您應用程式的足夠中繼資料。- 檢查
[專案]/android/fastlane/Appfile
中的package_name
是否與 AndroidManifest.xml 中的套件名稱相符。 - 檢查
[專案]/ios/fastlane/Appfile
中的app_identifier
是否也與 Info.plist 的套件識別碼相符。使用您的帳戶資訊填寫apple_id
、itc_team_id
、team_id
。
- 檢查
- 設定您商店的本機登入憑證。
- 依照 Supply 設定步驟,並確保
fastlane supply init
成功地從您的 Play 商店主控台同步資料。將 .json 檔案視為您的密碼,且不要將其簽入任何公開的原始碼控制儲存庫中。 - 您的 iTunes Connect 使用者名稱已在
Appfile
的apple_id
欄位中。使用您的 iTunes Connect 密碼設定FASTLANE_PASSWORD
Shell 環境變數。否則,您會在上傳至 iTunes/TestFlight 時收到提示。
- 依照 Supply 設定步驟,並確保
- 設定程式碼簽署。
- 依照Android 應用程式簽署步驟。
- 在 iOS 上,當您準備好使用 TestFlight 或 App Store 進行測試和部署時,請使用發佈憑證而不是開發憑證來建立和簽署。
- 在您的 Apple 開發人員帳號主控台中建立和下載發佈憑證。
open [專案]/ios/Runner.xcworkspace/
並在您目標的設定窗格中選取發佈憑證。
- 為每個平台建立
Fastfile
腳本。在 Android 上,依照fastlane Android Beta 部署指南。您的編輯可以很簡單地新增一個呼叫
upload_to_play_store
的lane
。設定aab
引數為../build/app/outputs/bundle/release/app-release.aab
,以使用flutter build
已建置的應用程式套件。在 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 商店服務帳戶 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 系統上使用以下方式將其還原序列化:bash
echo "$PLAY_STORE_UPLOAD_KEY" | base64 --decode > [path to your upload keystore]
- 從
- 在 iOS 上
- 移動本機環境變數
FASTLANE_PASSWORD
,以使用 CI 系統上的加密環境變數。 - CI 系統需要存取您的發佈憑證。建議使用 fastlane 的 Match 系統,在機器之間同步您的憑證。
- 移動本機環境變數
- 在 Android 上
建議您使用 Gemfile,而不是每次都在 CI 系統上使用不確定的
gem install fastlane
,以確保 fastlane 相依性在本地和雲端機器之間是穩定且可重現的。但是,此步驟是可選的。- 在您的
[專案]/android
和[專案]/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 任務的設定階段,執行以下操作:
- 使用
gem install bundler
確保 Bundler 可用。 - 在
[專案]/android
或[專案]/ios
中執行bundle install
。 - 確保 Flutter SDK 可用且已設定在
PATH
中。 - 對於 Android,請確保 Android SDK 可用且已設定
ANDROID_SDK_ROOT
路徑。 - 對於 iOS,您可能必須指定 Xcode 的相依性(例如,
osx_image: xcode9.2
)。
- 使用
- 在 CI 任務的腳本階段:
- 執行
flutter build appbundle
或flutter build ios --release --no-codesign
,具體取決於平台。 cd android
或cd ios
bundle exec fastlane [lane 名稱]
- 執行
Xcode Cloud
#Xcode Cloud 是一種持續整合和交付服務,用於建置、測試和發佈 Apple 平台的應用程式和框架。
需求
#- Xcode 13.4.1 或更高版本。
- 已加入 Apple 開發人員計畫。
自訂建置指令碼
#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 中建立新的工作流程,請使用以下指示:
選擇 Product > Xcode Cloud > Create Workflow 以開啟 Create Workflow 工作表。
選取工作流程應附加到的產品 (應用程式),然後按一下 Next 按鈕。
下一個工作表會顯示 Xcode 提供的預設工作流程的概述,您可以按一下 Edit Workflow 按鈕來自訂工作流程。
分支變更
#預設情況下,Xcode 建議「分支變更」條件,該條件會為您 Git 儲存庫預設分支的每次變更啟動新的建置。
對於您應用程式的 iOS 變體,當您對 Flutter 套件進行變更,或修改 lib\
和 ios\
目錄中的 Dart 或 iOS 原始程式檔時,您會希望 Xcode Cloud 觸發您的工作流程是合理的。
這可以使用以下「檔案和資料夾」條件來實現:
下一個建置版本號碼
#Xcode Cloud 將新工作流程的建置版本號碼預設為 1
,並在每次成功建置時遞增。如果您使用的是具有較高建置版本號碼的現有應用程式,您只需在您的迭代中指定 下一個建置版本號碼
,就需要設定 Xcode Cloud 以便為其建置使用正確的建置版本號碼。
請查看設定 Xcode Cloud 建置的下一個建置版本號碼以取得更多資訊。
除非另有說明,本網站上的文件均反映 Flutter 的最新穩定版本。頁面最後更新於 2024-06-11。 檢視原始碼 或 回報問題。