我想運行db:schema:load
代替db:migrate
在我的rails應用程序的初始部署。如何運行架構:加載最初的capistrano 3部署我的rails應用程序
這曾經是相當微不足道的,如看到in this stack overflow question,但在Capistrano 3中,他們已棄用deploy:cold
任務。初始部署與所有後續部署沒有任何區別。
有什麼建議嗎?謝謝!
我想運行db:schema:load
代替db:migrate
在我的rails應用程序的初始部署。如何運行架構:加載最初的capistrano 3部署我的rails應用程序
這曾經是相當微不足道的,如看到in this stack overflow question,但在Capistrano 3中,他們已棄用deploy:cold
任務。初始部署與所有後續部署沒有任何區別。
有什麼建議嗎?謝謝!
您必須將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
我也相信新的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'替換全部三行。
謝謝您的建議;它讓我更加滿意自己的本能,重新部署:寒冷是要走的路。我在你的下面發佈了我自己的版本。 – odigity