Einrichten des lokalen Datenbankentwicklungsprozesses für ein kleines Webteam

14

Hintergrund

Ich arbeite daran, einen neuen Entwicklungsprozess für ein kleines Web-Team von etwa 4 Programmierern und 4 Designern zu entwickeln, mit dem offensichtlichen Potenzial, das Team in Zukunft zu vergrößern. Unser Produkt ist eine zentrale Anwendung, die Kundenwebsites unterstützt, die wir auch entwerfen und hosten.

Bisher haben wir alle über FTP auf einem Dev-Server mit einer einzigen Dev-Datenbank gearbeitet. Es hat eine Weile "funktioniert" * , aber wir bewegen uns in eine neue Richtung, also ist es Zeit, unseren Prozess zu reifen.

Wir verwenden Percona Server 5.5, dies sollte jedoch datenbankunabhängig sein, um die Kosten niedrig zu halten.

Ziele :

Ich möchte einen kontinuierlichen Integrationsprozess (Continuous Integration, CI) für die Datenbankentwicklung erstellen, wobei Folgendes zu beachten ist:

  1. Entwickler verfügen über lokale Kopien von Daten, mit denen Entwicklungscode ausgeführt werden kann
  2. Kann die Datenbankstruktur auf einen vorherigen Änderungssatz zurücksetzen
  3. Kann Änderungen an neuen Feature-Schemas von Änderungen an Schemadesign-Fixes trennen
  4. Kann die Datenbankstruktur zum Testen lokal ändern

Anfangskonzept

