如何有条件地覆盖Capistrano的部署:迁移任务?

时间:2015-09-02 13:10:33

标签: ruby-on-rails capistrano3

我想有条件地覆盖deploy:migrate,以便我们可以手动运行某些迁移。

以下是config/deploy/tasks/deploy.rake中的内容:

namespace :deploy do
  if ENV['DB_MIGRATE'] == 'skip'
    desc "Override Capistrano's default behavior, do not migrate on deploy"
    task :migrate do
      raise 'BOO!'
    end
  end
end

这是我在运行DB_MIGRATE=skip cap staging deploy:migrate时看到的内容:

INFO [deploy:migrate] Run `rake db:migrate`
DEBUG [c0ed2f81] Running /usr/bin/env if test ! -d /path/current; then echo "Directory does not exist '/path/current'" 1>&2; false; fi as deploy@host.
DEBUG [c0ed2f81] Command: if test ! -d /path/current; then echo "Directory does not exist '/path/current'" 1>&2; false; fi
DEBUG [c0ed2f81] Finished in 1.061 seconds with exit status 0 (successful).
INFO [2f3a4cc7] Running bundle exec rake db:migrate as deploy@host.
DEBUG [2f3a4cc7] Command: cd /path/current && ( RAILS_ENV="staging" bundle exec rake db:migrate )
INFO [2f3a4cc7] Finished in 6.518 seconds with exit status 0 (successful).
(Backtrace restricted to imported tasks)
cap aborted!
BOO!

Tasks: TOP => deploy:migrate
(See full trace by running task with --trace)

从输出结果来看,似乎Capistrano正在做它总是做的事情,然后,做了我要求它做的事情(提出异常)。

如何完全摆脱Capistrano的默认deploy:migrate

4 个答案:

答案 0 :(得分:2)

我通过在capistrano/rails/migrations中有条件地要求Capfile来解决这个问题,即

# Migrations can be skipped by setting up local 'SKIP_MIGRATIONS' variable, i.e.
# SKIP_MIGRATIONS=true bundle exec cap production deploy
unless ENV['SKIP_MIGRATIONS']
  require 'capistrano/rails/migrations'
end

答案 1 :(得分:1)

根据我的经验,我会说它正在查看遥控器上的环境变量,而不是本地的。调用cap staging deploy会将远程环境var设置为RAILS_ENV = staging。但是,因为这意味着登录遥控器并设置var,所以它很容易使用capistrano。

更好的方法是使用capistrano条件:https://github.com/deviantech/capistrano-conditional

其README声明:

  

从Capistrano 2到Capistrano 3的一个重大变化是任务定义现在是附加的,因此定义新任务不会覆盖现有定义。

答案 2 :(得分:0)

文档中有一章Overriding Capistrano Tasks解释了整个过程:

  

在Capistrano v2中重新定义任务时,原始任务被替换。构建Capistrano v3的Rake DSL是附加的,但是[...]

     

但也可以完全清除任务,然后从头开始重新定义。

这正是我所需要的。

答案 3 :(得分:0)

在此处扩展已接受的答案,这将OP和链接的文档整合到一个完整的解决方案中:

{{1}}