【问题标题】:How to override Capistrano's deploy:migrate如何覆盖 Capistrano 的部署:迁移
【发布时间】:2013-10-16 13:10:57
【问题描述】:

我们的 rails 应用程序 (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'”。

【问题讨论】:

  • 您可以 a) 用您自己的任务替换该任务 b) 在该任务之前或之后添加另一个任务

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


【解决方案1】:

它应该在 :primary 上吗?

或者

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

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

【讨论】:

    【解决方案2】:

    任务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'
    

    【讨论】:

    【解决方案3】:

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

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

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

    config/deploy.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 会被自动调用,所以你不需要做任何事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多