跳至主要內容

使用 Flutter 進行持續交付

遵循 Flutter 的持續交付最佳實務,確保您的應用程式能頻繁地交付給 Beta 測試人員並進行驗證,而無需依賴手動工作流程。

CI/CD 選項

#

有多種持續整合 (CI) 和持續交付 (CD) 選項可協助您自動化應用程式的交付。

具有內建 Flutter 功能的一體化選項

#

將 fastlane 與現有工作流程整合

#

您可以搭配以下工具使用 fastlane

本指南說明如何設定 fastlane,然後將其與現有的測試和持續整合 (CI) 工作流程整合。如需更多資訊,請參閱「將 fastlane 與現有工作流程整合」。

fastlane

#

fastlane 是一個開源工具套件,可自動化應用程式的發佈和部署。

本機設定

#

建議您在遷移到雲端系統之前,先在本機測試建置和部署程序。您也可以選擇從本機執行持續交付。

  1. 安裝 fastlane gem install fastlanebrew install fastlane。請造訪 fastlane 文件以取得更多資訊。
  2. 建立名為 FLUTTER_ROOT 的環境變數,並將其設定為您的 Flutter SDK 的根目錄。(這是 iOS 部署腳本的必要條件。)
  3. 建立您的 Flutter 專案,並在準備就緒時,請確保您的專案透過以下方式建置:
    • Android flutter build appbundle;以及
    • iOS flutter build ipa
  4. 為每個平台初始化 fastlane 專案。
    • Android 在您的 [專案]/android 目錄中,執行 fastlane init
    • iOS 在您的 [專案]/ios 目錄中,執行 fastlane init
  5. 編輯 Appfile,以確保它們包含您應用程式的足夠中繼資料。
    • Android 檢查 [專案]/android/fastlane/Appfile 中的 package_name 是否與 AndroidManifest.xml 中的套件名稱相符。
    • iOS 檢查 [專案]/ios/fastlane/Appfile 中的 app_identifier 是否也與 Info.plist 的套件識別碼相符。使用您的帳戶資訊填寫 apple_iditc_team_idteam_id
  6. 設定您商店的本機登入憑證。
    • Android 依照 Supply 設定步驟,並確保 fastlane supply init 成功地從您的 Play 商店主控台同步資料。將 .json 檔案視為您的密碼,且不要將其簽入任何公開的原始碼控制儲存庫中。
    • iOS 您的 iTunes Connect 使用者名稱已在 Appfileapple_id 欄位中。使用您的 iTunes Connect 密碼設定 FASTLANE_PASSWORD Shell 環境變數。否則,您會在上傳至 iTunes/TestFlight 時收到提示。
  7. 設定程式碼簽署。
    • Android 依照Android 應用程式簽署步驟
    • iOS 在 iOS 上,當您準備好使用 TestFlight 或 App Store 進行測試和部署時,請使用發佈憑證而不是開發憑證來建立和簽署。
      • 在您的 Apple 開發人員帳號主控台中建立和下載發佈憑證。
      • open [專案]/ios/Runner.xcworkspace/ 並在您目標的設定窗格中選取發佈憑證。
  8. 為每個平台建立 Fastfile 腳本。
    • Android 在 Android 上,依照fastlane Android Beta 部署指南。您的編輯可以很簡單地新增一個呼叫 upload_to_play_storelane。設定 aab 引數為 ../build/app/outputs/bundle/release/app-release.aab,以使用 flutter build 已建置的應用程式套件。

    • iOS 在 iOS 上,依照fastlane iOS Beta 部署指南。您可以指定封存路徑,以避免重建專案。例如

      ruby
      build_app(
        skip_build_archive: true,
        archive_path: "../build/ios/archive/Runner.xcarchive",
      )
      upload_to_testflight

您現在已準備好在本機執行部署,或將部署程序遷移至持續整合 (CI) 系統。

在本機執行部署

#
  1. 建置發佈模式應用程式。
    • Android flutter build appbundle
    • iOS flutter build ipa
  2. 在每個平台上執行 Fastfile 腳本。
    • Android cd android 然後 fastlane [您建立的 lane 名稱]
    • iOS cd ios 然後 fastlane [您建立的 lane 名稱]

