[RUBY] Comment gérer la différence dans chaque environnement avec yml sans augmenter le nombre de RAILS_ENV

En plus de l'environnement de production et de l'environnement de développement local, il existe généralement plusieurs environnements tels qu'un environnement intermédiaire et un environnement d'assurance qualité. Comment gérer les différentes valeurs de paramètres pour chaque environnement (par exemple, les paramètres de la base de données, les URL et les ID des services liés, etc.) est un point à se soucier lors de l'utilisation d'une application Rails. Dans cet article, je vais vous montrer comment gérer les valeurs de paramètres pour chaque environnement avec yml en utilisant Rails :: Application.config_for préparé par Rails sans augmenter RAILS_ENV.

https://speakerdeck.com/spring_mt/deep-environment-parity-cdnt-2019 En supposant qu'il existe plusieurs environnements, veuillez vous reporter à cette diapositive pour découvrir comment éliminer la différence dans le sens de l'environnement et les associer.

Un examen de Rails :: Application.config_for

module MyApp
  class Application < Rails::Application
    config.application= config_for(:application)
  end
end

Si vous écrivez comme ceci, il lira /application.yml sous le répertoire de configuration et lira la valeur de paramètre qui correspond à RAILS_ENV.

Rails.configuration.x.application[:hoge]

Après lecture, vous pouvez obtenir la valeur de la clé appelée hoge dans yml en l'appelant comme ci-dessus à l'endroit que vous souhaitez utiliser. Cette fonctionnalité est très pratique et recommandée par Rails, je voudrais donc l'utiliser activement.

Dois-je augmenter RAILS_ENV pour chaque environnement?

Pour utiliser Rails :: Application :: config_for tel quel, augmentez simplement RAILS_ENV. Certes, on dit souvent que config / environnements / staging.rb etc. sont prêts à augmenter les variables d'environnement. Cependant, je ne pense pas que cette méthode soit très bonne. Parce que RAILS_ENV est une variable d'environnement pour changer le comportement du framework appelé Rails, je pense que l'utiliser pour changer la valeur de réglage de l'application comme cette fois n'est pas l'idée de Rails. Parce que je pense.

Puisque les variables sont différentes pour chaque environnement, pourquoi ne pas utiliser des variables d'environnement?

Étant donné que les informations confidentielles telles que les mots de passe de base de données sont souvent transmises via des variables d'environnement, il est naturel d'utiliser également toutes les valeurs de paramétrage comme variables d'environnement. Cependant, les variables d'environnement seront définies du côté de l'infrastructure, et comme il s'agit d'une valeur de paramètre d'application, vous souhaiterez peut-être la gérer dans le référentiel d'application, évitez donc de la gérer avec des variables d'environnement.

Si vous pouvez ajouter des variables d'environnement avec désinvolture et les gérer correctement dans le référentiel, cette méthode est également bonne. Dans notre projet, nous gérons l'infrastructure à l'aide de CloudFormation, mais étant donné que CloudFormation est géré dans un référentiel séparé et que le calendrier de déploiement est différent, nous avons arrêté de le gérer avec des variables d'environnement.

Alors que dois-je faire?

https://speakerdeck.com/spring_mt/deep-environment-parity-cdnt-2019?slide=47 Faites-le comme si c'était aux pages 47-51 de la diapositive que j'ai présentée plus tôt. Cependant, seule la partie qui utilise le préhook de Entrykit est falsifiée. Je vais vous expliquer en détail pour le moment. Comme mentionné ci-dessus, je veux gérer avec yml pour config_for, alors placez yml avec la structure de répertoire suivante. Le contenu de yml est omis, mais la clé au début de yml doit être la même que RAILS_ENV (développement, test ou production).

config/stage_settings
├── circleci
│   ├── application.yml
│   ├── database.yml
│   ├── secrets.yml
│   └── sentry.yml
├── local
│   ├── application.yml
│   ├── database.yml
│   ├── secrets.yml
│   └── sentry.yml
├── production
│   ├── application.yml
│   ├── database.yml
│   ├── secrets.yml
│   └── sentry.yml
└── staging
    ├── application.yml
    ├── database.yml
    ├── secrets.yml
    └── sentry.yml

Rails :: Application.config_for est une méthode qui peut lire le fichier yml sous config, vous devez donc déplacer yml sous le répertoire stage_settings sous config.

Dans la diapositive présentée plus tôt, il a été réalisé en utilisant le préhook de Entrykit, mais je l'ai changé car je pensais qu'il serait plus facile de le décrire dans config / boot.rb s'il s'agit d'un processus qui est toujours effectué au démarrage de Rails. (Config / boot.rb devrait être le seul endroit pour mettre les choses entre les deux avant de démarrer Rails ...)

# config/boot.rb

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)

require 'bundler/setup' # Set up gems listed in the Gemfile.
require 'bootsnap/setup' # Speed up boot time by caching expensive operations.

#↑ est le code généré automatiquement par Rails. Traitement original d'ici

stage = ENV.fetch('APP_STAGE', 'local')
path = File.join('config', 'stage_settings', stage)
raise "#{path} is not a directory." unless File.exist?(path)

