Окреме середовище розробки та продукту 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.У вашому коді на основі аромату продукту підключіться до відповідної бази даних на продукт
Kunal Khaire

1
@LOG_TAG Які ваші міркування для створення абсолютно нового тегу? Чи стосується цього будь-які нові технології, які ще не охоплені [firebase]?
Майкл Додд

Відповіді:


24

Як усі зазначали - вам потрібно більше одного проекту / бази даних.

Але відповісти на ваше запитання щодо необхідності вміти копіювати налаштування / дані тощо від розробки до виробництва. У мене була така ж потреба. Кілька місяців у розробці та тестуванні я не хотів вручну копіювати дані.

Результатом було резервне копіювання даних у відро для зберігання даних, а потім відновлення їх звідти в іншу базу даних. Це досить грубий спосіб зробити це - і я зробив цілу резервну копію / відновлення бази даних - але ви, можливо, зможете шукати в цьому напрямку більш контрольований спосіб. Я не використовував його - він дуже новий - але це може бути рішенням: NPM Module firestore-export-import

Редагувати : Інформація про резервне копіювання / експорт / імпорт Firestore тут Хмарний Firestore експортує та імпортує дані

Якщо ви використовуєте Firebase RTDB, а не Firestore - ця документація може допомогти: Автоматизовані резервні копії Firebase

Вам потрібно буде правильно встановити дозволи, щоб дозволити виробничій базі даних доступ до того ж відра пам’яті, що і ваша розробка. Удачі.


1
Дякую, це найкраща відповідь поки що.
racs

4
Для будь-якого проекту, у якого є кілька тисяч користувачів, ви в кінцевому підсумку перемістите деякі дані з виробничої бази даних на сервісний етап або розробку. Прикро, що це не вбудовано у Firebase, але це щось, що потрібно зробити для будь-якого типу проектів.

Я імпортував базу даних, використовуючи посібник "Переміщення даних між проектами". Але він створив базу даних Firestore в режимі Datastore. Мені потрібно використовувати його в рідному режимі.
Дебіпрасад

54

Якщо ви використовуєте firebase-інструменти, є команда, firebase useяка дозволяє вам налаштувати проект, який ви використовуєтеfirebase deploy

firebase use --addвідобразить список ваших проектів, виберіть один, і він попросить вас псевдонім. Звідти можна firebase use aliasіfirebase deploy підштовхнете до цього проекту.

В особистому користуванні я мою програму-додаток та своє-додаток-розробник як проекти на консолі Firebase.


1
Наскільки я зрозумів, інструменти Firebase корисні для розгортання розміщених файлів та бази даних, але це не робить нічого з базою даних, аналітикою чи віддаленою конфігурацією. Або я щось пропускаю?
racs

@racs, схоже, це нещодавно, але я збираюся почати намагатися використовувати кліп для збору даних / підтримки даних на моєму екземплярі розробки
Кріс

@chris спасибі, це принаймні початок. Але це виглядає як досить затаємнича справа. Удачі!
racs

@racs, що стосується висівання даних та потоку розробок, це розроблено дуже добре. Я можу надійно вимкнути свою базу даних розробників на основі команд запущених версій npm та даних насіння. Ви шукали спосіб копіювання метаданих, але я цього, на жаль, не бачив.
Кріс

@Chris дякую, що повідомили нам про це. Наскільки я можу сказати, це все ще відкрите питання.
racs

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-сервера: firebase.googleblog.com/2015/04/…
krico

2
Саме це я і зробив, але питання полягає в тому, як можна скопіювати будь-яку установку між двома середовищами? Напр. віддалені конфігурації, налаштування аудиторії тощо? Додавання їх вручну до виробничого середовища досить схильне до помилок.
racs

2
Проблема, з якою я зіткнувся, - це автентифікація декількох екземплярів firebase з одним пакетом та підписом. Консоль не дозволить додати один і той же пакет sha1 до більш ніж одного проекту, тому це може бути неможливим. Документи говорять, що існує проблема білого списку клієнтів, але я не мав успіху в цьому. Інша робота - це окремі назви пакетів (точніше "ідентифікатори програми"), але є й інші ускладнення
Патрік

3
Читайте також це: firebase.googleblog.com/2016/08/…
racs

8

Як я це зробив:

  1. У мене було 2 проекти на firebase - один для DEV, інший для PROD
  2. Місцево в моєму додатку також було 2 відділення - одне назвали DEV, а інше - PROD
  3. У моєму відділенні DEV я завжди маю файл JSON проекту DEV firebase та аналогічно для PROD

Таким чином, я не зобов'язаний підтримувати свої JSON.


