React Native 是用于创建移动应用程序的最流行的基于 JavaScript 的框架之一。它通过支持创建在 iOS 和 Android 上运行的跨平台应用程序来减少整个应用程序开发所需的整体复杂性和时间。

但是,为了构建和分发 React Native 应用程序,开发人员必须首先签署证书,编译和更新版本,然后将构建提交到适用于 iOS 的相应平台 App Store 和适用于 Android 的 Google Play。

在本文中,我们将演示如何利用GitHub Actions和fastlane来自动化这些繁琐的任务。

这篇文章将帮助您自动化使用 React Native 构建的 iOS 和 Android 应用程序的构建、测试和分发。

内容

  • 什么是快车道?

  • 设置快车道

  • 为 Android 配置 fastlane

  • 为 iOS 配置 fastlane

    • 增加版本号

    • 设置证书和配置文件

    • 构建 iOS 应用

    • 上传构建

  • 使用 GitHub Actions 自动化工作流程

    • 定义 GitHub Actions 工作流程

    • 为 GitHub Actions 创建和存储机密

    • 定义 iOS 工作流程

什么是快车道?

fastlane 是一种解决方案,可帮助 iOS 和 Android 开发人员自动执行耗时的操作。该平台有助于通过持续部署交付高质量的应用程序,而不会影响开发人员日常工作的速度或敏捷性。

fastlane 提供原生 Gradle (Android) 和 Xcode (iOS) 插件以及 Ruby 命令行实用程序。它管理诸如注册 App Store 和 Google Play、将应用程序发布到商店、部署测试版软件、Firebase Crashlytics等任务。您已经拥有的任何CI 系统也可以与 fastlane 一起使用。

设置快车道

在我们开始之前,必须在本地安装一些系统要求。

fastlane 正式支持在 macOS 上运行;fastlane 仅部分支持 Linux 和 Windows,因为 Xcode 等工具仅适用于 macOS。

Fastlane 可以与适用于 macOS 的 Homebrew 一起安装:

brew install fastlane

或者,使用适用于 macOS、Linux 和 Windows 的 RubyGems:

sudo gem install fastlane  # Make sure ruby is already installed

有两种方法可以将 fastlane 添加到 React Native 项目中:

  1. fastlane init在各自的文件夹中分别使用适用于 Android 和 iOS 的命令;fastlane 将自动检测平台,请求任何必要的信息,并配置平台

  2. fastlane在 React Native 项目的根目录下创建一个文件夹并向其中添加一个Fastfile文件。然后,为 iOS 和 Android 手动配置它

我们将在本文中使用第二种方法。

为 Android 配置 fastlane

让我们从为 Android 配置 fastlane 开始。

如前所述,我们将fastlane在项目的根目录中创建一个文件夹并将文件添加Fastfile到该文件夹中。我们将为FastfileiOS 和 Android 使用相同的文件。

在做任何其他事情之前,让我们检查并清理 Git 分支。我们将为 Android 分发设置两条通道,一条用于 beta 测试,一条用于最终版本。


超过 20 万开发人员使用 LogRocket 来创造更好的数字体验了解更多 →


首先,我们将定义一个 Android 平台,如下所示:

platform :android do desc "Release for the Android beta"lane :beta do increment_version_code('app_project_dir': './andriod/app')gradle(task: 'clean', project_dir: './andriod')gradle(task: 'bundle', bundle_type: 'Release', project_dir: './andriod')supply(track: 'beta', abb: './andriod/app/build/outputs/apk/app-beta-release.apk')enddesc "Release for the Android production"lane : release doincrement_version_code(app_project_dir: './android/app')increment_version_name(app_project_dir: './android/app', bump_type: 'patch')gradle(task: 'clean', project_dir: './android/')gradle(task: 'bundle', bundle_type: 'Release', project_dir: './andriod', properties: {"android.injected.signing.store.file" => ENV['ANDROID_KEYSTORE_FILE'],"android.injected.signing.store.password" => ENV['ANDROID_KEYSTORE_PASSWORD'],"android.injected.signing.key.alias" => ENV['ANDROID_KEYSTORE_ALIAS'],"android.injected.signing.key.password" => ENV['ANDROID_KEYSTORE_PASSWORD']})supply(track: 'production', aab: './android/app/build/outputs/bundle/release/app_release.aab', release_status: 'draft')end
end

