2015-09-02 156 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 
相關問題