[RUBY] So verwalten Sie den Unterschied in jeder Umgebung mit yml, ohne die Anzahl von RAILS_ENV zu erhöhen

Neben der Produktionsumgebung und der lokalen Entwicklungsumgebung gibt es im Allgemeinen mehrere Umgebungen, z. B. eine Staging-Umgebung und eine QS-Umgebung. Das Verwalten der verschiedenen Einstellungswerte für jede Umgebung (z. B. Datenbankeinstellungen, URLs und IDs verknüpfter Dienste usw.) ist beim Betrieb einer Rails-Anwendung ein wichtiger Punkt. In diesem Artikel werde ich vorstellen, wie Sie die Einstellungswerte für jede Umgebung mit yml mithilfe von Rails :: Application.config_for verwalten, das von Rails bereitgestellt wird, ohne RAILS_ENV zu erhöhen.

https://speakerdeck.com/spring_mt/deep-environment-parity-cdnt-2019 Unter der Annahme, dass es mehrere Umgebungen gibt, lesen Sie bitte auf dieser Folie, wie Sie versuchen, den Unterschied im Umgebungssinn zu beseitigen und sie abzugleichen.

Eine Überprüfung von Rails :: Application.config_for

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

Wenn Sie so schreiben, liest es /application.yml im Konfigurationsverzeichnis und liest den Einstellungswert, der mit RAILS_ENV übereinstimmt.

Rails.configuration.x.application[:hoge]

Nach dem Lesen können Sie den Wert des Schlüssels mit dem Namen hoge in yml abrufen, indem Sie ihn wie oben an der Stelle aufrufen, die Sie verwenden möchten. Diese Funktion ist sehr praktisch und wird von Rails empfohlen, daher möchte ich sie aktiv nutzen.

Sollte ich RAILS_ENV für jede Umgebung erhöhen?

Um Rails :: Application :: config_for unverändert zu verwenden, erhöhen Sie einfach RAILS_ENV. Sicher wird oft gesagt, dass config / environment / staging.rb usw. bereit sind, Umgebungsvariablen zu erhöhen. Ich denke jedoch nicht, dass diese Methode sehr gut ist. Der Grund dafür ist, dass RAILS_ENV eine Umgebungsvariable zum Ändern des Verhaltens des Frameworks mit dem Namen Rails ist. Daher denke ich, dass die Verwendung des Frameworks zum Ändern des Einstellungswerts der Anwendung wie in dieser Zeit nicht in der Idee von Rails liegt. Weil ich denke.

Verwenden Sie Umgebungsvariablen, da die Variablen für jede Umgebung unterschiedlich sind.

Da vertrauliche Informationen wie Datenbankkennwörter häufig über Umgebungsvariablen übertragen werden, ist es selbstverständlich, alle Einstellungswerte auch als Umgebungsvariablen zu verwenden. Umgebungsvariablen werden jedoch auf der Infrastrukturseite festgelegt. Da es sich um einen Anwendungseinstellungswert handelt, möchten Sie ihn möglicherweise im Anwendungsrepository verwalten. Vermeiden Sie daher die Verwaltung mit Umgebungsvariablen.

Wenn Sie Umgebungsvariablen beiläufig hinzufügen und im Repository gut verwalten können, ist diese Methode auch gut. In unserem Projekt verwalten wir die Infrastruktur mithilfe von CloudFormation. Da CloudFormation jedoch in einem separaten Repository verwaltet wird und der Zeitpunkt der Bereitstellung unterschiedlich ist, haben wir die Verwaltung mit Umgebungsvariablen eingestellt.

Was soll ich dann tun?

https://speakerdeck.com/spring_mt/deep-environment-parity-cdnt-2019?slide=47 Tun Sie es so, als wäre es auf den Seiten 47-51 der Folie, die ich zuvor vorgestellt habe. Es wird jedoch nur der Teil manipuliert, der den Prehook von Entrykit verwendet. Ich werde es vorerst ausführlich erklären. Wie oben erwähnt, möchte ich mit yml für config_for verwalten, also platziere yml mit der folgenden Verzeichnisstruktur. Der Inhalt von yml wird weggelassen, aber der Schlüssel am Anfang von yml muss mit RAILS_ENV (Entwicklung, Test oder Produktion) identisch sein.

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 ist eine Methode, mit der die yml-Datei unter config gelesen werden kann. Sie müssen also yml unter dem Verzeichnis stage_settings unter config verschieben.

In der zuvor vorgestellten Folie wurde dies mit dem Prehook von Entrykit realisiert, aber ich habe es geändert, weil ich dachte, dass es einfacher wäre, es in config / boot.rb zu beschreiben, wenn es sich um einen Prozess handelt, der immer ausgeführt wird, wenn Rails gestartet wird. (Config / boot.rb sollte der einzige Ort sein, an dem Dinge dazwischen gelegt werden können, bevor Rails gestartet wird ...)

# 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.

#↑ ist der von Rails automatisch generierte Code. Originalverarbeitung von hier

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'))

Beschreibe es so. Eine neue Umgebungsvariable mit dem Namen APP_STAGE wurde hinzugefügt. Diese Umgebungsvariable repräsentiert die Umgebung wie Staging und QA-Umgebung.

Jetzt werden bei jedem Start alle Dateien unter stage_settings in das Konfigurationsverzeichnis kopiert. Um zu entscheiden, welche yml beim Start verwendet werden soll, fügen Sie sie zu .gitignore hinzu, damit yml nicht direkt im Konfigurationsverzeichnis festgeschrieben wird.

