[ReactNative翻译]利用持续部署快速发货

284 阅读13分钟

本文由 简悦 SimpRead 转码,原文地址 www.callstack.com

持续部署 (CD) 可让您快速发布新功能或检查关键错误。了解更多信息 ......

以下文章是React Native 优化终极指南的一部分,介绍了如何建立持续部署设置,以便更快地发布新功能和验证关键 Bug。这篇文章由 Expo 共同撰写,他们分享了通过 EAS Submit 向 Google Play Store 和 Apple App Store 提交应用程序的心得。

为什么这很重要?

开发生命周期中关键环节的自动化可以帮助您提高整体开发速度和安全性。反馈环路越短,您的团队就能越快地迭代产品,从而最终获得更高的用户满意度。如果您能自动部署 React Native 移动应用程序,您就能享受到所有这些好处,在本文中,我们将告诉您如何做到这一点。

在基于《React Native 优化终极指南》的其他博文中,我们将讨论以下与稳定性相关的主题:

请务必查看这些内容。现在,让我们进入正题。

为什么首先要关注持续部署?

测试和开发只是开发数字产品时必须执行的部分活动。另一个重要步骤是部署--将应用程序构建并发布到生产环境中。大多数情况下,这一过程都是手动完成的。

原因很简单--部署的设置需要时间,而且要比在云中运行测试复杂得多。例如,在 iOS 上,Xcode 会自动配置许多设置和证书。这可以确保开发人员在开发原生应用程序时获得更好的体验。习惯了这种方法的开发人员通常会发现,将部署转移到云中并手动设置证书等事项具有挑战性。

手动方法的最大弊端是耗时且无法扩展。因此,那些不投资改进这一流程的团队最终会以较慢的速度发布软件。

什么是持续部署(CD)?

持续部署是一种策略,通过一套自动化脚本频繁发布软件。它旨在以更快的速度和更高的频率构建、测试和发布软件。这种方法允许对生产中的应用程序进行更多增量更新,有助于降低交付变更的成本、时间和风险。

如果采用手动部署,新功能和修复功能的发布速度就会大打折扣。

无论团队规模如何,手动构建和分发应用程序都会拖慢开发进程。 即使是在 5 人左右的小型产品团队中,自动化构建管道也能让每个人的工作变得更轻松,并减少不必要的沟通。这对远程公司尤为重要。

持续部署还允许您引入专注于提高应用程序整体性能的标准和最佳实践,例如利用 Hermes 优化应用程序启动时间。由于部署所需的所有步骤都集中在一个地方,因此可以确保所有发布都以相同的方式进行,并执行全公司的标准。

通过持续部署设置向用户发送版本,进行构建并生成更新日志。

说到移动应用程序的自动化部署,有两种方法。

一种方法是直接与 xcode 和 gradle 交互,从头开始编写一套脚本。遗憾的是,Android 和 iOS 的工具差异很大,没有多少开发人员有足够的经验来处理这种自动化。此外,由于采用了先进的代码签名和分发策略,iOS 比 Android 复杂得多。正如我们之前所说的,如果您手动操作,即使 Xcode 也无法帮您完成。

fastlane.tools/

另一种方法是使用开发人员已经处理过大多数用例的现有工具。我们最喜欢的工具是 fastlane--一套用 Ruby 编写的模块化实用程序,让你可以通过在配置文件中编写一系列指令来构建 iOS 和 Android 应用程序。

成功构建二进制文件后,就该将它们部署到目的地了。同样,您可以手动或使用工具将文件上传到所需的服务(如 App Store)。出于同样的原因,我们更倾向于使用现有的解决方案,在本例中就是微软的 AppCenter

appcenter.ms/

AppCenter是一种云服务,提供自动化和部署应用程序的工具。它的最大优势是许多设置都可以通过图形界面进行配置。通过这种方式设置 App Store 和 Play Store 部署要比通过命令行上传容易得多。

还有一种自动化部署的方法,我们要推荐一下 EAS Submit,它是 Expo 创建的一项云服务,为提交 React Native 应用程序提供一流的支持。它提供了一个快速的工作流程,可以轻松地向两个商店提交应用程序。与 EAS Build 一起使用时,它还能提供开箱即用的自动提交功能。