1
Я розумію, але немає загального рішення поставленого питання відповідно до останньої версії Firebase. Ви повинні грати з поточними варіантами та отримувати найкращу практику. Можливо, моя відповідь не вказувала на це, але я просто хочу допомогти кандидату в моїй перспективі.
Kunal Khaire

5

Цей допис для блогу описаний дуже простий підхід із типом збірки налагодження та випуску.

Коротко:

  • Створіть нову програму на Firebase для кожного типу збірки, використовуючи інший суфікс ідентифікатора програми.
  • Налаштуйте свій Android-проект за допомогою останнього файлу JSON.
  • Використовуючи applicationIdSuffix, змініть ідентифікатор програми, щоб він відповідав різним програмам на Firebase, залежно від типу збірки.

=> див. допис для блогу для детального опису.

Якщо ви хочете використовувати різні смаки побудови, прочитайте цей великий блог з офіційного блогу firebase. Він містить багато цінної інформації.

Сподіваюся, що це допомагає!


Спасибі за Вашу відповідь. Мені вдалося налаштувати різні додатки, але я все ще шукаю спосіб скопіювати різні настройки з додатка FB Dev на додаток FB prod, як я просив у запитанні. (Наприклад, налаштування віддаленої конфігурації чи аудиторії.)
racs

2
Зверніть увагу: це створює дві програми всередині одного проекту, тому ви розділите деякі сервіси, такі як аналітика, але база даних буде спільною, тому це не є реальним розділенням середовищ, як пояснено тут firebase.googleblog.com/2016/08/…
AntPachon

5

Вам потрібно буде керувати різними типами збірки

Дотримуйтесь цього

  1. Спочатку створіть новий проект на консолі Firebase, ідентифікуйте ідентифікатор як YOURAPPNAME-DEV

  2. Натисніть кнопку "Додати додаток для Android" та створіть новий додаток. Назвіть, наприклад, com.yourapp.debug. Новий файл google-services.json завантажується автоматично

  3. У своєму каталозі src проекту створіть новий каталог з назвою "налагодження" та скопіюйте тут новий файл google-services.json

  4. На рівні свого модуля build.gradle додайте це

    debug {
            applicationIdSuffix ".debug"
        }
    

Тепер при створенні налагодження буде використовуватися збірка google-services.json з папки "налагодження", і коли ви будете будувати в режимі випуску, буде розглянуто google-services.json з кореневого каталогу модуля.


Якщо комусь потрібна офіційна документація, плагін Google Services Gradle знає шукати google-services.json у підкаталозі srcдля buildType, як пояснено тут developers.google.com/android/guides/…
Michael Osofsky

4

Щоб вирішити це для своєї ситуації, я створив три проекти Firebase, кожен з тим самим проектом Android (тобто такий же, applicationIdне використовуючи applicationIdSuffixзапропоновані іншими). Це призвело до появи трьох файлів google-services.json, які я зберігав на сервері постійної інтеграції (CI) як змінні спеціального середовища . Для кожного етапу збірки (dev / staging / prod) я використовував відповідний файл google-services.json.

Для проекту Firebase, пов’язаного з dev, у свій проект 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і різних buildTypes, я виявив, що не можу отримати інструментальні тести для запуску або навіть компіляцію, коли я намагався переключити типи збірки за допомогою testBuildType. Android ніби надає особливі властивості, debug buildTypeякі я не міг перевірити, щоб зрозуміти.

Щоправда, сценарії CI, хоча на моєму досвіді, досить прозорі і прості в обслуговуванні. Справді, підхід, який я описав, спрацював: Коли я запускав кожен з APK-файлів, створених CI, на емуляторі, крок консолі Firebase "Запустити додаток для перевірки встановлення" пішов з

Перевірка, чи додаток спілкувався з нашими серверами. Можливо, вам доведеться видалити та перевстановити додаток.

до:

Вітаємо, Ви успішно додали Firebase у свій додаток!

для всіх трьох додатків, коли я запускав їх по одному в емуляторі.


Дякую за весь цей детальний опис, Майкл. Я досяг цього ж результату, просто додавши окремі смаки та скопіювавши відповідний google-services.json під папки для кожного аромату. Однак це не було моїм питанням, будь ласка, прочитайте його ще раз.
racs

Я згоден @racs , але , до жаль , коли я писав stackoverflow.com/questions/37450439 / ... , він був відзначений як дублікат вашого питання по stackoverflow.com/users/807126/doug-stevenson
Майкл Osofsky

