J'envisage d'utiliser Firebase en tant que MBaaS, mais je n'ai pas trouvé de solution fiable au problème suivant:
Je souhaite configurer deux environnements Firebase distincts, un pour le développement et un pour la production, mais je ne souhaite pas effectuer de copie manuelle des fonctionnalités (par exemple, configuration à distance, règles de notification, etc.) entre l'environnement de développement et de production .
Existe-t-il un outil ou une méthode sur lequel je peux compter? Configurer la configuration à distance ou les règles de notification à partir de zéro peut être une tâche décourageante et trop risquée.
Aucune suggestion? Y a-t-il une meilleure approche que d'avoir deux environnements séparés?
Avant de poster une autre réponse à la question qui explique comment configurer des comptes Firebase distincts: lisez-la à nouveau. La question qui se pose est la suivante: comment TRANSFÉRER change entre des comptes de développement et de production séparés, ou une meilleure solution que la copie manuelle entre eux.
Comme tout le monde l’a souligné, vous avez besoin de plus d’un projet/base de données.
Mais pour répondre à votre question concernant la nécessité de pouvoir copier les paramètres/données, etc., du développement à la production. J'ai eu exactement le même besoin. Quelques mois de développement et de test, je ne voulais pas copier les données manuellement.
Mon résultat était de sauvegarder les données dans un compartiment de stockage, puis de les restaurer à partir de là dans l'autre base de données. C'est une façon assez rudimentaire de le faire - et j'ai effectué une sauvegarde/restauration de base de données complète - mais vous pourrez peut-être chercher dans cette direction un moyen plus contrôlé. Je ne l'ai pas utilisé - il est très nouveau - mais cela pourrait être une solution: NPM Module firestore-export-import
Modifier: Sauvegarde Firestore/Exporter/Importer les informations ici Cloud Firestore Exporter et importer des données
Si vous utilisez Firebase RTDB, et non Firestore - cette documentation peut vous aider: Firebase Automated Backups
Vous devrez définir les autorisations correctement pour autoriser votre base de données de production à accéder au même compartiment de stockage que votre développement .. Bonne chance.
Si vous utilisez firebase-tools, il existe une commande firebase use
qui vous permet de définir le projet que vous utilisez pour firebase deploy
firebase use --add
affichera une liste de vos projets, sélectionnez-en un et vous demandera un alias. De là, vous pouvez firebase use alias
et firebase deploy
pousser vers ce projet.
Dans mon utilisation personnelle, my-app et my-app-dev sont des projets de la console Firebase.
Je n'utilise pas actuellement Firebase, mais je le considère comme vous-même. Il semble que la solution consiste à créer un projet complètement séparé sur la console. Il y avait un article de blog en haut recommandant ceci sur l'ancien site de Firebase, semble être supprimé maintenant. https://web.archive.org/web/20160310115701/https://www.firebase.com/blog/2015-10-29-managing-development-environments.html
Cette discussion recommande aussi la même chose: https://groups.google.com/forum/#!msg/firebase-talk/L7ajIJoHPcA/7dsNUTDlyRYJ
Cet article de blog décrit une approche très simple avec un type de construction debug et release.
En un mot:
- Créez une nouvelle application sur Firebase pour chaque type de construction en utilisant un suffixe d'identification différent.
- Configurez votre projet Android avec le dernier fichier JSON.
- À l'aide de applicationIdSuffix, changez l'ID de l'application pour faire correspondre les différentes applications sur Firebase en fonction du type de construction.
=> voir le blogpost pour une description détaillée.
Si vous voulez utiliser différentes versions de build, lisez ceci blogpost du blog officiel de firebase. Il contient beaucoup d'informations précieuses.
J'espère que cela pourra aider!
Vous devrez gérer différents types de build
Suivez ceci
Tout d'abord, créez un nouveau projet sur la console Firebase, nommez id par YOURAPPNAME-DEV.
Cliquez sur le bouton "Ajouter une application Android" et créez une nouvelle application. Nommez-le com.votreapp.debug, par exemple. Nouveau fichier google-services.json willbe téléchargé automatiquement
Dans votre répertoire src de projet, créez un nouveau répertoire portant le nom "debug" et copiez le nouveau fichier google-services.json ici.
Dans votre module, build.gradle, ajoutez ceci
debug {
applicationIdSuffix ".debug"
}
Maintenant, lorsque vous créez un débogage, google-services.json sera utilisé à partir du dossier "debug" et lorsque vous construirez en mode de publication, google-services.json à partir du répertoire racine du module sera pris en compte.
La façon dont je l'ai fait:
De cette façon, je ne suis pas obligé de gérer mes JSON.
Firebase a une page sur cette page qui explique comment la configurer pour dev et prod
https://firebase.google.com/docs/functions/config-env
Définir la configuration de l’environnement de votre projet Pour stocker l’environnement données, vous pouvez utiliser les fonctions de Firebase: config: commande set dans le fichier CLI Firebase. Chaque touche peut être nommée en utilisant des points pour grouper configuration connexe ensemble. Gardez à l'esprit que seules les minuscules les caractères sont acceptés dans les clés; les caractères majuscules ne sont pas autorisés.
Par exemple, pour stocker l'ID client et la clé API pour "Some Service", vous pourriez courir:
firebase functions:config:set someservice.key="THE API KEY" someservice.id="THE CLIENT ID"
Récupérer la configuration actuelle de l’environnement Pour inspecter ce qui est actuellement stocké dans la configuration de l’environnement de votre projet, vous pouvez utiliser firebase fonctions: config: get. JSON produira quelque chose comme ceci:
{ "someservice": { "key":"THE API KEY", "id":"THE CLIENT ID" } }
J'actualise cette réponse en fonction des informations que je viens de trouver.
Étape 1
Dans firebase.google.com, créez plusieurs environnements (par exemple, dev, staging, prod).
mysite-dev
mysite-staging
mysite-prod
Étape 2
une. Déplacez-vous directement sur le paramètre que vous souhaitez utiliser par défaut (c'est-à-dire dev.)
b. Exécuter firebase deploy
c. Une fois déployé, lancez firebase use --add
ré. Une option apparaîtra pour sélectionner parmi les différents projets que vous avez actuellement.
Faites défiler jusqu'au projet que vous souhaitez ajouter: mysite-staging et sélectionnez-le.
e. On vous demandera ensuite un alias pour ce projet. Entrez staging .
Exécutez à nouveau les éléments a-e pour prod et dev afin que chaque environnement ait un alias.
Sachez dans quel environnement vous vous trouvez
Exécutez firebase use
default (mysite-dev)
* dev (mysite-dev)
staging (mysite-staging)
prod (mysite-dev)
(l'un des environnements aura un astérisque à gauche de celui-ci. C'est celui dans lequel vous vous trouvez actuellement. Il sera également surligné en bleu)
Basculer entre les environnements
Exécutez firebase use staging
ou firebase use prod
pour vous déplacer entre eux.
Une fois que vous êtes dans l'environnement de votre choix, exécutez firebase deploy
et votre projet s'y déploiera.
Voici quelques liens utiles ...
déploiement dans plusieurs environnements
J'espère que cela t'aides.
Pour résoudre ce problème, j’ai créé trois projets Firebase, chacun avec le même projet Android (c’est-à-dire le même applicationId
sans utiliser le applicationIdSuffix
proposé par d’autres). Cela a abouti à trois fichiers google-services.json que j'ai stockés dans mon serveur intégration continue (CI) en tant que variables d'environnement personnalisées . Pour chaque étape de la construction (dev/staging/prod), j'ai utilisé le fichier google-services.json correspondant.
Pour le projet Firebase associé à dev, dans son projet Android, j'ai ajouté l'empreinte de certificat de débogage SHA. Mais pour la mise en scène et prod, je viens de CI signer le APK.
Voici un .gitlab-ci.yml
simplifié qui a fonctionné pour cette configuration:
# 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/
Je suis satisfait de cette solution car elle ne repose pas sur des astuces build.gradle que je crois trop opaques et donc difficiles à maintenir. Par exemple, lorsque j'ai essayé les approches utilisant applicationIdSuffix
et différents buildType
s, j'ai constaté que je ne pouvais pas exécuter ni même compiler de tests instrumentés lorsque je tentais de changer de type de construction à l'aide de testBuildType
. Android semblait donner des propriétés spéciales à la debug
buildType
que je ne pouvais pas inspecter pour comprendre.
Virtuellement, les scripts CI sont cependant assez transparents et faciles à gérer, selon mon expérience. En effet, l'approche que j'ai décrite a fonctionné: lorsque j'ai exécuté chacun des fichiers APK générés par CI sur un émulateur, l'étape "Exécutez votre application pour vérifier l'installation" de la console Firebase est passée de
Vérifier si l'application a communiqué avec nos serveurs. Vous devrez peut-être désinstaller et réinstaller votre application.
à:
Félicitations, vous avez ajouté Firebase à votre application!
pour les trois applications comme je les ai démarrées une par une dans un émulateur.