在本文中,我们将在 CircleCI 管道中使用 fastlaneAppCenter 来完全自动化向最终用户交付应用程序的流程。

注:描述设置的来龙去脉会使本文过于冗长。这就是我们选择只参考具体文档的原因。我们的目标是为您提供一个概述,而不是一个分步指南,因为每个项目的最终配置都会不同。

设置 fastlane

在详细介绍 Android 和 iOS 系统之前,您必须确保我们的设备上已安装并配置了fastlane

接下来,你必须在 React Native 项目中运行 init 命令。我们将在每个原生文件夹中运行两次 fastlane 命令。这是因为 React Native 在底层实际上是两个独立的应用程序。

> cd ./ios && fastlane init
> cd ./android && fastlane init

因此,该命令将在 ios 和roid 文件夹中生成设置文件。每个文件夹中的主文件都将被称为 Fastfile,所有车道都将在其中进行配置。在 fastlane 术语中,车道就像一个工作流,是部署应用程序的低级操作的组合。

低级操作可以通过调用动作来执行,这些动作是预定义的 fastlane 操作,可以简化工作流程。我们将在下一节向你展示它们的功能。

在 Android 上设置 fastlane

现在,您已经在我们的项目中成功设置了 fastlane,您已经准备好自动部署我们的 Android 应用程序了。为此,你可以选择一个 Android 特定的操作--在本例中就是 gradle。顾名思义,Gradle 是一个动作,可以让您实现与 Android Gradle 独立使用时类似的效果。

我们的车道使用 gradle 操作首先清理构建文件夹,然后根据传递的参数组装带有签名的 APK。

default_platform(:android)

project_dir = File.expand_path("..", Dir.pwd)

platform :android do
  lane :build do |options|
    if (ENV['ANDROID_KEYSTORE_PASSWORD'] && ENV['ANDROID_KEY_PASSWORD'])
      properties = {
        "RELEASE_STORE_PASSWORD" => ENV['ANDROID_KEYSTORE_PASSWORD'],
        "RELEASE_KEY_PASSWORD" => ENV['ANDROID_KEY_PASSWORD']
      }
    end

    gradle(
      task: "clean",
      project_dir: project_dir,
      properties: properties,
      print_command: false
    )
    
    gradle(
      task: "assemble",
      build_type: "Release",
      project_dir: project_dir,
      properties: properties,
      print_command: false
    )
  end

end

定义 Android 车道的 android/fastlane/Fastfile 的一部分,名为 build

‍您应该能够通过执行来运行车道构建:

$ cd ./android && fastlane build

这将生成已签名的 Android apk。

注意:不要忘记设置访问密钥库的环境变量。它们是 RELEASE_STORE_PASSWORD 和 RELEASE_KEY_PASSWORD;在上面的示例中已经设置了它们。

在 iOS 上设置 fastlane

由于认证和配置文件的原因,iOS 的设置要复杂一些。它们是苹果公司为提高安全性而设计的。幸运的是,fastlane 提供了一些专用操作,可以帮助我们克服这些复杂性。

您可以从match操作开始。它有助于在团队成员之间管理和分发 iOS 证书和配置文件。你可以在 代码签名指南 概念中了解match背后的理念。简而言之,match会对你的设备进行设置,使其能够成功创建一个应用程序,并通过苹果服务器的验证和接受。

注意:在进一步操作之前,请确保你的启动程序与你的项目相匹配。它将生成所需的证书,并将其存储在中央存储库中,以便团队和其他自动化工具获取。

除了 match 之外,你还可以使用 gym。gym 与 Gradle 操作类似,都是实际执行应用程序的构建。为此,它会使用之前从 match 抓取的证书和标志设置。

default_platform(:ios)

ios_directory = File.expand_path("..", Dir.pwd)
base_path = File.expand_path("..", ios_directory)
ios_workspace_path = "#{ios_directory}/YOUR_WORKSPACE.xcworkspace"
ios_output_dir = File.expand_path('./output', base_path)
ios_app_id = 'com.example'
ios_app_scheme = 'MyScheme'

