独立的开发人员和prod Firebase环境

独立的开发人员和prod Firebase环境,firebase,google-cloud-firestore,production-environment,mbaas,Firebase,Google Cloud Firestore,Production Environment,Mbaas,我正在考虑使用Firebase作为MBaaS,但是我找不到任何可靠的解决方案来解决以下问题: 我想设置两个独立的Firebase环境,一个用于开发,一个用于生产,但我不想在开发和生产环境之间手动复制功能(例如远程配置设置、通知规则等) 有什么工具或方法可以依靠吗?从头开始设置远程配置或通知规则可能是一项艰巨的任务,而且风险太大 有什么建议吗?有没有比拥有两个单独的环境更好的方法 在您发布关于如何设置独立Firebase帐户的问题的另一个答案之前:这不是问题所在,请再次阅读。问题是:如何在单独的开

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

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

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

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


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

我目前不使用Firebase,但考虑到它与您一样。看起来应该在控制台上创建一个完全独立的项目。在旧的Firebase网站上有一篇博客推荐这一点,不过现在看来要删除了

本次讨论还建议:

如果您使用的是firebase工具,则有一个命令
firebase use
,用于设置要用于
firebase部署的项目

firebase use--add
将显示您的项目列表,选择一个,它将询问您的别名。从那里你可以
firebase使用别名
firebase部署
将推送到该项目

在我个人使用中,我将我的应用程序和我的应用程序开发作为Firebase控制台中的项目。

介绍了一种调试和发布构建类型的非常简单的方法

简言之:

  • 使用不同的应用程序id后缀在Firebase上为每种构建类型创建一个新应用程序
  • 使用最新的JSON文件配置您的Android项目
  • 使用applicationIdSuffix,根据构建类型更改应用程序Id以匹配Firebase上的不同应用程序
=>有关详细说明,请参阅博客帖子

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


希望有帮助

您将需要管理不同的生成类型

照此

  • 首先,在Firebase控制台上创建一个新项目,将id命名为YOURAPPNAME-DEV

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

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

  • 在模块级build.gradle中添加以下内容

    debug {
            applicationIdSuffix ".debug"
        }
    
  • 现在,当您构建调试时,将使用“debug”文件夹中的build google-services.json,当您以发布模式构建时,将考虑使用模块根目录中的google-services.json。

    我的方式:

  • 我在firebase上有两个项目——一个是开发人员的项目,另一个是PROD的项目
  • 在本地,我的应用程序也有两个分支——一个名为DEV,另一个名为PROD
  • 在我的DEV分支中,我总是有devfirebase项目的JSON文件&PROD也是如此

  • 这样我就不需要维护我的json了。

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


    Firebase有一个页面介绍如何为开发人员和产品进行设置

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

    例如,要存储“某些服务”的客户端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"
      }
    }
    

    正如大家所指出的,您需要不止一个项目/数据库

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

    我的结果是将数据备份到一个存储桶中,然后从那里将其恢复到另一个数据库中。这是一种非常粗糙的方法——我做了整个数据库的备份/恢复——但您可以从这个方向寻找一种更可控的方法。我没有使用过它-这是非常新的-但这可能是一个解决方案:

    编辑:此处为Firestore备份/导出/导入信息

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

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

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

    步骤1

    在firebase.google.com中,创建多个环境(即开发、登台、产品)


    mysite dev

    mysite登台

    mysite产品


    步骤2

    a。直接移动到您希望成为默认设置的位置(即:dev)

    b。运行firebase部署

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

    d。将出现一个选项,从差异中进行选择
    # 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/
    
    app/src/debug/google_services.json
    app/src/test/google_services.json
    app/google_services.json
    
    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 "."
    }
    
    Zaks-MBP:my_awesome_application zak$ ./gradlew assembleRelease
    Parallel execution is an incubating feature.
    .... (other tasks)
    :app:processReleaseGoogleServices
    ....
    :app:assembleRelease
    
    afterEvaluate {
    processDebugGoogleServices.dependsOn switchToDebug
    processReleaseGoogleServices.dependsOn switchToRelease
    }