首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >capistrano on_rollback未被调用

capistrano on_rollback未被调用
EN

Stack Overflow用户
提问于 2015-01-14 13:32:35
回答 1查看 257关注 0票数 1

我使用capistrano v2作为Rails3.2,在我的deploy.rb中有一个捆绑任务,如下所示;

代码语言:javascript
复制
# Bundler tasks
namespace :bundler do
  desc "Create a symlink"
  task :create_symlink, :roles => :app do
    shared_dir = File.join(shared_path, 'bundle')
    release_dir = File.join(release_path, '.bundle')
    run("mkdir -p #{shared_dir} && ln -s #{shared_dir} #{release_dir}")
  end

  desc "Install required gems"
  task :install, :roles => :app do
    puts "New Release"
    run "cd #{release_path} && #{bundle_path} install"

    on_rollback do
      if previous_release
        puts "Rollback"
        run "cd #{previous_release} && #{bundle_path} install"
      else
        logger.important "no previous release to rollback to, rollback of bundler:install skipped"
      end
    end
  end

  desc "Run bundler on new release"
  task :bundle_new_release, :roles => :db do
    bundler.create_symlink
    bundler.install
  end
end

after "deploy:update_code", "bundler:bundle_new_release"
after "deploy:rollback:revision", "bundler:install"

当我运行cap deploy:rollback时,它不会运行on_rollback代码,它会尝试运行cd {release_path}。

我从http://kazjote.eu/2010/08/04/bundler-and-capistrano-the-right-way得到了这个例子。

EN

回答 1

Stack Overflow用户

发布于 2015-02-05 06:40:47

由于您没有提供任何日志,我不能确定deploy:rollback是否按其应有的方式部署了以前的版本,但是您将deploy:rollback (一个任务)与on_rollback (一个钩子)混淆了。

只有当task :install失败时才会调用on_rollback。然而,我也相信你需要为on_rollback钩子定义一个事务才能真正触发(并且可能必须在你的'run‘cd...’之前定义on_rollback )。

deploy:rollback应该使用之前成功的版本运行您的部署任务。

我在这里找到了一个更简单的例子:

http://pedz-bits.blogspot.com/2012/09/capistrano-errors-ensure-and-onrollback.html

代码语言:javascript
复制
namespace :fun do
  desc "Sample showing rescue, ensure, and on_rollback inside a transaction"
  task :stuff, :roles => :app do
    transaction do
        on_rollback { logger.debug "my rollback" } 
      begin
        logger.debug "main"
        # Either run or run_locally will work the same
        # run_locally "false"
        run "false"
      rescue => e
        logger.debug "rescue #{e.class}"
        raise e
      ensure
        logger.debug "ensure"
      end
    end
  end
end

Command output:

cap fun:stuff
  * executingD `fun:stuff'
 ** transaction: start
  * main
  * executingB "false"
    servers: ["condor.austin.ibm.com"]
    [condor.austin.ibm.com] executingA command
    command finished in 771ms
  * rescue Capistrano::CommandError
  * ensure
*** [fun:stuff] rolling back
  * my rollback
failed: "bash -l -c 'false'" on condor.austin.ibm.com

备注

active.

  • on_rollback还必须在transaction.

  • raise e中定义,以确保任务退出时出现错误,否则更高级别的进程将假定任务已完成并按您预期的方式工作。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27936423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档