接下来,我们将为 beta 版本创建一个分发通道并添加一组要执行的操作。

我们将在下一步中使用 Gradle 来清理构建。接下来,我们将执行 Gradle 包以构建 APK 或 AAB。

作为最后一步,我们将使用CI 实用程序供应将元数据、屏幕截图、二进制文件和应用程序包提交到 Google Play 。

接下来将以与 beta 通道相同的方式创建 Android 应用发布分发通道;此时,我们将添加 Keystore 和 Google 凭据以进行发布。

注意, fastlane 的供应工具仅在您至少成功将 Android 应用程序发布到 Google Play 一次后才有效。

为 iOS 配置 fastlane

现在,让我们为 iOS 配置 fastlane。在开始之前,Xcode 和 macOS 是使用 fastlane 发布 iOS 应用程序的先决条件。

我们将为 iOS 分发设置两条通道,一条用于 TestFlight,一条用于 App Store 发布。

platform :ios do private_lane :update_version doapp_store_version = get_app_store_version_number(bundle_id: 'rnFastlane')plist_version = get_version_number_from_plist(xcodeproj: './ios/rnFastlane.xcodeproj')if Gem::Version.new(plist_version.to_f) == Gem::Version.new(app_store_version.to_f)increment_version_number_in_plist(xcodeproj: './ios/rnFastlane.xcodeproj', bump_type: 'minor')elseincrement_version_number_in_plist(xcodeproj: './ios/rnFastlane.xcodeproj', bump_type: 'patch')endendprivate_lane :testflight_build do increment_build_number_in_plist(xcodeproj: './ios/rnFastlane.xcodeproj', target: 'rnFastlane')gym(scheme: 'rnFastlane', workspace: './ios/rnFastlane.xcworkspace')endprivate_lane :distribution_build doincrement_build_number_in_plist(xcodeproj: './ios/rnFastlane.xcodeproj', target: 'rnFastlane')create_keychain(name: ENV['KEYCHAIN_NAME'],password: ENV['KEYCHAIN_PASSWORD'],default_keychain: true,unlock: true,timeout: 3600,add_to_search_list: true)
​match(type: 'app-store',keychain_name: ENV["KEYCHAIN_NAME"],keychain_password: ENV["KEYCHAIN_PASSWORD"],readonly: true,shallow_clone: true,verbose: false)    gym(scheme: 'rnFastlane', workspace: './ios/rnFastlane.xcworkspace',export_method: 'ad-hoc',output_directory: "./build", configuration: 'Release',output_name: "rnFastlane.ipa"clean: trueexport_options: {method: 'app-store',provisioningProfiles: {'rnFastlane' => ENV["sigh_#{options[:app_identifier]}_app-store_profile-name"],}})enddesc "Release for the iOS beta"lane :beta dotestflight_buildupload_to_testflight(username: ENV['APP_STORE_EMAIL'] app_identifier: 'rnFastlane')commit_version_bump(message: 'bump build')push_to_git_remoteenddesc "Release for the iOS production"lane :release dodistribution_builddelivercommit_version_bump(message: 'bump build')push_to_git_remoteend
end

增加版本号

下一步是为更新版本添加专用通道。


来自 LogRocket 的更多精彩文章:

  • 不要错过来自 LogRocket 的精选时事通讯The Replay

  • 了解LogRocket 的 Galileo 如何消除噪音以主动解决应用程序中的问题

  • 使用 React 的 useEffect优化应用程序的性能

  • 在多个 Node 版本之间切换

  • 了解如何使用 AnimXYZ 为您的 React 应用程序制作动画

  • 探索 Tauri,一个用于构建二进制文件的新框架

  • 比较NestJS 与 Express.js


我们将使用 get_app_store_version_numberand get_version_number_from_plistplugin 方法从 App Store 和 plist 文件中获取版本。这允许使用该increment_version_number_in_plist方法增加次要和补丁凹凸类型的版本号。

设置证书和配置文件

现在,我们将用于match设置证书和配置文件。match包含在 iOS 应用程序的 fastlane中,用于代码签名。使用match,整个开发团队可以使用单个代码签名身份。