Der Grund dafür ist, dass einige Mitarbeiter im Team mit Docker entwickeln und andere nicht, und ich möchte den Aufwand nicht erhöhen, dies zu tun, um eine lokale Entwicklungsumgebung einzurichten. Ich habe mir das ausgedacht, weil ich dachte, es gäbe einen guten Weg, dies zu tun.

Zusammenfassung

--RAILS_ENV wird nicht erhöht, selbst wenn Sie den Einstellungswert für jede Umgebung ändern möchten

Recommended Posts

So verwalten Sie den Unterschied in jeder Umgebung mit yml, ohne die Anzahl von RAILS_ENV zu erhöhen
Verwendung von git mit der Leistung von jgit in einer Umgebung ohne git-Befehle
So bestimmen Sie die Anzahl der Parallelen
Ausführen mit normalen Befehlen für die Entwicklungssprache in der Docker-Entwicklungsumgebung
So ändern Sie die maximale und maximale Anzahl von POST-Daten in Spark
So ermitteln Sie die Gesamtzahl der Seiten beim Paging in Java
So fügen Sie die Verarbeitung mit einer beliebigen Anzahl von Elementen in die iterative Verarbeitung in Ruby ein
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
So legen Sie Umgebungsvariablen in der Eigenschaftendatei der Spring-Boot-Anwendung fest
Organisierte schrittweise Interaktion mit dem JDK
Booten nach Umgebung mit Spring Boot of Maven
[Grobe Erklärung] So trennen Sie den Betrieb der Produktionsumgebung und der Entwicklungsumgebung mit Rails
Zusammenfassung der Verwendung des im IE festgelegten Proxy-Sets bei der Verbindung mit Java
Wie man mit html.erb nummeriert (nummeriert)
Hinzufügen von Elementen ohne Angabe der Länge des Arrays
So leiten Sie den letzten Tag des Monats in Java ab
So ändern Sie den Inhalt der JAR-Datei, ohne sie zu dekomprimieren
Ich möchte den Inhalt von Assets in der mit capistrano erstellten Umgebung von Grund auf neu erstellen
Finden Sie mit Kotlin die Anzahl der Tage in einem Monat
[Anfänger] Verfahren zum Anmelden bei der mit Vagrant erstellten virtuellen Umgebung
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Geben Sie die Differenz zwischen jedem Feld zweier Objekte in Java aus
[Schienen] So ändern Sie den Seitentitel des Browsers für jede Seite
So erhalten Sie die ID des automatisch inkrementierten PRIMAY-Schlüssels in MyBatis
Wie installiere ich die in Ubuntu verwendete Sprache und wie erstelle ich die Umgebung?
So ermitteln Sie die Länge einer Audiodatei mit Java
So erhöhen Sie den Wert von Map in einer Zeile in Java
So machen Sie den Einzug zu zwei Einzelbyte-Leerzeichen in der JAXB-Implementierung des JDK
So dekorieren Sie CSS auf Rails6 form_with (Hilfs-) Optionsfeldern
So greifen Sie mit der TCP-Funktion von Spring Integration direkt auf Socket zu
So wechseln Sie die Anzeige des Header-Menüs für jede Übergangsseite
So konvertieren Sie ein Array von Strings mit der Stream-API in ein Array von Objekten
[Rails] So erhalten Sie die aktuell mit devise angemeldeten Benutzerinformationen
So beschränken Sie die Aktion des Übergangsziels, wenn Sie nicht angemeldet sind
So lösen Sie die lokale Umgebungskonstruktion von Ruby on Rails (MAC)!
So ändern Sie den Wert einer Variablen an einem Haltepunkt in IntelliJ
So ermitteln Sie den absoluten Pfad eines in Java ausgeführten Verzeichnisses
Android-Entwicklung, wie man den Wert des JSON-Objekts auf null überprüft
[Rails] So wenden Sie das in der Hauptanwendung verwendete CSS mit Administrate an
[swift5] So ändern Sie die Farbe der TabBar oder die Farbe des TabBar-Elements mit Code
So sortieren Sie eine Liste von SelectItems
So erhalten Sie das Datum mit Java
Verwendung von Umgebungsvariablen in RubyOnRails
So erstellen Sie eine Rails 6-Umgebung mit Docker
Richtig / falsch-Beurteilung basierend auf der Bedingung jeder Differenz mit mehreren ganzen Zahlen
Anzeigen der vom Docker-Container verwendeten Festplattenmenge für jeden Container
So überprüfen Sie die neueste Version von io.spring.platform für das Schreiben in pom.xml von Spring (STS)
[Schienen] So registrieren Sie mehrere Datensätze in der Zwischentabelle mit einer Zuordnung von vielen zu vielen
[Swift] So ändern Sie die Reihenfolge der Balkenelemente in Tab Bar Controller [Anfänger]
So senden Sie benutzerdefinierte Metriken und Ereignisse mit Laravel in einer Docker-Compose-Umgebung an Datadog
[Rails] So bedienen Sie die in der Hauptanwendung verwendete Hilfsmethode mit Administrate
So erstellen Sie mit Docker ~ Vue ~ eine [TypeScript + Vue + Express + MySQL] -Umgebung
So erstellen Sie eine eindeutige Datenkombination in der Schienen-Zwischentabelle
Was ist zu tun, wenn in einer der Quellen in der Entwicklungsumgebung mit Docker × Rails × RSpec "Nicht gefunden" angezeigt wird?
Umgang mit dem Fehler yaml.scanner.ScannerError: Beim Scannen nach dem nächsten Token, das beim Erstellen einer Rails-Umgebung mit Docker angezeigt wurde