2013-12-16 2 views
8

Ich möchte db:migrate anstelle von db:migrate auf der ersten Bereitstellung meiner Schienen App ausführen.So führen Sie Schema: laden auf der ersten capistrano 3 deploy meiner Schienen App

Dies war früher ziemlich trivial, wie gesehen in this stack overflow question, aber in Capistrano 3, haben sie die deploy:cold Aufgabe veraltet. Die erstmalige Bereitstellung unterscheidet sich nicht von allen nachfolgenden Bereitstellungen.

Irgendwelche Vorschläge? Vielen Dank!

Antwort

2

Sie müssen deploy:cold als im Grunde ein Duplikat der normalen Bereitstellung Aufgabe definieren, aber mit deploy:db_load_schema anstelle von . Zum Beispiel:

desc 'Deploy app for first time' 
task :cold do 
    invoke 'deploy:starting' 
    invoke 'deploy:started' 
    invoke 'deploy:updating' 
    invoke 'bundler:install' 
    invoke 'deploy:db_load_schema' # This replaces deploy:migrations 
    invoke 'deploy:compile_assets' 
    invoke 'deploy:normalize_assets' 
    invoke 'deploy:publishing' 
    invoke 'deploy:published' 
    invoke 'deploy:finishing' 
    invoke 'deploy:finished' 
end 

desc 'Setup database' 
task :db_load_schema do 
    on roles(:db) do 
    within release_path do 
     with rails_env: (fetch(:rails_env) || fetch(:stage)) do 
     execute :rake, 'db:schema:load' 
     end 
    end 
    end 
end 

Es könnte noch besser sein, die deploy:db_schema_load Aufgabe unabhängig laufen, da die in dem Standard enthielten Aufgaben deploy könnten im Laufe der Zeit ändern.

ich eigentlich mit db:setup für frische entfaltet, weil es Samt die Datenbank nach dem Erstellen von Tabellen:

desc 'Setup database' 
task :db_setup do 
    ... 
     execute :rake, 'db:setup' 
    ... 
end 
+0

Vielen Dank für den Vorschlag; Es erleichterte mich mit meinem eigenen Instinkt, dass ich mich neu entfalten musste: kalt war der Weg. Ich habe meine eigene Version unter deiner gepostet. – odigity

2

Auch ich bin neu in Capistrano, und versuche, es zum ersten Mal zu verwenden, um eine Rails-Anwendung zu implementieren zu Produktionsservern, die ich mit Puppet konfiguriert habe.

Ich musste endlich in die Capistrano-Quelle (und capistrano/bundler und capistrano/rails, und sogar sshkit und net-ssh, um auth-Probleme zu debuggen) graben, um genau zu bestimmen, wie alles funktioniert, bevor ich mich für mich entschied Änderungen, die ich machen wollte. Ich habe gerade diese Änderungen vorgenommen hat, und ich bin zufrieden mit den Ergebnissen:

# lib/capistrano/tasks/cold.rake 
namespace :deploy do 

    desc "deploy app for the first time (expects pre-created but empty DB)" 
    task :cold do 
    before 'deploy:migrate', 'deploy:initdb' 
    invoke 'deploy' 
    end 

    desc "initialize a brand-new database (db:schema:load, db:seed)" 
    task :initdb do 
    on primary :web do |host| 
     within release_path do 
     if test(:psql, 'portal_production -c "SELECT table_name FROM information_schema.tables WHERE table_schema=\'public\' AND table_type=\'BASE TABLE\';"|grep schema_migrations') 
      puts '*** THE PRODUCTION DATABASE IS ALREADY INITIALIZED, YOU IDIOT! ***' 
     else 
      execute :rake, 'db:schema:load' 
      execute :rake, 'db:seed' 
     end 
     end 
    end 
    end 

end 

Die deploy: kalt Aufgabe nur Haken meiner benutzerdefinierten deploy: inidb Aufgabe vor deploy auszuführen: wandern. Auf diese Weise werden das Schema und die Startwerte geladen, und der folgende Schritt deploy: migrate führt nichts (sicher) aus, da keine neuen Migrationen ausgeführt werden müssen. Aus Sicherheitsgründen prüfe ich, ob die Tabelle schema_migrations vor dem Laden des Schemas bereits existiert, falls Sie deploy: cold erneut ausführen.

Hinweis: Ich habe die Datenbank mithilfe von Puppet erstellt, sodass ich die Berechtigung CREATEDB nicht meinem postgresql-Benutzer erteilen kann, aber wenn Capistrano dies tun soll, fügen Sie einfach "execute: rake, 'db: create" hinzu '"vor der db: schema: laden, oder alle drei Zeilen durch' db: setup 'ersetzen.

+0

Ich weiß nicht, warum sie deployed: kalt in Capistrano 3 - es scheint immer noch der richtige Ansatz für mich. Aber ich bin froh, dass es mich dazu gebracht hat, meine eigene Version nach meinen Bedürfnissen zu gestalten, und ich bin froh, dass ich jetzt genauso gut das Innenleben des Systems verstehe wie ich. – odigity

+0

Was ist portal_production? –

+0

Der Name meiner Produktionsdatenbank. – odigity

Verwandte Themen