222

我正在考虑将 Firebase 用作 MBaaS,但是我找不到任何可靠的解决方案来解决以下问题:

我想设置两个独立的 Firebase 环境,一个用于开发,一个用于生产,但我不想在开发和生产之间手动复制功能(例如远程配置设置、通知规则等)环境。

有什么我可以依赖的工具或方法吗?从头开始设置远程配置或通知规则可能是一项艰巨的任务并且风险太大。

有什么建议么?有比拥有两个独立环境更好的方法吗?

在您发布另一个解释如何设置单独的 Firebase 帐户的问题的答案之前:这不是问题,请再次阅读。问题是:如何在单独的 dev 和 prod 帐户之间转移更改,或者比在它们之间手动复制更好的解决方案。

4

12 回答 12

70

如果您使用的是 firebase-tools,则有一个命令firebase use可让您设置您正在使用的项目firebase deploy

firebase use --add将显示您的项目列表,选择一个,它会要求您输入别名。从那里您可以firebase use alias并且firebase deploy将推动该项目。

在我个人使用中,我将 my-app 和 my-app-dev 作为 Firebase 控制台中的项目。

于 2016-10-18T13:20:09.073 回答
49

正如每个人都指出的那样 - 您需要多个项目/数据库。

但是要回答您关于需要能够将设置/数据等从开发复制到生产的问题。我有完全相同的需求。几个月的开发和测试,我不想手动复制数据。

我的结果是将数据备份到存储桶,然后将其从那里恢复到另一个数据库。这是一种非常粗略的方法——我做了一个完整的数据库备份/恢复——但你也许可以在这个方向上寻找一种更可控的方式。我没用过——它很新——但这可能是一个解决方案:NPM Module firestore-export-import

编辑:此处的 Firestore 备份/导出/导入信息Cloud Firestore 导出和导入数据

如果您使用的是 Firebase RTDB,而不是 Firestore - 此文档可能会有所帮助: Firebase 自动备份

您需要正确设置权限,以允许您的生产数据库访问与您的开发相同的存储桶。祝你好运。

于 2019-02-15T21:22:39.840 回答
27

我目前没有使用 Firebase,但像你自己一样考虑它。看起来要走的路是在控制台上创建一个完全独立的项目。在旧的 Firebase 网站上有一篇博文推荐这个,不过现在看起来已经被删除了。 https://web.archive.org/web/20160310115701/https://www.firebase.com/blog/2015-10-29-managing-development-environments.html

此讨论也推荐相同: https ://groups.google.com/forum/#!msg/firebase-talk/L7ajIJoHPcA/7dsNUTDlyRYJ

于 2016-05-27T19:37:54.077 回答
17

我这样做的方式:

  1. 我在 firebase 上有 2 个项目——一个用于 DEV,另一个用于 PROD
  2. 在本地,我的应用程序也有 2 个分支 - 一个名为 DEV,另一个名为 PROD
  3. 在我的 DEV 分支中,我总是有 DEV firebase 项目的 JSON 文件,同样适用于 PROD

这样我就不需要维护我的 JSON。

于 2018-08-08T05:27:04.787 回答
12

您将需要管理不同的构建类型

按照这个

  1. 首先,在 Firebase 控制台创建一个新项目,名称 id 为 YOURAPPNAME-DEV

  2. 单击“添加 android 应用程序”按钮并创建一个新应用程序。例如,将其命名为 com.yourapp.debug。新的 google-services.json 文件将自动下载

  3. 在您的项目 src 目录下创建名为“debug”的新目录并在此处复制新的 google-services.json 文件

  4. 在你的模块级别 build.gradle 添加这个

    debug {
            applicationIdSuffix ".debug"
        }
    

现在,当您构建调试时,将使用来自“debug”文件夹的 google-services.json,当您在发布模式下构建时,将考虑来自模块根目录的 google-services.json。

于 2017-07-11T07:00:44.163 回答
9

我们选择在本地开发服务器上为 Test 和 UAT 启动新的Firebase 模拟器实例,而完全不考虑 GCP。它专为这个用例而设计。

https://firebase.google.com/docs/emulator-suite

于 2021-01-31T18:03:26.393 回答
8

我正在根据我刚刚找到的信息更新这个答案。

步骤1

在 firebase.google.com 中,创建您的多个环境(即:dev、staging、prod)


我的网站开发

mysite-staging

我的网站产品


第2步

一个。直接移动到您想要成为默认值的位置(即;开发)

湾。跑firebase deploy

C。部署后,运行firebase use --add

d。将出现一个选项以从您当前拥有的不同项目中进行选择。

滚动到您要添加的项目:mysite-staging,然后选择它。

e. 然后,系统会要求您提供该项目的别名。进入分期

再次为 prod 和 dev 运行 items ae,这样每个环境都会有一个别名


知道你所处的环境

firebase use default (mysite-dev)

