Verwalten von Konfigurations-Dateien über mehrere Umgebungen hinweg
Wie haben Sie (Ihre Firma) zu verwalten, die config-Dateien der Anwendungen/Systeme, die Sie bauen? Lassen Sie mich Ihnen sagen, wie wir es tun, und was das problem ist.
Ich arbeite bei einer Firma, wo wir entwickeln software mit über 15 Entwicklern. Wir bauen line-of-business web-apps, die im Einsatz bei unseren managed-hosting-Anbieter.
Eines unserer wichtigsten apps besteht aus einer web-site und über zehn WCF-Dienste. Einige der Dienstleistungen, die miteinander verbunden sind.
Ich weiß nicht, ob dies ist ein großes system oder kleines, aber meiner Meinung nach ist, das dauert uns viel zu lange, um die Dinge laufen in unseren verschiedenen Umgebungen (test, Abnahme und Produktion).
Wir haben die config-Dateien pro Umwelt in unseren Visual Studio-Projekte. So ein web.test.config
eine web.acc.config
eine web.prod.config
und ein web.config
für die Entwicklung. Sie alle haben die gleichen Schlüssel, die in Ihnen, aber die Werte können unterschiedlich sein, abhängig von der Umwelt, von der Sie gedacht sind.
Mache ich, wenn ich eine schnelle Zählung der appsettings in der web.config für die webapp zähle ich 32. Und ich zähle 5 Endpunkte. Wir haben vier Umgebungen (dev, test, acc und prod) dies bedeutet, dass 128 appsettings-und 20-Endpunkte, die insgesamt für eine web-app. Wir können leicht Fehler machen, vor allem, wenn Fristen schließen.
Wir sind alle Menschen, so dass Dinge wie diese können jedem passieren:
- Wir eine änderung in einer config-Dateien, aber vergessen zu schauen, bevor wir erstellen und bereitstellen.
- Oder wir eine änderung auf dem WebServer und vergessen, zu aktualisieren, dementsprechend in vier anderen web.configs.
- Oder Ändern wir nur drei von vier config-Dateien. Und so weiter.
Dann haben wir die Infrastruktur an unseren managed hosting-Anbieter. Standardmäßig ist jeder Anschluss ist geschlossen. Also, wenn eine WCF-Dienste zu sprechen, um andere von WCF-Diensten, die sich auf einem anderen server, einer firewall-geschützten port muss offen sein.
Tun wir dies im Test, aber in der Annahme wir haben es wieder tun, und wir haben vergessen, welche ports müssen geöffnet werden, so dass es mehr wie trial-und-error: Oh mein service kann keine Verbindung zur Datenbank, wahrscheinlich ist der port geschlossen. Das gleiche problem kann auftreten, in der Produktion als auch.
Unseren managed-hosting-provider kann ein paar Tage dauern, öffnen Sie einen port in einer firewall, die nach dem SLA. So, dies schnell zu einem ziemlich langen Prozess. Und am Ende dauert es etwa zwei Monate, um Test, Abnahme und Produktion laufen.
So, meine Frage ist: wie schaffen Sie es, die Konfigurationen und die Infrastruktur und der Prozess um ihn herum?
- Nur ein Stück. Auf der Startseite habe ich einen Scheck wurden der app berührt alle Ressourcen und berichten eine nicht-Antwort.
- Das ist eine gute Frage - ich wünschte, es hatte ein Dutzend Antworten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Config4* Projekt (disclaimer: ich bin seine primäre Entwickler) nicht eine out-of-the-box-integration mit .Netto-oder WCF -, so ist es wahrscheinlich nicht für Sie nützlich. Jedoch, eines der Merkmale in Config4* relevante zu deiner Frage: es ist die Möglichkeit zum einbetten von if-then-else-Anweisungen in einer Konfigurationsdatei, so dass man die Datei "anpassen" sich für verschiedene Umgebungen (wie Entwicklung, Test, Abnahme und Produktion).
Können Sie möglicherweise ändern, dass das Konzept für die Arbeit mit der gewünschten Konfiguration syntax, die Sie verwenden in Ihrem .Net/WCF-basierte Projekt (ich bin nicht vertraut mit den Technologien, aber ich vermute, dass Sie wahrscheinlich verwenden XML-basierte Konfigurationsdateien). Insbesondere, könnten Sie ein Skript schreiben mit, sagen wir, Python, verwendet if-then-else-Anweisungen zu setzen, Umwelt-spezifische name=Wert Paare in einer
map
, und verwenden Sie dann einigeprint
Aussagen zu generieren, die eine Reihe von Konfigurations-Dateien angepasst für eine Umgebung. Eine pseudo-code-Gliederung für ein solches Skript ist:Für bonus-Punkte, könnte das Skript auch generieren Sie eine Liste der tests, die durchgeführt werden müssen, für die Umwelt, zum Beispiel "Prüfen Sie, ob ein firewall-port geöffnet werden muss zwischen den folgenden Endpunkte: ..."
Entwickeln wir in einem verteilten storage-system und fangen wir viele Probleme mit unserem unit-und integration tests, die mit jedem build. Auch wir sind mit ReviewBoard, für andere Entwickler, um einen Blick auf irgendwelche Veränderungen, bevor Sie begangen werden. Der nächste Schritt ist die continuous integration server (jenkins), dass auto setzt und testen der Artefakte in verschiedenen Umgebungen. Endlich, unsere Letzte Verteidigungslinie ist unsere stress-test-testbed läuft gegen eine neue version, bevor Sie veröffentlicht wird.
Natürlich ist es wichtig, eine Plattform, die imitiert Ihre Produktionsumgebung so gut wie möglich, aber wenn Sie die Anwendung immer auf dem gleichen hosting-Anbieter, das sollte nicht allzu schwer sein.
Bezug auf Ihren speziellen Fall, wo änderungen in einer Datei, könnte vergessen worden sein in den anderen, etc.: Ich denke, das wäre ganz einfach zu automatisch überprüfen Sie mit einem test script.
Übernommene änderungen sollten so leicht zu erkennen wie "git diff master", oder was auch immer vcs, die Sie verwenden.
Zu wissen, welche ports offen sein müssen für die Dienste, die scheint mehr zu sein als eine Frage der richtigen Dokumentation als die von Konfigurations-management.
Viele der Websites, die Sie von unserem system auch verwenden puppet, um die Konfiguration verwalten Ihrer verschiedenen Knoten. Ich bin nicht sicher, wenn dann wäre das eine option für Sie, aber es könnte sein, lohnt sich einen Blick auf.
Dies kann helfen, er spricht über einen zentralen Ort für die config-Dateien und-Dienste verweisen auf die aus der einen Quelle.
http://blogs.msdn.com/b/youssefm/archive/2010/09/02/loading-wcf-client-configuration-from-different-files-with-configurationchannelfactory.aspx
Es klingt wie Sie haben einen genügend kleinen Umgebung konnte Sie problemlos verwalten Sie alle config-Dateien mit Ansible-Vorlagen oder SaltStack.
Werfen Sie einen Blick auf Config bei http://www.configapp.com. Die Art und Weise es die Arbeit ist, die Sie importieren eine Basis-Konfiguration-Datei namens web.config. Dann innerhalb des webapp erstellen Sie in 4-Umgebungen, dev -, test -, acc-und prod. Gehen Sie auf die dev-Umgebung, erstellen Sie Ihre Umwelt-Variablen, und legen Sie die entsprechenden Werte für die Umwelt. Sie pflegen nur eine Konfigurations-Datei mit den Umgebungsvariablen. Sie können sehen, alle environment-Variablen, und problemlos die Unterschiede zwischen den Umgebungen.
Werden Sie weniger Fehler machen, weil Sie nur noch 1-Konfigurationsdatei zu verwalten. Beim hinzufügen einer neuen common/statische Konfiguration, alle Umgebungen, die Magische Kräfte haben, dass die neue Einstellung. Wenn Sie eine variable hinzufügen Konfiguration, gehen Sie einfach die richtige Registerkarte "Umgebung" und setzen Sie den Wert gibt. Sie können eine bestimmte Konfiguration Wert für alle Umgebungen, so dass es einen schnellen Weg, um zu überprüfen, ob Sie etwas verpasst. Sie können auch Augapfel jede Konfigurationsdatei pro Umwelt, da Sie alle direkt vor Ihnen. Sie nicht brauchen, um RDP/SSH auf jedem server.
Den Sie nicht vergessen werden zu überprüfen, da in Config werden die master-Kopie, und Sie werden nicht die Konfigurationsdateien direkt mehr. Wenn Sie das tun, Bearbeiten Sie diese direkt, wir haben eine diff-Funktionalität, so dass Sie sehen können, die Unterschiede zwischen der master-und der lokalen Kopie. Stellen Sie die master-Kopie auf Ihrem lokalen server unter Verwendung der verschiedenen deployment-Modelle, die passt zu Ihrem team. Sie können push, manuell ziehen, automatisch ziehen oder zu exportieren/kopieren.
Werden wir die Unterstützung für benutzerdefinierte Typen, und eine Sache, die wir hinzufügen können, in der Zukunft ist eine port-Daten geben. Teil von port Validierung wäre zu überprüfen ob der port offen ist. Dies funktioniert nur über die lokale plan, da braucht es Zugriff auf das interne Netzwerk. Oder Sie können einfach überprüfen Sie Sie manuell. Gehen Sie auf das port-Umgebungsvariable, und alle ports anzeigen, die derzeit konfiguriert. Überprüfen Sie jeden port in der Liste. Wenn der port sieht gut aus, fügen Sie einen Kommentar in der Config an, dass Sie offen und es wurde geprüft an einem bestimmten Datum. Config ist ausgelegt für die Suche und Dokumentation.
Bin ich Teil der Config-team, durch die Art und Weise.
Persönlich, wenn es möglich ist, Schaffe ich es auf folgende Weise: Alle "statischen" Umgebung-Einstellungen (Datenbank-verbindungen, LDAP, etc) platziert werden, in der server-config Datei (die nicht betroffen durch die code-Migrationen) und die "dynamic" - Einstellungen in der Datenbank selbst.
So dass ich nur von Datenbank-team um die Einstellungen zu aktualisieren (wenn Sie Zugriff direkt auf die Datenbank, die es einfacher). Und ich habe kein Risiko zu laufen, auf meinem dev PC einen code zeigen prod-Datenbank 😀
ABER ich habe KEIN Visual Studio-Erfahrung, also ich bin nicht sicher, dass Sie anwenden können, etwas ähnliches wie in deinem Fall, aber ich hoffe, es kann Ihnen einige Ideen.
Haben Sie sich überlegt mit einem deployment-management-tool zu umgehen? Ich habe gearbeitet, auf dem operation team für die Bereitstellung eines Produkts, das hat etwa 10 verschiedene Systeme, die Anforderungen zu sprechen zu jedem anderen, so dass ich wirklich verstehen Ihre situation. Die Bereitstellung der gesamten Lösung dauerte etwa 4 Stunden manuelle Schritte + 2 Stunden des testens. Wir haben uns entschieden, Octopus Deploy (https://octopus.com) zur Automatisierung des deployment-Prozesses. Dieses tool kann die Variablenersetzung in config-Dateien, und Sie können Variablen definieren pro Umwelt (und vieles mehr...) Die Bereitstellung der gesamten Lösung jetzt aufwachen etwa 15 Minuten und das Ergebnis ist immer gut... Sie können auch trigger-release-Erstellung und Bereitstellung von direkt form TFS und VSTS, Jenkins oder TeamCity, so dass Sie haben könnte eine sehr solide CI/CD-Ansatz.
Hoffe, das hilft.