我们使用capistrano进行部署。我们的网站包含一个rails前端和java API后端。
我的情况是java API应用程序启动大约需要15分钟,如果没有它,rails应用程序就无法运行。最初我尝试使用capture命令在capistrano中循环,等待应用程序开始侦听端口(在我们的例子中为8080):
desc "Start api"
task :api, :roles => :api do
run("cd #{home_api} && ./api.sh start > /dev/null 2>&1 &")
sleep 1
api_status = nil
until api_status
api_status = capture("echo `netstat -tln | grep 8080`")
sleep 60
end
puts "API Started successfully."
end
但是,capture only runs on one server(我们有几台API机器),如果那台机器在其他API机器完成之前完成,则可以在所有API机器准备好之前继续部署。
在继续之前,我需要一些等待在所有匹配指定角色的服务器上打开端口的东西。
答案 0 :(得分:4)
以下是我目前正在做的事情:
使用'run'执行一些shell命令,这些命令在端口打开之前不会返回(或者在这种情况下已经过了30分钟。)这将在所有匹配的服务器上运行,并且不会继续,直到所有他们已经完成了。
desc "Start api"
task :api, :roles => :api do
run("cd #{home_api} && ./api.sh start > /dev/null 2>&1 &")
sleep 1
run("for i in {0..60}; do echo \"Waiting for API to start\"; if [[ \"\" != \"$\(netstat -an |grep 8080\)\" ]]; then break; fi; sleep 30; done")
end
我很想知道其他人是如何做到这一点的,肯定有更好的方法吗?