2013-04-22 3 views
5

Ich verwende eine Rails-App mit drei Webservern und einem Datenbankserver (einem AWS RDS-Server). Ich arbeite mit Chef Solo. Momentan setze ich "migrate true" in meinem rails_app-Rezept und "rake db: migrate" wird einmal auf jedem Webserver ausgeführt.Mit Chef, wie führe ich eine Rails-Migration nur einmal aus?

Dies ist normalerweise kein Problem, wenn die Migrationen kurz sind. (Der erste ist erfolgreich, und der zweite und der dritte werden übersprungen, da die Tabelle schema_migrations die neueste Schemaversion auflistet.) Wenn die Migration jedoch lange dauert, versuchen der zweite und der dritte Webserver eine Migration durchzuführen, bevor die erste beendet wird . Sie scheitern und Koch geht erfolglos. Beachten Sie, dass die Migration erfolgreich war (zumindest wenn ich sie ausprobiert habe), aber die allgemeine Bereitstellung der neuen Version schlägt fehl. (Wenn ich es erneut ausführen, ist alles erfolgreich, da die Migration bereits ausgeführt wurde.)

Meine Frage ist, was ist der beste/kanonische Weg, um sicherzustellen, dass die Migration nur einmal ausgeführt wird?

+0

Sie könnten diesen Podcast hören: http://foodfightshow.org/2013/01/application-deployment.html – StephenKing

Antwort

0

Möglicherweise können Sie überprüfen, ob der Inhalt der Datei db/migrate.rb geändert wurde. Wenn dies der Fall ist, dann rufen Sie migration true auf. Wenn Sie git verwenden, können Sie überprüfen

execute "git diff HEAD @ {1} HEAD db/Migration"

wenn eine Änderung vorhanden ist, dann wahr verwenden migrieren.

+0

das war nicht ganz die Frage leider .. –

0

Statt aller Knoten, die die Migration ausführen, würde ich Knotenattribute verwenden, sodass nur eine der Konvergenz die Migration ausführt.

Im 'rails_app' Rezept wäre Ihre migrate Eigenschaft;

migrate node['rails']['migrate'] 

Und dann in Ihrem Knoten Attribute JSON-Datei für den einen Knoten, den Sie es tun möchten;

"rails" : { "migrate" : true } 

und für die beiden anderen

"rails" : { "migrate" : false } 

Offensichtlich den Pfad/Namen der Attribute ändern, wie Sie für richtig halten.

0

Ich würde eine Führungsrolle für einen Ihrer drei Webserver machen und nur db: migrate für diese Rolle ausführen.

Eine andere Option wäre, den Code auch auf den dbserver zu verteilen und db: migration direkt dort auszuführen.