Wir haben eine E-Commerce-App, die wir in unserem Unternehmen entwickeln. Es ist eine recht normale LAMP-Anwendung, die wir seit ungefähr 3 Jahren ein- und ausschalten. Wir entwickeln die Anwendung auf einer Testdomäne, fügen hier neue Funktionen hinzu und beheben Fehler usw. Unsere Fehlerverfolgung und Funktionsentwicklung werden alle in einer gehosteten Subversion-Lösung (unfuddle.com) verwaltet. Wenn Fehler gemeldet werden, nehmen wir diese Korrekturen in der Testdomäne vor und schreiben dann Änderungen an svn fest, wenn wir zufrieden sind, dass der Fehler behoben wurde. Wir folgen demselben Verfahren mit der Hinzufügung neuer Funktionen.
Es lohnt sich, auf die allgemeine Architektur unseres Systems und unserer Anwendung auf allen Servern hinzuweisen. Jedes Mal, wenn eine neue Funktion entwickelt wird, wird dieses Update mit unserer Anwendung (immer ein von uns gesteuerter Server) auf alle Sites verteilt. Jede Site, die unser System verwendet, verwendet für 95% der Codebasis im Wesentlichen genau dieselben Dateien. Wir haben eine Reihe von Ordnern innerhalb jeder Site, die auf diese Site zugeschnittene Dateien enthalten - CSS-Dateien / Bilder usw. Abgesehen davon werden die Unterschiede zwischen den einzelnen Sites durch verschiedene Konfigurationseinstellungen innerhalb der jeweiligen Site-Datenbank definiert.
Dies führt zur eigentlichen Bereitstellung. Wenn wir bereit sind, ein Update irgendeiner Art herauszubringen, führen wir einen Befehl auf dem Server aus, auf dem sich die Testsite befindet. Dies führt einen Kopierbefehl aus (cp -fru / testsite / / othersite /) und durchläuft jede vhost-Force, die die Dateien basierend auf dem Änderungsdatum aktualisiert. Jeder zusätzliche Server, auf dem wir hosten, verfügt über einen vhost, mit dem wir die Produktionscodebasis synchronisieren. Anschließend wiederholen wir den Kopiervorgang auf allen Sites auf diesem Server. Während dieses Vorgangs verschieben wir die Dateien, die nicht überschrieben werden sollen, zurück, wenn der Kopiervorgang abgeschlossen ist. Unser Rollout-Skript führt eine Reihe anderer Funktionen aus, z. B. das Anwenden von SQL-Befehlen zum Ändern jeder Datenbank, das Hinzufügen von Feldern / neuen Tabellen usw.
Wir haben zunehmend Bedenken, dass unser Prozess nicht stabil genug, nicht fehlertolerant und auch ein bisschen brachial ist. Wir sind uns auch bewusst, dass wir Subversion nicht optimal nutzen, da wir eine Position haben, in der die Arbeit an einer neuen Funktion verhindern würde, dass wir eine wichtige Fehlerbehebung einführen, da wir keine Verzweigungen oder Tags verwenden. Es scheint auch falsch, dass wir so viele Replikationen von Dateien auf unseren Servern haben. Wir sind auch nicht in der Lage, ein Rollback für das, was wir gerade eingeführt haben, durchzuführen. Wir führen vor jedem Rollout einen Diff durch, damit wir eine Liste der Dateien erhalten, die geändert werden, damit wir wissen, was danach geändert wurde, aber der Vorgang zum Rollback weiterhin problematisch ist. In Bezug auf die Datenbank habe ich angefangen, dbdeploy als mögliche Lösung in Betracht zu ziehen. Wir möchten jedoch eine allgemeine Anleitung, wie wir die Dateiverwaltung und -bereitstellung verbessern können. Idealerweise möchten wir, dass die Dateiverwaltung enger mit unserem Repository verknüpft ist, damit ein Rollout / Rollback stärker mit svn verbunden ist. So etwas wie die Verwendung des Befehls export, um sicherzustellen, dass die Site-Dateien mit den Repo-Dateien identisch sind. Es wäre jedoch auch gut, wenn die Lösung möglicherweise auch die Dateireplikation auf unseren Servern stoppen würde.
Wenn wir unsere derzeitigen Methoden ignorieren, wäre es wirklich gut zu hören, wie andere Leute sich dem gleichen Problem nähern.
zusammenfassen ...
- Wie lassen sich Dateien auf mehreren Servern am besten mit svn synchronisieren?
- Wie sollen wir die Dateireplikation verhindern? Symlinks / noch etwas?
- Wie sollten wir unser Repo strukturieren, damit wir neue Funktionen entwickeln und alte reparieren können?
- Wie sollen wir Rollouts / Rollbacks auslösen?
Danke im Voraus
BEARBEITEN:
Ich habe in letzter Zeit eine Menge guter Dinge über die Verwendung von Phing und Capistrano für diese Art von Aufgaben gelesen . Kann jemand weitere Informationen über sie geben und wie gut sie für diese Art von Aufgabe sein würden?