* dev (mysite-dev)

staging (mysite-staging)

prod (mysite-dev)

(其中一个环境的左侧将有一个星号。这就是您当前所在的环境。它也将以蓝色突出显示)


在环境之间切换

运行firebase use stagingfirebase use prod在它们之间移动。

进入所需的环境后,运行firebase deploy,您的项目将在那里部署。

这里有几个有用的链接...

CLI 参考

部署到多个环境

希望这可以帮助。

于 2019-08-09T20:55:53.700 回答
8

这篇博文描述了一种非常简单的方法,其中包含调试和发布构建类型。

简而言之:

  • 使用不同的应用程序 ID 后缀为每种构建类型在 Firebase 上创建一个新应用程序。
  • 使用最新的 JSON 文件配置您的 Android 项目。
  • 使用 applicationIdSuffix,根据构建类型更改应用程序 ID 以匹配 Firebase 上的不同应用程序。

=> 有关详细说明,请参阅博文。

如果您想使用不同的构建风格,请阅读官方 firebase 博客中的这篇广泛的博文。它包含很多有价值的信息。

希望有帮助!

于 2016-12-02T13:21:31.800 回答
6

为了解决我的情况,我创建了三个 Firebase 项目,每个项目都有相同的 Android 项目(即相同applicationId但不使用applicationIdSuffix其他人建议的项目)。这产生了三个 google-services.json 文件,我将它们作为自定义环境变量存储在我的持续集成 (CI) 服务器中。对于构建的每个阶段(dev/staging/prod),我使用了相应的 google-services.json 文件。

对于与 dev 关联的 Firebase 项目,在其 Android 项目中,我添加了调试 SHA 证书指纹。但是对于 staging 和 prod,我只是让 CI 签署了 APK。

.gitlab-ci.yml这是适用于此设置的精简版:

# This is a Gitlab Continuous Integration (CI) Pipeline definition
# Environment variables:
#   - variables prefixed CI_ are Gitlab predefined environment variables (https://docs.gitlab.com/ee/ci/variables/predefined_variables.html)
#   - variables prefixed GNDR_CI are Gitlab custom environment variables (https://docs.gitlab.com/ee/ci/variables/#creating-a-custom-environment-variable)
#
# We have three Firebase projects (dev, staging, prod) where the same package name is used across all of them but the
# debug signing certificate is only provided for the dev one (later if there are other developers, they can have their
# own Firebase project that's equivalent to the dev one).  The staging and prod Firebase projects use real certificate
# signing so we don't need to enter a Debug signing certificate for them.  We don't check the google-services.json into
# the repository.  Instead it's provided at build time either on the developer's machine or by the Gitlab CI server
# which injects it via custom environment variables.  That way the google-services.json can reside in the default
# location, the projects's app directory.  The .gitlab-ci.yml is configured to copy the dev, staging, and prod equivalents
# of the google-servies.json file into that default location.
#
# References:
# https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html
# https://stackoverflow.com/questions/57129588/how-to-setup-firebase-for-multi-stage-release

stages:
  - stg_build_dev
  - stg_build_staging
  - stg_build_prod

jb_build_dev:
  stage: stg_build_dev
  image: jangrewe/gitlab-ci-android
  cache:
    key: ${CI_PROJECT_ID}-android
    paths:
      - .gradle/
  script:
    - cp ${GNDR_CI_GOOGLE_SERVICES_JSON_DEV_FILE} app/google-services.json
    - ./gradlew :app:assembleDebug
  artifacts:
    paths:
      - app/build/outputs/apk/

jb_build_staging:
  stage: stg_build_staging
  image: jangrewe/gitlab-ci-android
  cache:
    key: ${CI_PROJECT_ID}-android
    paths:
      - .gradle/
  dependencies: []
  script:
    - cp ${GNDR_CI_GOOGLE_SERVICES_JSON_STAGING_FILE} app/google-services.json
    - ./gradlew :app:assembleDebug
  artifacts:
    paths:
      - app/build/outputs/apk/

jb_build_prod:
  stage: stg_build_prod
  image: jangrewe/gitlab-ci-android
  cache:
    key: ${CI_PROJECT_ID}-android
    paths:
      - .gradle/
  dependencies: []
  script:
    - cp ${GNDR_CI_GOOGLE_SERVICES_JSON_PROD_FILE} app/google-services.json

    # GNDR_CI_KEYSTORE_FILE_BASE64_ENCODED created on Mac via:
    # base64 --input ~/Desktop/gendr.keystore --output ~/Desktop/keystore_base64_encoded.txt
    # Then the contents of keystore_base64_encoded.txt were copied and pasted as a Gitlab custom environment variable
    # For more info see http://android.jlelse.eu/android-gitlab-ci-cd-sign-deploy-3ad66a8f24bf
    - cat ${GNDR_CI_KEYSTORE_FILE_BASE64_ENCODED} | base64 --decode > gendr.keystore

    - ./gradlew :app:assembleRelease
      -Pandroid.injected.signing.store.file=$(pwd)/gendr.keystore
      -Pandroid.injected.signing.store.password=${GNDR_CI_KEYSTORE_PASSWORD}
      -Pandroid.injected.signing.key.alias=${GNDR_CI_KEY_ALIAS}
      -Pandroid.injected.signing.key.password=${GNDR_CI_KEY_PASSWORD}
  artifacts:
    paths:
      - app/build/outputs/apk/

