我以前构建过这个,但它并不完全简单。
第一步是添加一个 API,该 API 返回所部署代码的当前修订版本的 git SHA。例如,您部署 AAAA。现在您部署 BBBB 并将返回。例如,假设您添加了返回 SHA 的 api “/checks/version”。
这是一个用于实现此 API 的示例 Rails 控制器。它假定 capistrano REVISION 文件存在,并在应用程序加载时将当前版本 SHA 读入内存:
class ChecksController
VERSION = File.read(File.join(Rails.root, 'REVISION')) rescue 'UNKNOWN'
def version
render(:text => VERSION)
end
end
然后,您可以通过 API 轮询本地独角兽的 SHA,并等待它更改为新版本。
这是一个使用 Capistrano 的示例,它将正在运行的应用程序版本 SHA 与新部署的应用程序版本 SHA 进行比较:
namespace :deploy do
desc "Compare running app version to deployed app version"
task :check_release_version, :roles => :app, :except => { :no_release => true } do
timeout_at = Time.now + 60
while( Time.now < timeout_at) do
expected_version = capture("cat /data/server/current/REVISION")
running_version = capture("curl -f http://localhost:8080/checks/version; exit 0")
if expected_version.strip == running_version.strip
puts "deploy:check_release_version: OK"
break
else
puts "=[WARNING]==========================================================="
puts "= Stale Code Version"
puts "=[Expected]=========================================================="
puts expected_version
puts "=[Running]==========================================================="
puts running_version
puts "====================================================================="
Kernel.sleep(10)
end
end
end
end
您将需要调整轮询的超时/重试次数以匹配您的平均应用程序启动时间。此示例假设一个 capistrano 结构,其中 app in/data/server/current
和 port 上的本地独角兽8080
。