2013-04-22 11 views
5

Używam aplikacji Rails z trzema serwerami WWW i jednym serwerem bazy danych (serwer AWS RDS). Rozstawię z szefem kuchni Solo. Obecnie ustawiam "migrate true" w mojej recepturze rails_app, a "rake db: migrate" uruchamia się raz na każdym serwerze sieciowym.Z szefem kuchni, jak uruchomić migrację Railsów tylko raz?

Zwykle nie stanowi to problemu, gdy migracja jest krótka. (Pierwszy z nich kończy się sukcesem, a drugi i trzeci są pomijane, ponieważ tabela schema_migrations zawiera najnowszą wersję schematu.) Jednak gdy migracja trwa długo, drugi i trzeci serwer WWW podejmują próbę migracji przed ukończeniem pierwszej. . Zawodzą, a szef kuchni kończy bezskutecznie. Zwróć uwagę, że migracja powiodła się (przynajmniej gdy ją wypróbowałem), ale ogólne wdrożenie nowej wersji nie powiedzie się. (Jeśli uruchomię go ponownie, wszystko powiedzie się, ponieważ migracja została już uruchomiona.)

Moje pytanie brzmi, jaki jest najlepszy/kanoniczny sposób, aby migracja była przeprowadzana tylko raz?

+0

Możesz posłuchać tego podcastu: http://foodfightshow.org/2013/01/application-deployment.html – StephenKing

Odpowiedz

0

Możliwe, że możesz sprawdzić, czy zmieniła się zawartość pliku db/migrate.rb. Jeśli tak, to warunkowo wywołaj migrację true. Jeśli używasz git, można sprawdzić

execute "git różn HEAD @ {1} HEAD db/migrować"

jeśli istnieje jakakolwiek zmiana, a następnie użyć migrować prawda.

+0

To nie było całkiem pytanie, niestety .. –

0

Zamiast wszystkich węzłów przeprowadzających migrację użyłbym atrybutów węzła, tak aby tylko jedna z konwergencji przeprowadzała migrację.

W recepturze "rails_app" znajduje się właściwość migrate;

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

A następnie w pliku węzłów atrybuty json dla jednego węzła, który chcesz to zrobić;

"rails" : { "migrate" : true } 

a dla dwóch pozostałych

"rails" : { "migrate" : false } 

Oczywiście zmienić ścieżkę/nazwę atrybutów jak widać pasuje.

0

Będę odgrywać rolę lidera dla jednego z trzech serwerów WWW i uruchamiam tylko db: migrować na tę rolę.

Inną opcją byłoby wdrożenie Twojego kodu również do serwera bazy danych, a uruchomiony program db: migrate właśnie tam.