Как использовать транзакции в пользовательских задачах Capistrano? - PullRequest
2 голосов
/ 13 декабря 2010

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

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

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

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 не работает?

Ответы [ 2 ]

4 голосов
/ 17 декабря 2010

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

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
3 голосов
/ 17 декабря 2010

Глядя на пример

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  
...