我们的rails app(3.2.12)有两个数据库,一个内容数据库和一个用户数据库。如何覆盖deploy:migrate(rakefile here),以便在“cap production deploy:cold”期间相应地为其两个目标数据库运行迁移。
基本上它应该在部署期间执行此操作
** transaction: commit
* 2013-10-16 02:26:15 executing `deploy:migrate'
* executing "cd /home/deployer/apps/project/releases/20131015152439 && bundle exec rake RAILS_ENV=production db:migrate"
* executing "cd /home/deployer/apps/project/releases/20131015152439 && bundle exec rake RAILS_ENV=production user:db:migrate"
非常感谢任何帮助。
编辑:我确实用部署命名空间中的我自己的任务替换了该任务
namespace :deploy do
set :migration_role, fetch(:migration_role, :db)
task :migrate do
on primary fetch(:migration_role) do
within release_path do
with rails_env: fetch(:rails_env) do
execute :rake, "db:migrate"
execute :rake, "user:db:migrate"
end
end
end
end
after 'deploy:updated', 'deploy:migrate'
end
这会抛出错误“未定义的方法`primary'”。
答案 0 :(得分:0)
是否应该开启:初级?
或者
task :migrate, :only => { :primary => true }
您可能还想将“after”行添加到名称空间声明之外。
答案 1 :(得分:0)
任务deploy:migrate
无论如何都不会自动运行。您可以在deploy:update_code
之后提供自己的任务,在该命令中为两个不同的数据库运行两个db:migrate命令。
例如,
namespace :my_namespace
task :migrate do
your db:migrate statements go here...
end
end
after 'deploy:update_code', 'my_namespace:migrate'
答案 2 :(得分:0)
Capistrano版本:3.6.1(耙子版本:11.3.0)
添加此项只是为了帮助遇到同样问题的人。
配置/ deploy.rb
Rake::Task['deploy:migrate'].clear_actions
config / deploy.rb(我用过sinatra)
namespace :deploy do
desc 'migration'
task :migrate do
on roles(:app) do |host|
with rails_env: fetch(:rails_env) do
within current_path do
execute :bundle, :exec, :rake, "db:migrate RACK_ENV=#{fetch(:rails_env)}"
end
end
end
end
end
由于deploy:migrate将自动调用,因此您无需执行任何操作。