1
Дуг ... Що ти зробив! : DI не заперечуйте проти вашої відповіді, я впевнений, що це корисно для деяких людей, які шукають рішення для окремого середовища.
racs

так, ми шукали рішення для нашого мобільного додатку, який потребує окремих середовищ із сервісом firebase. Це, безумовно, хороша відправна точка для нас. Ми спробуємо це.
LT

2

Firebase має на цій сторінці сторінку, де йдеться про те, як налаштувати її для розробників та розробників

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

Встановлення конфігурації середовища для вашого проекту Для зберігання даних про середовище ви можете використовувати функції firebase: config: set команда в Firebase CLI. Кожна клавіша може бути розділена на імена, використовуючи періоди, щоб групувати пов’язану конфігурацію разом. Майте на увазі, що в клавішах приймаються лише малі символи; великі символи заборонені.

Наприклад, щоб зберегти ідентифікатор клієнта та ключ 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"
  }
}

1
Розв’язується до 404. Наступного разу також додайте вміст!
CorayThan

1

Цю відповідь я оновлюю на основі інформації, яку я щойно знайшов.

Крок 1

На firebase.google.com створіть кілька середовищ (наприклад, dev, staging, prod)


місіт-дев

постановка мізиту

місіт-прод


Крок 2

а. Перейдіть до прямого пункту, який ви хочете мати за замовчуванням (тобто; dev)

б. Біжиfirebase deploy

c. Після розгортання запустітьfirebase use --add

г. Буде запропонований варіант вибору з різних проектів, які у вас є.

Перейдіть до проекту, який ви хочете додати: таємнича постановка та виберіть його.

е. Потім вам буде запропоновано псевдонім для цього проекту. Введіть інсценізацію .

Знову запустіть елементи ae для prod та dev, щоб кожне середовище отримало псевдонім


Знайте, у якому середовищі ви знаходитесь

Біжи firebase use default (mysite-dev)

* dev (mysite-dev)

staging (mysite-staging)

prod (mysite-dev)

(в одному з середовищ з’явиться зірочка ліворуч. Це той, у якому ви зараз перебуваєте. Він також буде виділений синім кольором)


Переключення між середовищами

Бігайте firebase use stagingабо firebase use prodрухайтесь між ними.

Опинившись у бажаному середовищі, запустіть firebase deployі ваш проект там розгорнеться.

Ось пара корисних посилань ...

CLI Reference

Розгортання в декількох середовищах

Сподіваюся, це допомагає.


Коли ви говорите кілька середовищ, ви маєте на увазі кілька проектів?
walidvb

Я маю на увазі кілька середовищ. Прочитайте публікацію тут для роз'яснення. Ось як це титуловано. Це стосується того ж самого проекту, але щодо dev / qa та виробництва.
Джаред Ньюнам

0

Ми це робимо, створюючи різні файли ключів json для різних середовищ. Ми використовували функцію облікового запису служби, як рекомендує google, і маємо один файл розробки та інший для виробництва

введіть тут опис зображення


0

Створіть проект Tow з програмою Dev та виробничим середовищем на базі файлів Завантажте файл json від thre

та встановіть SDK відповідно до: https://firebase.google.com/docs/android/setup Або для Crashlytics: https://firebase.google.com/docs/crashlytics/get-started?platform=android

По-перше, розмістіть відповідний google_services.json для кожного типу збірки в таких місцях:

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

Примітка: Root app / google_services.json Цей файл повинен бути там відповідно до варіантів збірки, скопіюйте код json у кореневий файл json

Тепер давайте підготуємо кілька завдань з Gradle у вашому: app's build.gradle, щоб автоматизувати переміщення відповідного google_services.json до app / google_services.json

скопіюйте це у файл програми / 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. Зверніть увагу на додавання після оцінювання.

скопіюйте це у файл програми / Gradle

afterEvaluate {
processDebugGoogleServices.dependsOn switchToDebug
processReleaseGoogleServices.dependsOn switchToRelease
}

Тепер, у будь-який час: app: processReleaseGoogleServices викликається, наш нещодавно визначений: app: switchToRelease буде викликаний заздалегідь. Така ж логіка для типу налагодження build. Ви можете запустити: app: assembleRelease і версія google_services.json буде автоматично скопійована в кореневу папку модуля додатка.


1
Ви вклали багато енергії в цю відповідь, але 1. це не має нічого спільного з питанням (будь ласка, прочитайте його ще раз), 2. вам не потрібно копіювати google-services.jsonфайл у кореневу папку, якщо ви зберігаєте його в папка смаку, яка ідеально чудова. Натомість assembleReleaseви можете просто викликати assembleTestReleaseзавдання.
racs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.