使用 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 部署指南。您可以指定存档路径以避免重新构建项目。例如
build_app( skip_build_archive: true, archive_path: "../build/ios/archive/Runner.xcarchive", ) upload_to_testflight
-
在 Android 上,请遵循 fastlane Android beta 部署指南。您的编辑可以像添加一个调用
您现在可以准备在本地执行部署或将部署流程迁移到持续集成 (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 系统上对其进行反序列化
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 依赖项在本地和云端机器之间稳定且可复制。但是,此步骤是可选的。- 在
[project]/android
和[project]/ios
文件夹中,创建一个包含以下内容的Gemfile
source "https://rubygems.org.cn" gem "fastlane"
- 在这两个目录中,运行
bundle update
,并将Gemfile
和Gemfile.lock
检查到源代码管理中。 - 在本地运行时,使用
bundle exec fastlane
而不是fastlane
。
- 在
- 在存储库根目录中创建 CI 测试脚本,例如
.travis.yml
或.cirrus.yml
。- 有关 CI 特定设置,请参阅 fastlane CI 文档。
- 分片您的脚本,以便在 Linux 和 macOS 平台上运行。
- 在 CI 任务的设置阶段,执行以下操作
- 使用
gem install bundler
确保 Bundler 可用。 - 在
[project]/android
或[project]/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 [车道名称]
- 根据平台运行
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 中创建新工作流,请使用以下说明
-
选择 产品 > Xcode Cloud > 创建工作流 以打开 创建工作流 表单。
-
选择应附加工作流的产品(应用),然后单击 下一步 按钮。
-
下一个表单显示 Xcode 提供的默认工作流概述,可以通过单击 编辑工作流 按钮进行自定义。
分支更改
默认情况下,Xcode 建议分支更改条件,该条件会针对 Git 存储库默认分支的每次更改启动新的构建。
对于应用的 iOS 变体,你希望在对 Flutter 包进行更改或修改 lib\
和 ios\
目录中的 Dart 或 iOS 源文件后,Xcode Cloud 触发你的工作流,这是合理的。
可以通过使用以下文件和文件夹条件来实现此目的
下一个构建号
Xcode Cloud 将新工作流的构建号默认为 1
,并按每次成功构建递增。如果你正在使用具有较高构建号的现有应用,则需要通过在迭代中指定 下一个构建号
来配置 Xcode Cloud 以使用其构建的正确构建号。
查看 为 Xcode Cloud 构建设置下一个构建号 了解更多信息。