FileUtils.cp_r(Dir.glob("#{path}/*"), File.join('config'))

Décrivez-le comme ça. Une nouvelle variable d'environnement appelée APP_STAGE a été ajoutée, qui est une variable d'environnement pour représenter l'environnement tel que le staging et l'environnement qa.

Désormais, à chaque démarrage, tous les fichiers sous stage_settings seront copiés dans le répertoire config. Afin de décider quel yml utiliser au démarrage, ajoutez-le à .gitignore afin que yml ne soit pas validé directement sous le répertoire config.

La raison en est que certaines personnes de l'équipe développent avec Docker et d'autres pas, et je ne veux pas augmenter les tracas d'avoir à faire cela pour mettre en place un environnement de développement local. Je suis venu avec cela parce que je pensais qu'il y avait une bonne façon de le faire.

Résumé

--RAILS_ENV n'augmente pas même si vous souhaitez modifier la valeur de paramètre pour chaque environnement --Je veux gérer les valeurs de réglage pour chaque environnement avec yml

Recommended Posts

Comment gérer la différence dans chaque environnement avec yml sans augmenter le nombre de RAILS_ENV
Comment utiliser git avec la puissance de jgit dans un environnement sans commandes git
Comment déterminer le nombre de parallèles
Comment exécuter avec des commandes de langage de développement normales dans l'environnement de développement Docker
Comment modifier le nombre maximum et maximum de données POST dans Spark
Comment trouver le nombre total de pages lors de la pagination en Java
Comment insérer un traitement avec n'importe quel nombre d'éléments dans le traitement itératif dans Ruby
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Comment définir des variables d'environnement dans le fichier de propriétés de l'application Spring Boot
Organisé comment interagir avec le JDK par étapes
Comment démarrer par environnement avec Spring Boot de Maven
[Explication approximative] Comment séparer le fonctionnement de l'environnement de production et de l'environnement de développement avec Rails
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
Comment numéroter (nombre) avec html.erb
Comment ajouter des éléments sans spécifier la longueur du tableau
Comment dériver le dernier jour du mois en Java
Comment modifier le contenu du fichier jar sans décompresser
Je veux recréer le contenu des actifs à partir de zéro dans l'environnement construit avec capistrano
Trouvez le nombre de jours dans un mois avec Kotlin
[Débutant] Procédure de connexion à l'environnement virtuel construit avec Vagrant
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
Sortie de la différence entre chaque champ de deux objets en Java
[Rails] Comment changer le titre de la page du navigateur pour chaque page
Comment obtenir l'identifiant de la clé PRIMAY incrémentée automatiquement dans MyBatis
Comment installer le langage utilisé dans Ubuntu et comment créer l'environnement
Comment obtenir la longueur d'un fichier audio avec Java
Comment incrémenter la valeur de Map sur une ligne en Java
Comment créer un retrait de deux espaces d'un octet dans l'implémentation JAXB du JDK
Comment décorer CSS sur les boutons radio de rails6 form_with (helper)
Comment accéder directement à Socket avec la fonction TCP de Spring Integration
Comment changer l'affichage du menu d'en-tête pour chaque page de transition
Comment convertir un tableau de chaînes en un tableau d'objets avec l'API Stream
[Rails] Comment obtenir les informations sur l'utilisateur actuellement connecté avec devise
Comment contraindre l'action de la destination de transition lorsqu'elle n'est pas connectée
Comment résoudre la construction de l'environnement local de Ruby on Rails (MAC)!
Comment changer la valeur d'une variable à un point d'arrêt dans intelliJ
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
Développement Android, comment vérifier null dans la valeur de l'objet JSON
[Rails] Comment appliquer le CSS utilisé dans l'application principale avec Administrer
[swift5] Comment changer la couleur de TabBar ou la couleur de l'élément de TabBar avec le code
Comment trier une liste de SelectItems
Comment obtenir la date avec Java
Comment utiliser les variables d'environnement dans RubyOnRails
Comment créer un environnement Rails 6 avec Docker
Jugement vrai / faux basé sur la condition de chaque différence avec plusieurs entiers
Comment afficher la quantité de disque utilisée par le conteneur Docker pour chaque conteneur
Comment vérifier la dernière version de io.spring.platform pour l'écriture dans pom.xml de Spring (STS)
[Rails] Comment enregistrer plusieurs enregistrements dans la table intermédiaire avec une association plusieurs-à-plusieurs
[Swift] Comment changer l'ordre des éléments de barre dans le contrôleur de barre d'onglets [Débutant]
Comment envoyer des métriques et des événements personnalisés à datadog avec laravel dans l'environnement docker-compose
[Rails] Comment utiliser la méthode d'assistance utilisée dans l'application principale avec Administrer
Comment créer un environnement [TypeScript + Vue + Express + MySQL] avec Docker ~ Vue ~
Comment créer une combinaison unique de données dans la table intermédiaire des rails
Que faire lorsque «Impossible de trouver» dans l’une des sources apparaît dans l’environnement de développement avec Docker × Rails × RSpec
Comment gérer l'erreur yaml.scanner.ScannerError: lors de la recherche du jeton suivant apparu lors de la création d'un environnement Rails avec Docker