雲端建置和部署設定

#

首先,請遵循「本機設定」中描述的本機設定區段,以確保程序在遷移到像 Travis 這樣的雲端系統之前能正常運作。

主要要考慮的是,由於雲端執行個體是暫時性的且不受信任,您不會將您的憑證(例如您的 Play 商店服務帳戶 JSON 或您的 iTunes 發佈憑證)留在伺服器上。

持續整合 (CI) 系統通常支援加密的環境變數,以儲存私人資料。您可以在建置應用程式時使用 --dart-define MY_VAR=MY_VALUE 來傳遞這些環境變數。

請小心不要在您的測試腳本中將這些變數值重新回顯到主控台上。這些變數在它們合併之前也不會出現在提取請求中,以確保惡意行為者無法建立列印這些機密的提取請求。在您接受和合併的提取請求中,請小心與這些機密的互動。

  1. 讓登入憑證變成暫時性的。

    • Android 在 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 在 iOS 上
      • 移動本機環境變數 FASTLANE_PASSWORD,以使用 CI 系統上的加密環境變數。
      • CI 系統需要存取您的發佈憑證。建議使用 fastlane 的 Match 系統,在機器之間同步您的憑證。
  2. 建議您使用 Gemfile,而不是每次都在 CI 系統上使用不確定的 gem install fastlane,以確保 fastlane 相依性在本地和雲端機器之間是穩定且可重現的。但是,此步驟是可選的。

    • 在您的 [專案]/android[專案]/ios 資料夾中,建立一個包含以下內容的 Gemfile
      source "https://rubygems.org"
      
      gem "fastlane"
    • 在兩個目錄中,執行 bundle update 並將 GemfileGemfile.lock 都簽入原始碼控制。
    • 在本機執行時,請使用 bundle exec fastlane 而不是 fastlane
  3. 在您的儲存庫根目錄中建立 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 appbundleflutter build ios --release --no-codesign,具體取決於平台。
      • cd androidcd ios
      • bundle exec fastlane [lane 名稱]

Xcode Cloud

#

Xcode Cloud 是一種持續整合和交付服務,用於建置、測試和發佈 Apple 平台的應用程式和框架。

需求

#

自訂建置指令碼

#

Xcode Cloud 識別 自訂建置腳本,這些腳本可用於在指定的時間執行其他任務。它還包含一組 預先定義的環境變數,例如 $CI_WORKSPACE,這是您複製的儲存庫的位置。

複製後腳本

#

利用 Xcode Cloud 在使用以下指示複製您的 Git 儲存庫後執行的複製後自訂建置腳本:

ios/ci_scripts/ci_post_clone.sh 建立一個檔案,並新增以下內容。

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 中建立新的工作流程,請使用以下指示:

  1. 選擇 Product > Xcode Cloud > Create Workflow 以開啟 Create Workflow 工作表。

  2. 選取工作流程應附加到的產品 (應用程式),然後按一下 Next 按鈕。

  3. 下一個工作表會顯示 Xcode 提供的預設工作流程的概述,您可以按一下 Edit Workflow 按鈕來自訂工作流程。

分支變更

#

預設情況下,Xcode 建議「分支變更」條件,該條件會為您 Git 儲存庫預設分支的每次變更啟動新的建置。

對於您應用程式的 iOS 變體,當您對 Flutter 套件進行變更,或修改 lib\ios\ 目錄中的 Dart 或 iOS 原始程式檔時,您會希望 Xcode Cloud 觸發您的工作流程是合理的。

這可以使用以下「檔案和資料夾」條件來實現:

Xcode Workflow Branch Changes

下一個建置版本號碼

#

Xcode Cloud 將新工作流程的建置版本號碼預設為 1,並在每次成功建置時遞增。如果您使用的是具有較高建置版本號碼的現有應用程式,您只需在您的迭代中指定 下一個建置版本號碼,就需要設定 Xcode Cloud 以便為其建置使用正確的建置版本號碼。

請查看設定 Xcode Cloud 建置的下一個建置版本號碼以取得更多資訊。