我对这个解决方案很满意,因为它不依赖 build.gradle 技巧,我认为这些技巧太不透明,因此难以维护。例如,当我尝试使用applicationIdSuffixand different buildTypes 的方法时,我发现当我尝试使用testBuildType. Android 似乎赋予了debug buildType我无法检查理解的特殊属性。

以我的经验,尽管 CI 脚本非常透明且易于维护,但实际上。事实上,我所描述的方法奏效了:当我在模拟器上运行 CI 生成的每个 APK 时,Firebase 控制台的“运行您的应用程序以验证安装”步骤从

检查应用程序是否已与我们的服务器通信。您可能需要卸载并重新安装您的应用程序。

至:

恭喜,您已成功将 Firebase 添加到您的应用中!

对于所有三个应用程序,我在模拟器中一一启动它们。

于 2019-08-10T03:50:56.170 回答
1

在 Firebase 上使用 Dev 和生产环境创建 Tow 项目 从 thre 下载 json 文件

并按照以下方式设置 SDK:https ://firebase.google.com/docs/android/setup 或者对于 Crashlytics:https ://firebase.google.com/docs/crashlytics/get-started?platform=android

首先,将每个 buildType 的相应 google_services.json 放置在以下位置:

app/src/debug/google_services.json
app/src/test/google_services.json
app/google_services.json

注意:根app/google_services.json 这个文件应该有根据构建变体复制根json文件中的json代码

现在,让我们在您的应用程序的 build.gradle 中启动一些 gradle 任务,以自动将适当的 google_services.json 移动到 app/google_services.json

将其复制到 app/Gradle 文件中

task switchToDebug(type: Copy) {
description = 'Switches to DEBUG google-services.json'
from "src/debug"
include "google-services.json"
into "."
}

task switchToRelease(type: Copy) {
description = 'Switches to RELEASE google-services.json'
from "src/release"
include "google-services.json"
into "."
}

很好——但是在构建应用程序之前必须手动运行这些任务很麻烦。我们希望在之前的某个时间运行上述适当的复制任务:运行 assembleDebug 或 :assembleRelease。让我们看看运行 :assembleRelease 时会发生什么:将这个复制到 /gradlew 文件中

Zaks-MBP:my_awesome_application zak$ ./gradlew assembleRelease
Parallel execution is an incubating feature.
.... (other tasks)
:app:processReleaseGoogleServices
....
:app:assembleRelease

注意 :app:processReleaseGoogleServices 任务。此任务负责处理根 google_services.json 文件。我们希望处理正确的 google_services.json,因此我们必须事先立即运行我们的复制任务。将此添加到您的 build.gradle。注意 afterEvaluate 封闭。

将其复制到 app/Gradle 文件中

afterEvaluate {
processDebugGoogleServices.dependsOn switchToDebug
processReleaseGoogleServices.dependsOn switchToRelease
}

现在,只要 :app:processReleaseGoogleServices 被调用,我们新定义的 :app:switchToRelease 就会被预先调用。调试 buildType 的逻辑相同。您可以运行 :app:assembleRelease 并且发布版本 google_services.json 将自动复制到您的应用模块的根文件夹中。

于 2019-12-02T13:47:18.383 回答
1

Firebase 对此有一个页面,其中介绍了如何为 dev 和 prod 设置它

https://firebase.google.com/docs/functions/config-env

为您的项目设置环境配置 要存储环境数据,您可以在 Firebase CLI 中使用 firebase functions:config:set 命令。可以使用句点对每个键进行命名空间,以将相关配置组合在一起。请记住,键中只接受小写字符;不允许使用大写字符。

例如,要存储“某些服务”的客户端 ID 和 API 密钥,您可以运行:

firebase functions:config:set someservice.key="THE API KEY" someservice.id="THE CLIENT ID"

检索当前环境配置 要检查项目环境配置中当前存储的内容,您可以使用 firebase 函数:config:get。它会输出类似这样的 JSON:

{
  "someservice": {
    "key":"THE API KEY",
    "id":"THE CLIENT ID"
  }
}
于 2018-12-01T20:04:56.037 回答
0

我们这样做的方式是为不同的环境创建不同的 json 密钥文件。我们使用了谷歌推荐的服务帐户功能,并且有一个开发文件和另一个用于生产

在此处输入图像描述

于 2018-09-12T18:02:17.867 回答