Wie erstelle ich Staging-Server für mehrere Git-Zweige?

8

Ich muss einen neuen Staging-Prozess für unsere Entwicklung und Tests erstellen.

Zu einem bestimmten Zeitpunkt werden nur etwa 4 Git-Zweige aktiv entwickelt und getestet. Innerhalb jedes Git-Zweigs müssen möglicherweise Datenbankentwicklungsskripte (Straight SQL) ausgeführt werden sowie Evolutionsskripte aus dem Backend für eine stärkere Verarbeitung (im Wesentlichen handelt es sich um HTTP-Routen, die innerhalb der App mithilfe von Administratoranmeldeinformationen aufgerufen werden müssen, die die Datenbank ausführen Migrationen und andere Änderungen, deren Skript in den oben genannten einfachen SQL-Evolutionsskripten zu schwierig / nicht möglich wäre).

Unsere Live-Datenbank hat eine mittlere Größe von ~ 4,2 GB. Wir haben einen brandneuen Dell PowerEdge-Server, der zur Einrichtung bereit ist und mir zur Verfügung steht.

Ich würde mich über Ratschläge zu folgenden Fragen freuen und wissen, wie erfahrene DevOps dies angehen würden:

  1. Wie kann ich mehrere verschiedene Zweige auf dem Staging-Server ausführen? Diese Zweige werden häufig angezeigt und verschwinden, wenn sie die Qualitätssicherung bestehen. Sie werden zum Master zusammengeführt und freigegeben.

  2. Wie würde ich das DB-Evolutionssystem einrichten, um sicherzustellen, dass es für jeden Zweig immer die richtige DB hat? Jeder Zweig kann Änderungen an der Datenbank auf unterschiedliche Weise vornehmen, die nicht unbedingt miteinander kompatibel sind, bis sie zusammengeführt werden.

  3. Wie halte ich diese Filialen auf dem neuesten Stand? Gibt es eine Möglichkeit, Commits für jeden Zweig automatisch abzurufen?

Würde mich über weitere Eingaben freuen, da ich ein bisschen verloren bin, wie ich das alles einrichten soll. Der aktuelle Workflow ist für alle Beteiligten schwierig: Entwickler haben eine vollständig isolierte lokale Kopie der App, die lokal ausgeführt wird, und QA verfügt über 3-4 rotierende Laptops, die als Staging- "Server" fungieren.

max1221
quelle
Vielleicht eine (echte) kontinuierliche Integration in Betracht ziehen - trunkbasierte Entwicklung? Der ganze verzweigte Albtraum würde einfach verschwinden, jeder wäre auf der gleichen Seite usw. Einfacher, schneller, besser.
Dan Cornilescu
Verwenden Sie ein Tool zur Datenbankversionierung oder haben Sie darüber nachgedacht? releasemanagement.org/2016/02/database-version-control-tools
mghicks

Antworten:

7

1) Wie kann ich mehrere verschiedene Zweige auf dem Staging-Server ausführen?

Docker

2) Wie würde ich das DB-Evolutionssystem einrichten, um sicherzustellen, dass es für jeden Zweig immer die richtige DB hat?

Dies hängt davon ab, wie stark Ihre Datenbank skaliert werden soll. Sie können mit Methoden zum Klonen von Datenbankdaten ziemlich verrückt werden, aber normalerweise möchten Sie eine Masterkopie, die Sie erst ändern, wenn Ihr Code für die Produktion freigegeben wird - und dabei gute Backups aufbewahren. Während Sie Infrastruktur unveränderlich und Einweg sein kann, ist Ihre Daten nicht. Sie können die Verfügbarkeit nur mit Ihren Daten emulieren . 4,2 GB sind wirklich nicht so viel zu kopieren. Sie können ein Skript erstellen, um eine neue Datenbankinstanz für jeden Build zu erzeugen, auf dem gearbeitet werden soll, und es dann verwerfen, sobald der Test abgeschlossen ist.

3) Wie halte ich diese Filialen auf dem neuesten Stand? Gibt es eine Möglichkeit, Commits für jeden Zweig automatisch abzurufen?

Sie könnten in Betracht ziehen, Git-Hooks zu verwenden, um einen Build auszulösen, eine Code-Überprüfung zu erzwingen oder einen Container zu spawnen und Ihre Datenbank zu klonen. Sie können einen API-Aufruf an ein Build-Automatisierungssystem wie Jenkins senden und / oder ein Konfigurationsverwaltungssystem wie Puppet, Chef, Salt Stack, Ansible oder etwas anderes starten. Dies wäre eher ein Auto-Pull als ein Auto-Push.

Aus dem Wortlaut Ihrer Frage geht hervor, dass Sie an eine veränderbare Infrastruktur denken, aber stattdessen unveränderliche Testbereitstellungen in Betracht ziehen .

James Shewey
quelle
2