before_all do
  if is_ci? && FastlaneCore::Helper.mac?
    setup_circle_ci
  end
end

platform :ios do
  lane :build do |options|
    match(
      type: options[:type],
      readonly: true,
      app_identifier: ios_app_id,
    )

    cocoapods(podfile: ios_directory)

    gym(
      configuration: "Release",
      scheme: ios_app_scheme,
      export_method: "ad-hoc",
      workspace: ios_workspace_path,
      output_directory: ios_output_dir,
      clean: true,
      xcargs: "-UseModernBuildSystem=NO"
    )
  end
end

iOS/fastlane/Fastfile 中定义 iOS 车道的部分

通过运行与 Android 相同的命令,您应该可以运行车道构建:

$ cd ./ios && fastlane build

现在应该也能生成 iOS 应用程序了。

使用应用程序中心部署二进制文件

既然已经实现了自动化构建,您就可以自动化流程的最后一部分--部署本身。为此,您可以使用本指南前面讨论过的 App Center。

注意:您必须在应用程序中心创建一个账户,在仪表板中创建 Android 和 iOS 应用程序,并为每个应用程序生成访问令牌。您还需要一个特殊的 Fastlane 插件,它能为您的工具带带来适当的操作。为此,请运行 fastlane add_plugin appcenter.

完成项目配置后,就可以继续编写将生成的二进制文件打包并上传到应用程序中心的程序。

lane :deploy do
  build

  appcenter_upload(
    api_token: ENV[‘APPCENTER_TOKEN’],
    owner_name:ORGANIZATION_OR_USER_NAME”,
    owner_type: “organization”, # ‘user’ | ‘organization’
    app_name:YOUR_APP_NAME”,
    file:#{ios_output_dir}/YOUR_WORKSPACE.ipa”,
    notify_testers: true
  )
end

ios/Fastlane/Fastfile(带上传通道)的一部分

就是这样!现在是时候从本地计算机执行部署车道来部署应用程序了。

将管道与 CircleCI 集成

使用所有这些命令,您就可以在本地构建和发布应用程序了。现在,您可以配置您的 CI 服务器,使其在每次提交到 main 时都执行同样的操作。为此,您将使用 CircleCI(我们在本指南中一直使用的提供商)。

在 CI 服务器上运行 fastlane 通常需要一些额外的设置。请参阅 官方文档,以便更好地理解本地环境和 CI 环境中设置的不同之处。

要从 CircleCI 部署应用程序,您可以配置一个专门的工作流,该工作流将专注于构建和部署应用程序。它将包含一个名为 deploy_ios 的任务,该任务将执行我们的 fastlane 命令。

version: 2.1

jobs:
  deploy_ios:
    macos:
     xcode: 14.2.0
    working_directory: ~/CI-CD
    steps:
      - checkout
      - attach_workspace:
      at: ~/CI-CD
      - run: npm install
      - run: bundle install
      - run: cd ios && bundle exec fastlane deploy

workflows:
  deploy:
    jobs:
      - deploy_ios

执行 Fastlane 构建路径的 CircleCI 配置的一部分

Android 的管道看起来非常相似。主要区别在于执行器。应使用 docker react-native-android Docker 镜像,而不是 macOS 镜像。

注:这只是 CircleCI 中的一个使用示例。就你的情况而言,定义过滤器和其他作业的依赖关系可能更有意义,以确保在正确的时间点运行 deploy_ios。

您可以修改或参数化提出的通道,将其用于其他类型的部署,例如用于特定平台的 App Store。要了解此类高级用例的详细信息,请参阅 fastlane 官方文档。

EAS 提交

在使用 EAS Submit 向应用商店提交之前,您需要为每个商店创建一个开发者账户,以便为您的 React Native 应用程序生成签名凭证。

生成应用程序签名凭据

无论您是否有生成应用程序签名凭据的经验,您都可以使用 EAS CLI 来为您完成繁重的工作。CLI 将处理应用程序签署凭证的过程。