Ich habe unten einen Prozess mit SVN und LiquiBase skizziert, der jedoch vollständig entfernt wurde #4.

  • Erstellen Sie einen Entwicklungszweig aus dem Stamm
  • Der zentrale "Development" -DB-Server wird vom "Development" -Zweig ausgeführt
  • Lokale Entwickler sind als Slaves für den Entwicklungszweig eingerichtet (siehe #1oben).
  • Liquibase-Changesets werden regelmäßig an den Entwicklungszweig übergeben, der einen Post-Commit-Hook ausführt, um die zentrale Entwicklungsdatenbank zu aktualisieren (die auf die lokalen Computer herunterrinnt, die als Slaves für diesen Entwicklungsserver ausgeführt werden #2).
  • Wenn Features oder Schemakorrekturen für die Qualitätssicherung bereit sind, führt DBA (ich) die entsprechenden Änderungen aus dem Entwicklungszweig in Trunk zusammen. Durch diesen Vorgang wird ein SQL-Skript erstellt, das auf einen Staging-Datenbankserver angewendet wird.
  • Der Staging-Server sollte TRUNK widerspiegeln, das dieselbe Struktur wie die Produktion haben sollte, sowie Änderungen, die sich in der Qualitätssicherung befinden
  • Führen Sie nach dem Ausführen des SQL-Skripts auf dem Staging-Server eine Qualitätssicherung für die Änderungen durch.
  • Wenn alles gut aussieht, markieren Sie die Struktur. Dadurch wird das .sql-Skript generiert, das in der Produktion manuell vom DBA ausgeführt wird (für Zeiten außerhalb der Spitzenzeiten, falls erforderlich).

Dieser Prozess setzt voraus, dass alle Entwickler denselben 'Entwicklungs'-Zweig ausführen, was bedeutet, dass es zu einem bestimmten Zeitpunkt nur eine Version des Datenbankschemas gibt (nicht sicher, ob ich dies möchte).

Dies bedeutet auch, dass Änderungen am Schema nicht lokal getestet werden können und sich auf andere Entwickler auswirken können, wenn sie nicht ordnungsgemäß ausgeführt werden. In unserer Umgebung fügen Entwickler möglicherweise neue Tabellen hinzu, ändern jedoch nur selten die vorhandene Struktur. Als DBA werden Design-Korrekturen von mir vorgenommen. Aber die Unfähigkeit, Fixes lokal zu testen, ist mein größtes Problem.

Wie kann der obige Prozess optimiert werden, um lokale Entwicklung zu ermöglichen, während eine relativ aktuelle Kopie der Daten (wie durch Replikation in meinem vorgeschlagenen Prozess bereitgestellt) beibehalten wird? Ich benötige nicht einmal die letzte Woche, um die Daten aktuell zu halten.


* Mit "gearbeitet" meine ich, es hat gereicht, war aber eine PITA.

Derek Downey
quelle

Antworten:

12

Umgebungen verwalten

Ich denke, Sie möchten definitiv nicht zu einer einzigen Datenbankversion gezwungen werden. Sie haben genügend Entwickler, sodass Sie zwangsläufig über mehrere Entwicklungsarbeitsabläufe und Anforderungen verfügen, um Patches unabhängig von den Entwicklungsarbeitsabläufen auf die aktuelle Produktionsumgebung anzuwenden.

Sie können Liquibase oder einen manuellen Prozess verwenden, um Patch-Skripts zum Aktualisieren von Versionen zu erstellen. Ich empfehle, mit einem manuellen Prozess zu beginnen und das Schema-Vergleichstool für die Qualitätssicherung der Patches zu verwenden. Eine saubere, automatisierte und transparente Synchronisation einer nicht trivial komplexen Datenbank ist etwas utopisch.

Ihr zentrales Datenmodell kann in jedem beliebigen System gespeichert werden. Ich habe alles von mühsamen Enterprise-Repository-Tools verwendet, um Tabellenskripte zu erstellen. Das Erstellen von Tabellenskripten funktioniert gut mit normalen Versionsverwaltungswerkzeugen wie Subversion, und nicht alle Repository-Werkzeuge leisten gute Arbeit bei der Versionsverwaltung.

Unabhängig davon, was Sie als Stammdatenmodell-Repository verwenden, benötigen Sie einen recht sauberen Mechanismus für die Bereitstellung einer Umgebung aus diesem Modell. Es sollte so strukturiert sein, dass Rollouts in eine Umgebung einfach sind. Sie benötigen auch einen Mechanismus zum Patchen von einer veröffentlichten Version zur nächsten.

Was ich getan habe

Ich habe in der Vergangenheit Folgendes getan, als ich Entwicklungsumgebungen verwaltet habe. Es ist keine besonders hohe Technologie, aber es ist für die Versionskontrolle und automatisierte Builds geeignet, sodass es einfach ist, eine Umgebung auf eine bestimmte Version auszurollen, und es ist sehr praktisch, eine große Anzahl von Umgebungen zu verwalten.

Zentrales Repository verwalten: Dies kann eine Reihe von Skripten zur Datenbankerstellung sein, die in einem Versionskontrollsystem gespeichert sind, oder ein Repository-Modell in einem Datenmodellierungstool. Treffen Sie Ihre Wahl. Dieses Modell sollte über einen Erstellungsmechanismus verfügen, mit dem eine Umgebung aus den Skripten ohne großen manuellen Eingriff bereitgestellt werden kann.

Wenn Sie viele Referenzdaten haben, benötigen Sie einen Lademechanismus dafür. Je nachdem, wie Sie dies tun möchten, können Sie dies in einer Datenbank oder in einer Reihe von Dateien aufbewahren. Der Vorteil von Dateien ist, dass sie auch über dasselbe Versionskontrollsystem wie Ihre Codebasis versioniert und beschriftet werden können. Eine Reihe von CSV-Dateien und Massenladeskripten in einem Quellcodeverwaltungs-Repository können dies problemlos tun.

Eine Möglichkeit zum Bereitstellen von Entwicklungsumgebungen besteht darin, Sicherungen der auf die entsprechende Version gepatchten Produktionsdatenbank zu erstellen und sie für Entwickler zur Wiederherstellung in einer Entwicklungsumgebung verfügbar zu machen.

Einfacheres Rollout: Wie bei jedem CI-Erstellungsprozess sollte die Datenbank über ein einziges Skript bereitgestellt werden können. Richten Sie es so ein, dass Datenbankverbindungen parametrisiert werden können oder das Skript ortsunabhängig ist und nur über die Verbindung ausgeführt werden kann.

Patch-Skripte: Sie benötigen Rollforward- und wahrscheinlich Rollback-Skripte für jede veröffentlichte Version.

Erstellen von Testumgebungen aus dem Repository-Modell: Dadurch wird sichergestellt, dass die Entwicklung in Umgebungen, die nicht mit dem Repository synchron sind, in den Test einbezogen wird.

Testen Sie den Bereitstellungsprozess: Automatisierte Patch-Skripts, die jedoch erstellt wurden, sollten testbar sein. Schemavergleichstools sind dafür recht gut geeignet, auch wenn Sie sie nicht zum Generieren der Patch-Skripte verwenden.

  • Erstellen Sie eine Referenzumgebung mit dem von Ihnen getesteten Repository-Modellbuild

  • Erstellen Sie eine Rauchtestumgebung mit einem Backup Ihrer Produktionsversion oder einem Build, der auf der aktuell veröffentlichten Version basiert.

  • Führen Sie das Patch-Skript für die Rauchtestumgebung aus.

  • Verwenden Sie das Schema-Vergleichstool, um die Rauchtestumgebung mit der Referenzumgebung zu vergleichen. Das Patch-Skript sollte dazu führen, dass die beiden Datenbanken identisch sind, damit Sie Unterschiede untersuchen können.

Was ich an diesem Prozess mag

Dies ist ein bisschen schwergewichtig und wurde für den Einsatz in recht bürokratischen und undurchsichtigen Produktionsumgebungen entwickelt. Es hat jedoch folgende Stärken:

  • Entwickler können basteln, wo sie müssen.

  • Es können mehrere Zweige und Entwicklungsströme untergebracht werden.

  • Die Bereitstellungsskripte selbst können auf wiederholbare Weise getestet werden. Dies ist sehr hilfreich, um Deployment Bunfights zu beenden, da die Wiederholbarkeit demonstriert werden kann.

  • Die Schemavergleichstools stellen die Qualitätssicherung für die Bereitstellung selbst bereit.

  • Die Tests werden immer anhand der erwarteten Veröffentlichungen durchgeführt. Dadurch werden Probleme behoben, die sich aus nicht synchronen Umgebungen ergeben.

  • Durch die Bereitstellung basierend auf Repository-Modellen und Patch-Skripten wird nicht versehentlich unkontrollierter Müll aus Entwicklungsumgebungen in die Produktion migriert.

  • Ein Großteil des Prozesses kann automatisiert werden, obwohl es häufig wünschenswert ist, die Bereitstellungs-Patch-Skripts manuell vorzubereiten und zu testen.

  • Umgebungen sind billig und einfach zu installieren, ohne dass Sie durch die Rahmen springen müssen.

  • Entwickler sind gezwungen, ein System zu entwickeln, das sich für einen einfachen Build- und Bereitstellungsprozess eignet.

  • Entwickler sind gezwungen, grundlegende Datenbankverwaltungsaufgaben zu erlernen, aber Test- und Produktionsumgebungen sind vor Fehlern durch Unachtsamkeiten geschützt.

Wie es Ihren Anforderungen entspricht

  1. Entwickler verfügen über lokale Kopien von Daten, mit denen Entwicklungscode ausgeführt werden kann. Mithilfe

    der Bereitstellungsskripts oder DB-Images können sie eine Umgebung von jeder verfügbaren Version aus einrichten.

  2. Die Datenbankstruktur kann auf einen vorherigen Änderungssatz zurückgesetzt werden.

    Wieder sortiert nach den Bereitstellungsskripten. Entweder durch DDL oder durch Testen von Datenbank-Backup-Images, die über einen kontrollierten Prozess erstellt wurden, können Entwickler eine Umgebung mit einer bestimmten Version aufrufen, die Sie haben.

  3. Kann Änderungen an neuen Feature-Schemas von Änderungen an Schemadesign-Fixes trennen

    Patches für eine gemeinsame Version können in einem separaten Zweig im SVN-Baum verwaltet werden. Wenn Datenbanksicherungen als Referenzumgebungen verwendet werden, müssen sie an einem Ort mit der gleichen Ordnerstruktur wie die Verzweigung der Versionsverwaltungsprojekte gespeichert werden.

  4. Kann die Datenbankstruktur zum Testen lokal ändern

    Der einfache Bereitstellungsprozess ermöglicht es Entwicklern, einen lokalen Status für eine Umgebung zu erstellen oder eine Referenzumgebung aufzurufen, mit der Vergleiche durchgeführt und Änderungssätze vorgenommen werden können.

Betroffen vonTunbridgeWells
quelle