Flutter 里的持续部署

通过 Flutter 持续交付的最佳实践,确保您的应用程序交付给您的 Beta 版本测试人员并能够频繁予以验证,而无需借助手动工作流程。

fastlane

本指南介绍了如何将开源工具套件 fastlane与您现有的测试和持续集成(CI)工作流程(比如 Travis 或 Cirrus)整合在一起。

本地设置

建议在迁移到基于云计算的系统之前,先在本地测试其构建和部署流程。您还可以使用本地机器执行连续交付。

  • 安装 fastlane gem install fastlanebrew cask install fastlane

  • 创建您的 Flutter 项目,准备就绪后,确保通过如下途径构建项目:

    • Android flutter build apk —release;
    • iOS flutter build ios —release —no-codesign.
  • 初始化各平台的 fastlane 项目:

    • Android:在 [project]/android 目录中,运行 fastlane init 命令。

    • iOS:在 [project]/ios 目录下,运行 fastlane init 命令。

  • 编辑 Appfile 以确保它有应用程序的基本数据配置:

    • Android 检查在 [project]/android/Appfile 文件中的 package_name 是否匹配在 AndroidManifest.xml 中的包名。

    • iOS 检查在 [project]/ios/Appfile 中的 app_identifier 是否匹配 Info.plist 文件中的 bundle identifier.

  • 设置应用商店的本地登录凭据。

    • Android 按照Supply setup steps 操作,并且确保 fastlane supply init 成功同步了你在 Google Play 商店控制台中的数据。 .json 文件与密码一样重要,切勿将其公开在任何公共源代码控制存储库。

    • iOS iTunes Connect 用户名已经存在于您的Appfileapple_id 字段中,你需要将你的 iTunes 密码设置到 FASTLANE_PASSWORD 这个环境变量里。否则,上传到 iTunes/TestFlight时会提示你。

  • 设置代码签名。

    • Android 在 Android 上有两种签名 key:发布签名和上传签名。最终用户下载的 .apk 文件使用发布签名。上传签名提供给开发者上传到 Google Play 商店的认证。上传后,Google Play 商店会重新使用发布签名对 .apk 文件签名。

      • 强烈建议使用自动化的云端管理发布签名。更多信息请查看[Google Play 官方说明][official Play Store documentation。

      • 按照 密钥生成步骤创建你自己的上传签名。

      • 配置 gradle:通过设置 [project]/android/app/build.gradle 文件下的android.buildTypes.release,当编译的时候在 release 模式下使用你自己的上传签名。

    • iOS 在iOS上,当您准备使用 TestFlight 或 App Store 进行测试和部署时,使用分发证书而不是开发证书进行创建和签名。

      • Apple Developer Account console 创建并下载一个分发证书。

      • 打开 [project]/ios/Runner.xcworkspace/ 在你的项目设置里选择一个分发证书。

  • 给每个不同的平台创建一个 Fastfile 脚本。

    • Android 在 Android 上按照fastlane Android beta deployment guide 指引操作。你可以简单的编辑一下文件,加一个名叫upload_to_play_storelane。为了使用 flutter build 命令编译 apk,要把 apk 参数设置为 ../build/app/outputs/apk/release/app-release.apk

    • iOS 在 iOS 上,按照 fastlane iOS beta 部署指南 指引操作。你可以简单编辑一下文件,加一个名叫 build_ios_applane,并且同时调用 export_method: 'app-store'upload_to_testflight。在 iOS 上只有当要编译成 .app 的时候才会用到 flutter build,其他情况用不到。

你现在已准备好在本地执行部署或将部署过程迁移到持续集成(CI)系统。

Running deployment locally

在本地运行部署

  • 构建发布模式应用程序。

    • Android flutter build apk —release.
    • iOS flutter build ios —release —no-codesign.这个时候不用签名,接下来 fastlane 会自动签名。
  • 在每个平台上运行 Fastfile 脚本。

    • Android cd android then fastlane [name of the lane you created].
    • iOS cd ios then fastlane [name of the lane you created].

Cloud build and deploy setup

云构建和部署设置

首先,按照“本地设置”中描述的本地设置部分,确保在迁移到 Travis 等云系统之前,该过程有效。

需要考虑的主要事项是,由于云实例是短暂且不可信的,因此你不能在服务器上保留你的凭据,如 Play Store 服务帐户 JSON 或 iTunes 分发证书。

诸如 Cirrus 之类的持续集成(CI)系统通常支持加密的环境变量来存储私有数据。

采取预防措施,不要在测试脚本中将这些变量值重新回显到控制台。在合并之前,这些变量在拉取请求中也不可用,以确保恶意行为者无法创建打印这些密钥的拉取请求。在接受和合并的 pull 请求中,请注意与这些密钥。

  • 暂时性登录凭据。

    • Android 在 Android 上:

      • Appfile 里删除 json_key_file 并且在你的 CI 系统里的环境变量。在 upload_to_play_store 里使用 json_key_data 参数从环境变量读取到Fastfile

      • Serialize your upload key (for example, using base64) and save it as an encrypted environment variable. You can deserialize it on your CI system during the install phase with

序列化您的上传密钥(例如,使用base64)并将其另存为加密环境变量。可以可以在安装阶段在 CI 系统上对其进行反序列化

  1. echo "$PLAY_STORE_UPLOAD_KEY" | base64 --decode > /home/cirrus/[directory # 在 gradle 中定义的文件夹和文件名].keystore
  • iOS 在 iOS 上:

    • 将本地环境变量 FASTLANE_PASSWORD 转而使用 CI 系统的加密的环境变量。

    • CI 系统需要有权限拿到你的分发证书。建议使用fastlane 的 Match 系统在不同的机器上同步你的证书。

  • 建议每次使用 Gemfile 而不是 gem install fastlane 以避免其在 CI 系统上使用的不确定性,以确保 fastlane 依赖关系在本地和云计算机之间稳定且可重现。但是,此步骤是可选的。

    • [project]/android[project]/ios 文件夹中,创建一个 Gemfile 包含以下内容:
  1. source "https://rubygems.org"
  2. gem "fastlane"
  • 在两个目录中,运行 bundle update 并将两者的 GemfileGemfile.lock 文件纳入源代码管理。

  • 当你在本地运行的时候,请使用 bundle exec fastlane 而不是 fastlane

  • 在你的仓库根目录创建一个 CI 测试脚本,例如: .travis.yml.cirrus.yml

    • 分开你的脚本以便能在 Linux 和 macOS 两个平台运行。

    • 请记住为 macOS 指定具体版本的 Xcode(例如 osx_image: xcode9.2)。

    • 有关特定于 CI 的设置,请参见 fastlane CI 文档

    • 在设置阶段,根据平台,确保以下几点:

      • Bundler 可以使用 gem install bundler

      • 对于 Android 平台,请确保已经设置正确的 ANDROID_HOME 环境变量。

      • [project]/android[project]/ios 目录下分别运行 bundle install命令。

      • Make sure the Flutter SDK is available and set in PATH.

    • In the script phase of the CI task:

  1. 确保 Flutter SDK 已经正确了设置在了 `PATH` 环境变量中
  1. -

根据平台的不同可以运行 flutter build apk —releaseflutter build ios —release —no-codesign

  1. -

然后执行 cd androidcd ios 命令。

  1. -

最后执行 bundle exec fastlane [name of the lane] 命令。

参考

Flutter repo 里的示例应用 Flutter Gallery 使用 fastlane 连续部署。有关 fastlane 实际运行示例,请参阅源代码。另请参阅 Flutter 框架仓库库的 [Cirrus 脚本][]。

其他服务

其他关于如何进行持续交付的服务: