独立的开发和生产Firebase环境


154

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

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

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

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

在发布该问题的另一答案之前,该问题解释了如何设置单独的Firebase帐户:这不是问题,请再次阅读。问题是:如何在单独的开发人员帐户和产品帐户之间转移更改,或者比手动复制之间更好的解决方案。


3
拥有此功能将很棒!
帕特里克


@Timmerz请参阅第一个答案:仅与托管和数据库有关,而与其他功能无关。
racs

我有一个类似的问题。我通过以下方式解决了该问题:检查此问题:stackoverflow.com/questions/51646512/…我通过以下方式解决了这一问题:1.创建调试配置,请点击链接medium.com/@Miqubel/ ... medium.com/@Miqubel/... 2.然后创建一个新的数据库,请按照链接:firebase.google.com/docs/database/usage/... 3。在根据您的产品的风味代码连接到基于相应的数据库产品上的
字样

1
@LOG_TAG创建全新标签的原因是什么?这是否解决了[firebase]尚未涵盖的任何新技术?
Michael Dodd

Answers:


24

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

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

我的结果是将数据备份到存储桶,然后从那里还原到另一个数据库。这是一种非常粗略的方法-我进行了整个数据库的备份/还原-但您也许可以朝着这个方向寻找一种更加受控的方法。我没有使用过-这是很新的-但这可能是一个解决方案:NPM模块firestore-export-import

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

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

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


1
谢谢,这是迄今为止最好的答案。
racs

4
对于拥有数千名用户的任何项目,您最终都会将一些数据从生产数据库移至登台服务器或开发服务器。遗憾的是,它没有内置在Firebase中,但是对于任何类型的项目,都需要完成。

我使用“在项目之间移动数据”指南导入了数据库。但是它以数据存储模式创建了Firestore数据库。我需要在纯模式下使用它。
Debiprasad

54

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

firebase use --add将显示您的项目列表,选择一个,然后要求您提供别名。从那里您可以firebase use alias并且firebase deploy将继续进行该项目。

就我个人而言,我在Firebase控制台中将my-app和my-app-dev作为项目。


1
据我了解,Firebase工具对于部署托管文件和数据库很有用,但它对数据库,分析或远程配置没有任何作用。还是我错过了什么?
拉斯

@racs看来这是最近的事情,但我将开始尝试在开发人员实例上使用cli进行数据播种/数据维护:firebase.googleblog.com/2015/11/…–
克里斯

@chris谢谢,至少这是一个开始。但这似乎是一件不可思议的事情。祝好运!
racs

就种子数据和开发流程的发展而言,@ racs的确非常好。我可以根据版本化的npm run命令和版本化的种子数据可靠地更改我的dev数据库。您也在寻找一种复制元数据的方法,但不幸的是我还没有看到这种方法。
克里斯

@Chris感谢您通知我们。据我所知,这仍然是一个悬而未决的问题。
racs 2016年

25

我目前未使用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


2
感谢你的回答。拥有两个单独的项目很可能是唯一的选择。但是,在它们之间复制数据充其量是复杂的。我想知道Firebase Tools是否可以复制规则,受众设置等。在我看来,它只能处理与数据库相关的操作:github.com/firebase/firebase-tools
racs

2
不知道你是否已经看到了这一点,但你可以运行你对一个火力点服务器开发:firebase.googleblog.com/2015/04/...
krico

2
那正是我所做的,但是问题是:如何在两个环境之间复制任何设置?例如。远程配置,受众群体设置等?将这些手动添加到生产环境中很容易出错。
racs'Aug

2
我遇到的一个问题是对具有相同程序包和签名的多个Firebase实例进行身份验证。控制台不允许您将同一个软件包sha1添加到多个项目中,因此这可能是不可能的。文档说可以通过将clientid列入白名单来解决,但是我还没有成功。另一个解决方法是使用单独的程序包名称(更准确的说是“ applicationIds”),但是还有其他麻烦
Patrick Patrick


8

我这样做的方式:

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

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


1
我确实了解,但是根据最新的Firebase版本,没有通用的解决方案来解决问题。您必须使用当前选项并获得最佳实践。可能是我的答案并没有指出这一点,但我只是想以自己的观点帮助问问者。
Kunal Khaire

5

该博文描述了一种非常简单的方法,具有调试和发布构建类型。

简而言之:

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

=>有关详细说明,请参见博客文章。

如果您想使用其他构建风格,请阅读Firebase官方博客中的大量博文。它包含许多有价值的信息。

希望有帮助!


感谢您的回复。我能够设置不同的应用程序,但是我仍在寻找一种方法来按照问题的要求将各种设置从FB开发应用程序复制到FB prod应用程序。(例如远程配置或受众群体设置。)
racs 2013年

2
请注意,这造成在同一个项目内的两个应用程序,因此你将一些业务的隔离,如分析,但也会因此共享数据库是不是在这里解释环境的真正分离firebase.googleblog.com/2016/08/...
AntPachon

5

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

跟随这个

  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。


如果有人需要的官方文档,谷歌的服务摇篮插件知道如何寻找的子目录下的谷歌,services.json src为buildType这里解释developers.google.com/android/guides/...
迈克尔Osofsky

4

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

对于与dev相关的Firebase项目,在其Android项目中,我添加了调试SHA证书指纹。但是对于暂存和生成,我只需要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
# /programming/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技巧,我认为这些技巧太不透明了,因此很难维护。例如,当我尝试使用applicationIdSuffix和不同buildType的方法时,我发现当我尝试使用切换构建类型时,我无法运行甚至无法编译测试testBuildType。Android似乎赋予了debug buildType我无法检查了解的特殊属性。

根据我的经验,CI笔录在道德上很透明,而且易于维护。确实,我描述的方法行得通:当我在模拟器上运行CI生成的每个APK时,Firebase控制台的“运行您的应用程序以验证安装”步骤从

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

至:

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

我在模拟器中一一启动所有三个应用程序。


迈克尔,谢谢您的所有详细说明。我通过简单地添加单独的样式并针对每种样式在文件夹下复制适当的google-services.json来管理相同的结果。但是,这不是我的问题,请再次阅读。
上演

我同意@racs,但不幸的是,当我写stackoverflow.com/questions/37450439/…时stackoverflow.com
users/807126/doug

1
道格...你做了什么!:DI在这里不介意您的回答,我相信这对于某些寻求针对单独环境的解决方案的人很有用。
racs

是的,我们一直在为需要独立环境和Firebase服务的移动应用程序寻找解决方案。对于我们来说,这绝对是一个很好的起点。我们将尝试一下。
LT

2

Firebase对此有一个页面,其中介绍了如何针对开发人员和产品进行设置

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 functions:config:get。它将输出类似以下内容的JSON:

{
  "someservice": {
    "key":"THE API KEY",
    "id":"THE CLIENT ID"
  }
}

1
解析为404。下次还包括内容!
CorayThan

1

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

第1步

在firebase.google.com中,创建您的多个环境(例如,开发,登台,生产)


mysite-dev

网站分期

mysite-prod


第2步

一个。直接移至您想成为默认值的位置(即dev)

b。跑firebase deploy

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

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

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

e。然后,将要求您为该项目提供别名。输入暂存

再次为prod和dev运行item ae,以便每个环境都有一个别名


了解您所处的环境

firebase use default (mysite-dev)

* dev (mysite-dev)

staging (mysite-staging)

prod (mysite-dev)

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


在环境之间切换

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

进入所需的环境后,运行firebase deploy并在其中部署项目。

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

CLI参考

部署到多个环境

希望这可以帮助。


当您说多个环境时,是指多个项目?
walidvb

0

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

在此处输入图片说明


0

在Firebase上使用开发环境和生产环境创建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将自动复制到您应用模块的根文件夹中。


1
您已经为这个答案投入了很多精力,但是1.与问题无关(请再次阅读),2. google-services.json如果您将文件保存在根文件夹中,则不必将其复制到根文件夹中味道很好的文件夹。相反,assembleRelease您可以仅调用assembleTestRelease任务。
racs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.