在添加之前match,我们需要创建一个私有 GitHub 存储库来存储证书。然后,我们可以match使用以下命令进行安装:

fastlane match init 

接下来,我们需要添加一个私有仓库,如上所示,来存储证书。文件夹Matchfile下生成A。fastlane设置match完成后,我们可以为开发和 App Store 创建证书和配置文件。

fastlane match appstore
# for the appstore
fastlane match development
# for the development 

执行上述命令时,它会将证书添加到私有存储库中。

构建 iOS 应用

另一个 fastlane 功能gym将用于构建 iOS IPA 应用程序。gym还将有助于自动化测试软件的部署和分发。

上传构建

现在是时候上传我们的构建了。我们将使用该函数进行upload_to_testflightTestFlight 上传和App Store 提交。该服务是fastlane的一部分;它用于将元数据和 IPA 上传到 App Store。deliver``deliver

使用 GitHub Actions 自动化工作流程

GitHub Actions 是一项 新的 GitHub 功能,可让您轻松地在云中创建和运行工作流。我们将设置 GitHub Actions 来自动化 Android 和 iOS 发行版的构建和发布工作流程。

首先,我们将为 iOS 和 Android 添加两个独立的工作流程。在项目的根级别,我们将创建一个.github文件夹;在此文件夹下,我们将创建另一个名为workflows. 然后,我们将为ios_release.ymliOS 版本和android_release.ymlAndroid 版本添加到.github > workflows文件夹中。

mkdir .github && cd .github && mkdir workflows && cd workflows && touch andriod_release.yml && touch ios_release.yml

定义 GitHub Actions 工作流程

我们将定义 GitHub Actions 工作流程,如下所示:

on:push:tags:- 'android*'

当我们添加一个包含android关键字的标签时,Android 版本的构建将开始,如上所述。这是一个例子:

git tag -a 'versions' -m "andriod release"

为 Android 发布工作流定义了两项工作,一项针对测试版,一项针对 Google Play 发布。

接下来,我们将定义最新版本的 Ubuntu 虚拟机来运行 GitHub Actions 工作流。

name: Build and deploy Android release
on:push:tags:- 'android*'
jobs:testFlight-build:name: android-beta-buildruns-on: ubuntu-lateststrategy:matrix:node-version: [12.x]steps:- uses: actions/setup-node@v1with:node-version: ${{ matrix.node-version }}- name: Checkout to git repositoryuses: actions/checkout@v2- name: Install dependenciesrun: |yarn install- name: Install Fastlaneuses: actions/setup-ruby@v1with:ruby-version: 2.6- name: Install npm dependenciesrun: |yarn install- name: Install Fastlanerun: |bundle installbundle update fastlane- name: Build and upload to TestFlightrun: |bundle exec fastlane android betaenv: ANDROID_KEYSTORE_FILE: ${{ secrets.ANDROID_KEYSTORE_FILE }}ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}ANDROID_KEYSTORE_ALIAS: ${{ secrets.ANDROID_KEYSTORE_ALIAS }}ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}release-build:name: Android-release-buildruns-on: ubuntu-lateststrategy:matrix:node-version: [12.x]steps:- uses: actions/setup-node@v1with:node-version: ${{ matrix.node-version }}- name: Checkout to git repositoryuses: actions/checkout@v2- name: Install dependenciesrun: |yarn install- name: Install Fastlaneuses: actions/setup-ruby@v1with:ruby-version: 2.6- name: Install npm dependenciesrun: |yarn install- name: Install Fastlanerun: |bundle installbundle update fastlane- name: release-buildrun: |bundle exec fastlane android releaseenv: ANDROID_KEYSTORE_FILE: ${{ secrets.ANDROID_KEYSTORE_FILE }}ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}ANDROID_KEYSTORE_ALIAS: ${{ secrets.ANDROID_KEYSTORE_ALIAS }}ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}

在上面的代码中,我们定义了一系列的步骤,它们是由 GitHub 市场提供或社区支持的预定义操作。

我们在接下来的一系列事件中添加安装npm依赖、添加需要的Node.js版本、安装fastlane的步骤如上代码所示。

