Окреме середовище розробки та продукту 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.