2015-09-02 78 views
0

我想有条件地覆盖deploy:migrate,以便我们可以手动运行某些迁移。如何有条件地覆盖Capistrano的部署:迁移任务?

下面是我在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 [email protected] 
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 [email protected] 
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

回答

0

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

当重新定义在Capistrano的V2任务,原有的任务被替换。 Capistrano v3构建的Rake DSL具有可加性但是[012]

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

这正是我所需要的。

1

根据我的经验,我会说它正在查看远程环境变量,而不是本地环境变量。调用cap staging deploy会在远程设置一个环境变量RAILS_ENV = staging。但是,由于这意味着登录到远程并设置var,它将带走使用capistrano的难易。

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

其自述状态:

从Capistrano的2至Capistrano的3一个重大变化是,现在的任务定义是累加的,所以定义新任务不会覆盖现有的定义。

+0

我使用条件来定义任务,而任务定义只发生在本地。但是感谢链接,这让我走上了正轨! – awendt

+0

capistrano-conditional提供了一种将“如果资产已更改”这样的条件添加到任务中的方法,所以它不是我所期望的。 – awendt

0

扩展在这里接受的答案,这个汇集了OP和链接文档,完整的解决方案:

if ENV['DB_MIGRATE'] == 'skip' 
    Rake::Task["deploy:migrate"].clear_actions 
    namespace :deploy do 
    desc "Override Capistrano's default behavior, do not migrate on deploy" 
    task :migrate do 
     puts 'BOO!' 
    end 
    end 
end 
1

我解决了这个通过有条件地要求在Capfilecapistrano/rails/migrations,即

# 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 
相关问题