Open damienld22 opened 6 years ago
Si je comprends bien, utils.js et index.js sont gérés sous git. conf-sms aussi, ou pas ? si oui, pas top niveau confidentialité. si non, où est-il ?
De façon générale, quelles sont les bonnes pratiques en dév node.js pour stocker/planquer/gérer sa conf de prod pour que
Oui les fichiers utils.js
et index.js
sont gérés avec Git.
Concernant le fichier conf-sms
à voir comment on peut faire. Voici deux nouvelles propositions :
Dans ce cas, on laisse le développeur mettre les configurations dans son code source. Ce n'est pas une bonne pratique mais il faut lui laisser le faire.
Je viens aussi de voir la proposition faite dans les spécifications dans le fichier 6-deploy.md
. Cela concerne l'utilisation de la CLI pour spécifier un fichier de configuration, qui est disponible dans Git :
zeta push --server-only --prod
C'est faisable en ayant par convention un fichier environment-prod.json
pour utiliser --prod
:
Cela pose problème en ce qui concerne la confidentialité des configurations mais je pense que c'est une bonne manière de faire, que l'on devrait proposer. (Angular utilise ce principe)
La seconde proposition concerne un stockage de la configuration directement sur la plateforme ZetaPush. La configuration est une info gérée administrativement. C'est le principe utilisé par Firebase.
Pour le stockage des données, le chef de projet peut appeler un Cloud Service dédié ou passer par http://console.zetapush.com. Les configurations sont saisies sous forme de surcharge, et peuvent être nommées. Par exemple un développeur accède aux configurations de cette manière :
import { ConfigurationService } from "@zetapush/server";
const confService = new ConfigurationService();
function SMS_CONFIG {
switch(packageJson.zetapush.name) {
case "myApp":
return confService.get("sms-prod");
case "myApp-dev":
return confService.get("sms-dev");
}
On peut aussi penser à une configuration qui est présente par défaut dans le code source. Comme ça dès qu'un nouveau développeur arrive, l'application fonctionne.
Pouce bleu pour la méthode Firebase
Attention quand tu parle de "version" ça peut être mal compris (même si tu explique) par rapport au concept de version en développement (1.2.0 par exemple). Ca peut laisser sous entendre que j'ai une version 1.2.0 en prod et 1.3.0 en dev.
Je ne suis absolument pas d'accord de demander à créer deux applications. C'est justement tout le principe de proposer des environnements (chose que firebase ne fait pas et qui justement OBLIGE à créer plusieurs applications parce qu'il n'y a pas le choix). Profitons-en pour nous démarquer par rapport à notre cible : un milieu d'entreprise.
L'objectif est bien d'avoir le MEME code que ce soit en dev, en prod ou autre. C'est bien la MEME application, juste déployée sur des "zones" (visibles ou non par les clients finaux) et avec une configuration différente (qui peut d'ailleurs être managée depuis la console).
Le but est également d'avoir une console claire : Je sélectionne mon app, je vois les différents environnements d'un coup d'oeil (dev, integration, recette, pre-prod, prod) et leur "santé". Tout ça fait partie du cycle de vie de l'application. En tant que chef de projet, je peux voir quelle version est en prod, laquelle va bientôt arriver en prod, laquelle est en phase de dev... On doit aussi faciliter la gestion d'un projet et non pas ajouter des contraintes parce qu'on a la flemme (je grossi bien évidemment le trait mais je répète, pour moi c'est à nous de faire les efforts pour que ce soit simple et non pas demander à nos utilisateurs de faire avec ce qu'ils ont).
Oui je suis d'accord qu'on peut apporter mieux. Dans cette optique j'ai réfléchi à ça, qu'en pensez vous :
Ce que je souhaite en tant que chef de projet :
Ce que je souhaite en tant que développeur :
Je suis chef de projet et j'ai mon application nommée myApp. Je veux créer deux environnements (dev et prod). Pour ceci je passe par ma console. Je vois aussi que mon environnement par défaut est "dev", cela évite que les développeurs poussent du code sur le mauvais environnement.
À présent je souhaite gérer ma configuration selon mon environnement. J'ai un service d'envoi de SMS et un d'envoi de mail. Pour les configurer, je vais remplir un formulaire (clé-valeur), uploader un fichier ou écrire un texte brut (Voir pour plus de choix), bref, j'ai le choix de comment j'écris ma configuration. Je fais cette saisie dans un premier temps pour l'environnement de "dev" (On commence par n'importe quel environnement).
À présent, je souhaite écrire la conf de mon environnement de prod, mais j'ai seulement une valeur qui change par rapport au dev. Je spécifie donc que ma configuration hérite de "dev" et je surcharge seulement la donnée qui m'intéresse.
Pour rendre la configuration accessible aux développeurs, je spécifie un mot clé dans ma console. Par exemple mon environnement de prod sera : prod et mon environnement de dev sera dev.
Je suis développeur et je travaille sur myApp. Je ne m'embête pas à gérer la configuration, je sais que mon chef de projet s'est occupé de ça. Pour travailler j'importe la configuration de mon service de sms de cette manière :
import { ConfigurationService } from "@zetapush/server";
// Création du service d'envoi de SMS
// Appel du service de configuration pour récupérer la bonne conf automatiquement
const smsService = new SmsService(ConfigurationService.get());
Dans ce cas, la configuration récupérée dépend du package.json
dans le champs zetapush
> environment
.
Si je souhaite utiliser la CLI je peux faire :
zeta push --server-only --prod
Dans ce cas, c'est la configuration spécifiée dans la CLI qui prend le dessus.
Voici le format du package.json :
// ...
"zetapush": {
"front": "./front", // Optionnel,
"back": "./server", // Optionnel,
"name": "myApp",
"environment": "dev", // Optionnel
}
// ...
Je laisse bien-sûr le choix au développeur de mettre sa configuration dans son Git et de ne pas appeler notre Cloud Service de configuration.
Beaucoup mieux je trouve. J'ajouterais quand même deux choses :
Pour info, n'hésitez pas à regarder ce que propose Travis CI sur la gestion des variables d'environnement. C'est très simple mais très pratique.
En ce qui concerne la sécurité, chaque créateur d'organisation (voir le premier post) gère les droits. Il peut par exemple décider qui pousse en prod, qui peut changer une conf, qui peut créer un nouvel environnement, etc...
Je te rejoins @aurelien-baudet sur le fait que le fichier de configuration dans le code soit la conf par défaut et que ce soit le merge des deux (avec la conf dans la console) qui soit effectif. On pourrait notamment donner la possibilité depuis la console de donner les ordres de priorité sur les configurations à prendre en compte.
"Par contre dans certaines sociétés que je connais bien, les devs développent mais ne mettent pas en prod"
Je dirais même plus :
sinon, question : quand je clone une sandbox, est-ce que je clone la conf ?
@pablo-abreu Oui tout l'intérêt d'avoir une gestion de droits dans l'organisation.
Concernant le clone je pense qu'à présent on devrait parler de clone d'application. Donc selon moi la conf est liée à l'application et devra donc être clonée.
Gestion des environnements avec ZetaPush Celtia
Problématiques
Comportement souhaité
Gestion des organisations
Si je ne spécifie pas d'organisation ou que je créé un compte temporaire avec la CLI, j'ai un compte qui n'appartient à aucune organisation (ou plutôt une organisation par défaut mais transparente d'un point de vue développeur). Ensuite je peux à tout moment faire une demande d'accès à une organisation à un responsable d'une organisation.
Je peux créer une organisation via la création de compte sur https://console.zetapush.com. Le choix du nom de l'organisation se fait directement par le développeur (ou chef de projet). Si nous avons un conflit sur le nom de l'organisation, on peut contacter ZetaPush qui fera le nécessaire. (Au sens si un client souhaite créer une organisation au nom de son entreprise et que le nom n'est pas dispo). Pour moi ce n'est pas un problème prioritaire.
Résultat
Gestion des environnements
Proposition : Chaque nouvelle application est un nouvel environnement
Pour un développeur seul, la notion d'environnements est complètement transparente. Il utilise son application et tout se passe bien. En revanche dans une entreprise, un chef de projet peut décider de créer une organisation chez ZetaPush et de créer deux applications myApp et myApp-dev.
Point de vue développeur
Voici ma proposition pour la gestion des environnements d'un point de vue développeur :
Prenons le cas où j'ai mes deux applications myApp et myApp-dev. J'ai au sein de mon application un service d'envoi de SMS qui a une configuration propre à chaque environnement. Voici ce que le développeur peut écrire :
index.js
utils.js
Voila pour la proposition, merci d'y ajouter vos suggestions et remarques !