2010-12-13 3 views
2

Я пишу пользовательскую задачу capistrano, чтобы минимизировать мои javascripts и хочу обработать случай, когда минимизация завершилась неудачей, отбросив развертывание.Как использовать транзакции в рамках собственных задач capistrano?

Я прошел через документацию и подумал, что я понял, как это сделать, но это не работает для меня.

Вот что у меня есть:

desc 'Minify all javascript files' 
task :bundle, :roles => :app, :except => { :no_release => true } do 
    on_rollback do 
    run "rm #{current_path}/public/javascripts/all.js" 
    puts "ROLLBACK" 
    end 

    transaction do 
    run "cd #{current_path}; RAILS_ROOT=#{current_path} rake bundle:js" 
    end 
end 

after 'deploy:update', 'deploy:bundle' 

Когда я бегу cap staging deploy:bundle и установить его на неудачу, я получаю следующий результат:

triggering start callbacks for `staging' 
    * executing `staging' 
    triggering start callbacks for `deploy:bundle' 
    * executing `multistage:ensure' 
    * executing `deploy:bundle' 
** transaction: start 
    * executing "cd /path/to/app/current; RAILS_ROOT=/path/to/app/current rake bundle:js" 
    servers: ["example.com"] 
    [example.com] executing command 
*** [err :: example.com] rake aborted! 
*** [err :: example.com] invalid byte sequence in US-ASCII 
# Trace here - removed for brevity 
    command finished 
failed: "sh -c 'cd /path/to/app/current; RAILS_ROOT=/path/to/app/current rake bundle:js'" on example.com 

Так является в сделке, но мой on_rollback крючок не запускается. Кажется, он знает, что задача не удалась, поскольку она выводит failed в конце - даже если я не создал исключение.

Любые идеи относительно того, почему мой on_rollback не работает?

ответ

3

Глядя на example

task :deploy do 
    transaction do 
    update_code 
    symlink 
    end 
end 

task :update_code do 
    on_rollback { run "rm -rf #{release_path}" } 
    source.checkout(release_path) 
end 
... 

Интересно, если on_rollback вызов не должен идти внутри блока транзакции, как

transaction do 
    on_rollback do 
     run "rm #{current_path}/public/javascripts/all.js" 
     puts "ROLLBACK" 
    end 
    run "cd #{current_path}; RAILS_ROOT=#{current_path} rake bundle:js" 
    end 
+0

on_rollback не будет работать за пределами сделки – Rob

+0

Это еще случай для Capistrano 3? –

4

@bgates правильно, откат должен быть в пределах сделка. Вот пример одного из моих рецептов апача:

task :update_and_test_config, :roles => [:app, :search] do 
    transaction do 
    on_rollback do 
     apache.link_previous_config 
     deploy.rollback.revision 
     apache.restart 
     deploy.rollback.cleanup 
    end 
    apache.render_config 
    apache.link_config 
    apache.configtest 
    end 
end 
+0

Спасибо за пример использования – nfm

Смежные вопросы