最后,我们为 beta 和发布作业运行 fastlane 构建。我们还使用GitHub Actions Secrets来定义构建工作流程所需的环境变量。

为 Github Actions 创建和存储 Secret

加密的秘密允许我们存储敏感信息。我们可以将我们的环境变量、密钥和密码作为加密的秘密添加到 GitHub 存储库。OCR文字识别电脑软件,支持截图、上传图片识别文字,速度快准确率非常高!存储库的秘密将可供存储在存储库中的任何工作流访问。

要添加秘密,请转到 repo 的设置菜单。在Secrets > Actions部分(左侧导航)下,单击New repository secret按钮(右上角)以添加新密钥。

在整个过程中都需要为 Android 和 iOS 应用程序添加密钥,以便在上传之前正确签署您的应用程序。

定义 iOS 工作流程

如前所述,我们通过在文件夹ios release.yml下创建一个不同的文件来分离 iOS 和 Android 版本.github > workflows。当我们添加包含ios关键字的标签时,iOS 版本的构建将开始。

这是一个例子:

git tag -a 'versions' -m "ios release"

对于 iOS 版本,我们将指定两个作业:一个用于 TestFlight 版本,另一个用于 App Store 版本。

接下来,我们将定义最新版本的macos-latest虚拟机来运行 iOS 发行版的 GitHub Actions 工作流。

name: Build and deploy iOS release
on:push:tags:- 'ios*'
jobs:testFlight-build:name: iOS-testFlight-buildruns-on: macos-lateststrategy:matrix:node-version: [12.x]steps:- uses: actions/setup-node@v1with:node-version: ${{ matrix.node-version }}- name: Checkout to git repositoryuses: actions/checkout@v2- name: Install dependenciesrun: |yarn install- name: Install Fastlaneuses: actions/setup-ruby@v1with:ruby-version: 2.6- name: Install npm dependenciesrun: |yarn install- name: Install Fastlanerun: |bundle installbundle update fastlane- name: Build and upload to TestFlightrun: |bundle exec fastlane ios betaenv: APPLE_ID: ${{ secrets.APPLE_ID }}APP_STORE_EMAIL: ${{ secrets.APP_STORE_EMAIL }}APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}IOS_DISTRIBUTION_CERTS_GITHUB_URL: ${{ secrets.IOS_DISTRIBUTION_CERTS_GITHUB_URL }}MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}release-build:name: iOS-testFlight-buildruns-on: macos-lateststrategy:matrix:node-version: [12.x]steps:- uses: actions/setup-node@v1with:node-version: ${{ matrix.node-version }}- name: Checkout to git repositoryuses: actions/checkout@v2- name: Install dependenciesrun: |yarn install- name: Install Fastlaneuses: actions/setup-ruby@v1with:ruby-version: 2.6- name: Install npm dependenciesrun: |yarn install- name: Install Fastlanerun: |bundle installbundle update fastlane- name: Build and upload to TestFlightrun: |bundle exec fastlane ios betaenv: APPLE_ID: ${{ secrets.APPLE_ID }}APP_STORE_EMAIL: ${{ secrets.APP_STORE_EMAIL }}APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}IOS_DISTRIBUTION_CERTS_GITHUB_URL: ${{ secrets.IOS_DISTRIBUTION_CERTS_GITHUB_URL }}MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}

现在,我们在接下来的一系列事件中定义了安装 npm 依赖项、添加所需的 Node.js 版本以及安装 fastlane 的一系列步骤,如上面的代码所示。

最后,我们为 TestFlight 版本运行 fastlane 构建。我们使用 GitHub Actions Secrets 来定义构建工作流程所需的环境变量。

结论

在本文中,我们演示了如何在 React Native 项目中设置 fastlane。结合使用 fastlane 和 GitHub Actions 可以简化 iOS 和 Android 应用程序的构建和发布,并改进构建、测试和发布分发的部署管道。

