Capistrano插件,以防止在运行时进行部署

时间:2014-10-13 14:58:56

标签: ruby capistrano

我的团队正在使用越来越多的capistrano。 我们为不同的环境(升级和生产)进行了很多斗争,我们正在寻找一种方法来阻止某人使用capistrano进行部署,因为部署已经在运行(几天前发生在我们身上)。

capistrano v2中是否有这样的功能插件,还是应该根据锁/标志文件详细说明?

1 个答案:

答案 0 :(得分:1)

Capistrano有各种各样的钩子,你可以用它们在capistrano配方的执行路径的确定阶段注入你的代码。我假设你想要防止第一台机器已经运行时在SAME机器上进行另一次部署。如果他们在不同的机器上,我希望你有任何问题!

如上所述,一个简单的方法是锁定/标记文件:

您可以定义前后钩子,如下所示:

before "deploy:update_code", "any_namespace:acquire_lock" 
after "deploy:create_symlink", "any_namespace:release_lock" 

并且您应该在deploy.rb本身中定义这两个任务:

namespace :any_namespace do
 desc "attempts to acquire lock if available or exits"
 task :acquire_lock do
   present = capture("test -f /path/to/some/fixed/dir/deploy_lock  &&  echo \"yes\" || echo \"no\" ")
   if present == "yes"
       #means someone is already deploying on the same machine
       puts "someone is already deploying on the same machine."
       exit
   else
       #its safe to deploy, lets acquire the lock
       run 'touch /path/to/some/fixed/dir/deploy_lock'
       puts "Lock acquired successfully"
   end

 end

 desc "releases the acquire lock so others can deploy"
 task :release_lock do
   run("rm /path/to/some/fixed/dir/deploy_lock")
   puts "Released Lock successfully"
 end
end

请注意,capistrano中有各种钩子,可能更紧凑,更有用。例如:启动和完成挂钩。我不确定它们是否完美无缺,但您可以检查它们并根据需要使用合适的钩子。

希望有所帮助:)