对于 Android,您需要为应用程序生成密钥存储。运行以下命令开始:

eas credentials

CLI 现在会提示你一系列问题。在询问平台时选择 Android,然后选择生产作为构建配置文件。选择 "密钥存储 "即可生成密钥存储: 管理构建项目所需的一切,然后设置新的密钥库。生成的密钥库将安全地存储在 EAS 服务器上。

对于 iOS,在 CLI 提示时选择 iOS 作为平台。它将通过登录你的 Apple Developer 账户生成供应配置文件和分发证书。这将为您的生产构建做好准备,以便提交审核。如果 eas.json 文件中存在默认生产配置文件,你可以运行以下命令,而无需指定任何构建配置文件名称:

eas build --platform all

构建完成后,您将可以下载每个平台的应用程序二进制文件。Android 提交流程需要下载二进制文件。

安卓提交流程

使用 EAS Build 构建生产构建后,要向 Google Play 商店提交应用程序,您需要

  • 创建 Google 服务账户并下载其 JSON 私钥。您可以在 本指南 中了解这一步骤。
  • 下载 JSON 私钥后,在 eas.json 文件中提供其路径:
{
  "cli":{
    "version":">= 3.3.2"
  },
  "submit":{
    "production":{
      "android":{
        "serviceAccountPath":"../path/to/api-xyz.json",
        "track":"production"
      }
    }
  }
}
  • 首次手动上传应用程序。这是 Google Play 应用商店 API 的限制。
  • 上一节中的 eas build 命令将帮助您生成一个应用程序二进制文件,您可以直接将其上传到 Play Store开始提交流程,请运行该命令:
eas submit -p android

该命令将引导你逐步完成提交应用程序的过程。它会要求你选择要提交的二进制文件。在上一节创建 Android 构建后,你可以直接选择新的构建。

它还会显示所提供配置的摘要,并开始提交流程。提交流程完成后,该构建将在 Google Play 控制台中可见。

iOS 提交流程

使用 EAS Build 构建生产构建后,要向 Apple App Store 提交应用程序,需要运行以下命令:

eas submit -p ios

该命令将引导您逐步完成提交应用程序的过程。它将提示您

  • 登录您的 Apple Developer 账户并选择您的团队。

您也可以在 eas.json 中通过设置 "提交制作提交配置文件 "下的 appleId 和 appleTeamId 字段来提供此信息。Apple ID 密码必须通过 EXPO_APPLE_PASSWORD 环境变量设置。

  • 选择要提交的二进制文件。在上一节创建 iOS 构建后,你可以直接选择新的构建。
  • 它会显示所提供配置的摘要,并开始提交流程。提交过程完成后,构建文件将在 App Store Connect 网站上显示。

自动提交

作为开发人员,当您的应用程序部署流程发展到生产构建完成后自动向应用程序商店提交应用程序的程度时,您可以节省时间。

EAS Build 使用--auto-submit(自动提交)标志,可以让你自动提交应用程序。该标志会告诉 EAS Build 在完成构建后将其传递给 EAS Submit。该标志还将尝试使用与所选构建配置文件同名的提交配置文件。如果没有自定义构建配置文件,可以选择并使用默认的生产配置文件来创建构建并提交到应用程序商店。

当你运行 eas build --auto-submit 时,系统会为你提供一个指向提交详情页面的链接,你可以在这里跟踪提交的进度。您也可以随时从项目的 Expo 面板的提交部分找到该页面,它也可以从已提交构建的详情页面链接到。

持续部署如何使您的业务受益

简而言之,较短的反馈循环以及每晚或每周一次的构建可让您更快地验证功能,更频繁地发布关键错误。有了自动化部署,您就不必再把时间浪费在手动构建和将工件发送到测试设备或应用程序商店上。您的利益相关者能够更快地验证功能,并进一步缩短反馈周期。通过定期构建,您可以轻松捕捉或修复任何关键错误。

如果您的应用程序需要提升性能,请查看我们的 React Native 开发服务 并与我们联系。


www.deepl.com 翻译