Ich würde argumentieren, dass es hier nicht um das Staging von Servern geht. Ein Staging-Server ahmt die Produktionsumgebung genau nach und ist der Ort, an dem eine Freigabe unmittelbar vor dem Produktionsstart erfolgt. Ein Feature-Zweig, der nicht mit dem Master zusammengeführt wurde, wird nicht direkt für die Produktion freigegeben, daher sollte er nicht auf einem Staging-Server gespeichert werden.

Wenn wir die Frage auf gemeinsam genutzte Entwicklungsserver umstellen, werden Sie bei der Suche mehr Ressourcen finden. Wie Sie bemerkt haben, verursacht die gemeinsame Nutzung solcher Entwicklungsressourcen eine Reihe von Problemen. Daher ist es möglicherweise besser, sich stattdessen auf die Lösung des zugrunde liegenden Problems zu konzentrieren: Warum ist es für alle an diesem Prozess Beteiligten schwierig, einen Entwicklungsserver auf ihrem lokalen Server auszuführen? Maschine?


Jetzt ist es manchmal so, dass Sie tatsächlich diese gemeinsam genutzten Server benötigen. Wenn Sie festgestellt haben, dass Sie es wirklich tun , können Sie eine Reihe von Techniken anwenden, um den Prozess zu vereinfachen.

Wie kann ich mehrere verschiedene Zweige auf dem Staging-Server ausführen? Diese Zweige werden häufig angezeigt und verschwinden, wenn sie die Qualitätssicherung bestehen. Sie werden zum Master zusammengeführt und freigegeben.

Eine der einfachsten Möglichkeiten besteht darin, einen Teil der URL zu verwenden, um zu wechseln, welcher Codezweig ausgeführt wird (diese Änderung ist Teil dessen, warum dies keine geeignete Staging-Umgebung ist). Ich habe dies in der Vergangenheit mit einem Platzhalter-DNS (sodass jeder foo.our-dev-domain.comauf denselben Server umleiten würde) und Routing-Code getan , der /our/release/directory/fooin den Include-Pfad geladen wurde .

Sie können auch einen Befehl (mit Ansible) verwenden, der bei Bedarf die erforderliche Konfiguration für einen Zweig hinzufügt. Dies wäre wahrscheinlich Teil des Bereitstellungsprozesses, über den ich gleich sprechen werde.

Wie würde ich das DB-Evolutionssystem einrichten, um sicherzustellen, dass es für jeden Zweig immer die richtige DB hat? Jeder Zweig kann Änderungen an der Datenbank auf unterschiedliche Weise vornehmen, die nicht unbedingt miteinander kompatibel sind, bis sie zusammengeführt werden.

Am einfachsten ist es, damit zu leben und die Menschen zu kurzlebigen Zweigen zu ermutigen.

Ein anderer Ansatz besteht darin, dynamischen Routing-Code zu verwenden, um basierend auf dem Namen der Verzweigung zu separaten Kopien der Datenbank (in RDBMS-Begriffen eine "Datenbank") zu wechseln.

Wie halte ich diese Filialen auf dem neuesten Stand? Gibt es eine Möglichkeit, Commits für jeden Zweig automatisch abzurufen?

Sie können entweder drücken oder ziehen. Zum Beispiel:

  • Pull - Richten Sie einen Cron-Job ein, der alle paar Minuten einen git pull(oder wahrscheinlich einen git fetchund einen git reset --hard) Job ausführt
  • push - Richten Sie einen Webhook ein, der beim Push ausgelöst wird, und einen kleinen Webdienst auf dem Computer, der dies abhört und die Repos nach Bedarf aktualisiert
  • Push - Lassen Sie Entwickler explizit einen Bereitstellungsbefehl ausführen, um ihre Zweige auf dem Server zu aktualisieren

Sprechen Sie zuerst mit Ihren Benutzern und sammeln Sie deren Anforderungen, um zu sehen, was sie möchten (sie möchten möglicherweise nicht, dass es automatisch aktualisiert wird, während sie gerade etwas testen). Dies wird Ihre Entscheidung beeinflussen.


Aber wieder:

Entwickler haben eine vollständig isolierte lokale Kopie der App, die lokal ausgeführt wird, und QA verfügt über 3-4 rotierende Laptops, die als Staging- "Server" fungieren.

Das Problem scheint zu sein, dass die Qualitätssicherung gemeinsam genutzte Laptops dreht, anstatt nur einen bestimmten Zweig auf die gleiche Weise wie Entwickler auszuchecken.

Xiong Chiamiov
quelle
1

Dies ist das, was gitlab am besten kann. Ziehen Sie in Betracht, zu gitlab zu wechseln, einen Kube-Cluster einzurichten und automatisch bereitzustellen. Dadurch wird jeder Zweig zum Testen unter einer eindeutigen URL bereitgestellt.

Danny Goossen
quelle