2013-12-16 19 views

回答

2

您必須將deploy:cold定義爲基本上正常部署任務的副本,但使用deploy:db_load_schema而不是deploy:migrations。例如:

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 

它甚至可能會更好獨立運行deploy:db_schema_load任務,如包含在默認deploy的任務可能會隨時間而改變。

我實際使用db:setup新鮮展開時,因爲創建表後,種子數據庫:

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

謝謝您的建議;它讓我更加滿意自己的本能,重新部署:寒冷是要走的路。我在你的下面發佈了我自己的版本。 – odigity

2

我也相信新的Capistrano的,並嘗試使用它首次部署Rails應用程序到使用Puppet配置的生產服務器。

我終於不得不深入Capistrano來源(和capistrano/bundler和capistrano/rails,甚至sshkit和net-ssh來調試認證問題),以確定如何做所有事情,然後我才知道自己決定自己什麼我想做的改變。我剛拍完這些變化,我很高興的結果:

# 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 

部署:寒冷的任務只是鉤我的自定義部署:inidb任務部署之前運行:遷移。這樣模式和種子就會被加載,並且隨後的deploy:migrate步驟不會(安全地)執行任何操作,因爲沒有新的遷移可以運行。爲了安全起見,我測試了一下,如果在運行deploy的情況下加載模式之前,schema_migrations表是否已經存在,那麼再次運行deploy:cold。

注意:我選擇使用Puppet創建數據庫,這樣我就可以避免必須將CREATEDB權限授予我的生產postgresql用戶,但是如果您希望Capistrano執行該操作,只需添加「execute:rake」,db:create '「在db:schema:load之前,或者用'db:setup'替換全部三行。

+0

我不知道他們爲什麼移除了部署:在Capistrano 3中感冒 - 它對我來說似乎仍然是正確的方法。但是我很高興它促使我根據自己的需要定製自己的版本,我很高興現在能夠理解系統的內部工作原理以及我的工作。 – odigity

+0

什麼是'portal_production'? –

+0

我的生產數據庫的名稱。 – odigity

相關問題