fastlane:构建、测试和发布 React Native 应用程序相关推荐

  1. 我如何为我的第一个自由客户构建第一个React Native应用程序

    by Charlie Jeppsson 查理·杰普森(Charlie Jeppsson) 我如何为我的第一个自由客户构建第一个React Native应用程序 (How I built my firs ...

  2. 准备发布React Native应用?

    你可能已经完成了React Native应用的开发,马上就准备发布出去了.那你还需要为发布app准备什么吗?我指的不是诸如"确保测试通过"或"多做几遍smoke test ...

  3. 构建了我的第一个React Native应用程序之后,我现在确信这是未来。

    by Taylor Milliman 泰勒·米利曼(Taylor Milliman) 构建了我的第一个React Native应用程序之后,我现在确信这是未来. (After building my ...

  4. 使用CoreRT将.NET Core发布为Native应用程序

    在上一篇文章<使用.NET Core快速开发一个较正规的命令行应用程序>中我们看到了使用自包含方式发布的.NET Core应用中包含了216个文件.我就写一个cat命令用得着这么动真格.. ...

  5. react native 出现程序包com.facebook.react不存在

    今天在通过android studio 编译react-native 项目的时候,莫名出现com.facebook.react下的文件不存在,部分缺失如图: 如:程序包com.facebook.rea ...

  6. Zephyr 简介:用于 React Native 的 Tailwind CSS

    使用纯 CSS 构建复杂的 Web 应用程序可能是一项艰巨的挑战. 因此,开发人员倾向于使用 Bootstrap 和 Tailwind CSS 等流行的样式库来缩短开发周期. 与 Web 上的样式类似 ...

  7. mobx在react中应用_借助React Native Elements,Jest和MobX MST可以轻松实现现实世界中的ReactNative应用...

    mobx在react中应用 by Qaiser Abbas 由Qaiser Abbas 借助React Native Elements,Jest和MobX MST可以轻松实现现实世界中的ReactNa ...

  8. React Native发布重构路线图

    React Native作为时下最热门的跨平台开发方案,在这两年的移动跨平台方案中可谓一枝独秀,在很多的移动产品中都可以看到它们的影子,相比国内的Weex,RN的迭代更加频繁,性能上也无限的接近原生应 ...

  9. 【天赢金创】Facebook:我们是如何构建第一个跨平台的React Native APP

    今年早些时候,我们介绍过iOS版的React Native. React Native带来的是用web方式的React - 自声明式的UI组件和快速的开发迭代来完成手机平台的功能,然后为了保持速度.保 ...

  10. 使用React Native和Spring Boot构建一个移动应用

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. Reac ...

最新文章

  1. C++回调函数用法(zz)
  2. 第七天2017/04/14(引用与const、C++基本知识)
  3. struts2 s:if标签以及 #,%{},%{#}的使用方法
  4. 用户画像标签维度_神策数据钟秉哲:一文了解用户标签画像,从洞察到突破
  5. php启用openssl,php怎么开启openssl模块
  6. java查看jvm对象个数_jmap-查看 jvm 内存对象信息
  7. c++的STL--1概念通述
  8. 天池 在线编程 停车困境(双指针)
  9. 基于jsTree的无限级树JSON数据的转换
  10. SVN安装配置以及启动
  11. 网络流量采集(一)概述
  12. 数据建模与消费者画像
  13. 苹果笔记本双系统OS和win10,在win10下罗技M558蓝牙提示输入码无效
  14. 【虚幻4】UMG组件的简介与使用(Common 常用组件篇)
  15. jmeter-same user on each interation
  16. git基本命令使用大全
  17. 数字经济下的发展挑战
  18. matlab求不等式的方法,求解变分不等式的matlab程序我需要
  19. js实现给定图片路径自动下载
  20. 拍照翻译的软件有什么?不妨试试这几款好用的软件

热门文章

  1. 利用Python,通过关键字获取漏洞平台最新漏洞信息
  2. 一键清理系统垃圾.bat文件中的误区,你了解吗?
  3. 键盘忍者:无需鼠标即可启动任何应用程序
  4. 边境的悍匪—机器学习实战:第十五章 使用CNN和RNN处理序列
  5. linux查看网络端口状态命令行,Linux下用netstat查看网络状态、端口状态
  6. 世纪光棍节、神棍节快乐!
  7. pdf转换成word转换器免费版哪里下载
  8. @Deprecated注解
  9. 还在为英语学习发愁吗?身为程序员的你可能需要这样一份“宝典”(上)
  10. Python自动化操作word--批量替换word文档中的文字