0

我们的 rails 应用程序(3.2.12)有两个数据库,一个内容数据库和一个用户数据库。如何覆盖部署:迁移(此处为 rakefile ),以便在“上限生产部署:冷”迁移期间相应地为它们的两个目标数据库运行。

本质上它应该在部署期间执行此操作

 ** 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’”。

4

3 回答 3

0

Task deploy:migrate doesn't run automatically anyway. You can provide your own task after deploy:update_code in which you run the two db:migrate commands for your two different databases.

For example,

namespace :my_namespace
  task :migrate do
    your db:migrate statements go here...
  end
end

after 'deploy:update_code', 'my_namespace:migrate'
于 2013-10-16T19:28:33.573 回答
0

它应该在 :primary 上吗?

或者

task :migrate, :only => { :primary => true }  

您可能还想在命名空间声明之外添加“after”行。

于 2013-10-16T18:08:14.057 回答
0

Capistrano 版本:3.6.1(Rake 版本:11.3.0)

添加这个只是为了帮助遇到同样问题的人。

  1. 首先,您需要清除迁移操作

配置/部署.rb

Rake::Task['deploy:migrate'].clear_actions
  1. 二、编写自己的迁移任务

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
  1. 调用您的迁移任务

因为 deploy:migrate 会被自动调用,所以你不需要做任何事情。

于 2016-11-01T09:12:51.603 回答