如何覆盖Capistrano的部署:迁移

时间:2013-10-16 13:10:58

标签: ruby-on-rails deployment capistrano multiple-databases

我们的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'”。

3 个答案:

答案 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)

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

  1. 首先,您需要清除迁移操作
  2. 配置/ deploy.rb

    Rake::Task['deploy:migrate'].clear_actions
    
    1. 第二次编写自己的迁移任务
    2. 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. 致电您的迁移任务
      2. 由于deploy:migrate将自动调用,因此您无需执行任何操作。