【问题标题】:How do you do a rolling deploy with capistrano?您如何使用 capistrano 进行滚动部署?
【发布时间】:2012-09-11 02:44:27
【问题描述】:

我们在负载均衡器后面有 2 个实例,与乘客运行相同的 rails 应用程序。当我们部署时,服务器启动时间会导致请求超时。因此,我们有一个脚本,该脚本通过从 LB 中取出一个 Web 服务器来单独更新每个 Web 服务器,使用 cap 进行部署,测试动态页面加载,然后将其放回 LB。

我们怎样才能让 capistrano 用一个命令为我们做这件事?我已经能够将其设置为同时部署到所有实例,但它们都同时重新启动并导致站点在 20 秒内不可用。

我在这里缺少什么?看起来这应该是一种常见的模式。

【问题讨论】:

  • 你能在“所有重启同时”的注释中添加更多细节吗?你到底是什么意思?

标签: ruby-on-rails deployment amazon-ec2 capistrano load-balancing


【解决方案1】:

在 capistrano 中序列化部署实际上并不是那么简单,它喜欢在服务器之间并行化其所有操作。重申一下这个问题,您似乎有几台服务器,并且希望按顺序使每台服务器脱机以更新部署。

诀窍是在部署配置中覆盖 deploy:create_symlink 任务:

def perform_task_offline options
  sudo "take_this_server_offline", options
  yield
  sudo "put_this_server_online", options
end

def create_symlink_task options
  # does what your existing deploy:create_symlink did, something like:
  run "rm -f /web/current && ln -s #{release_path} /web/current", options
end

namespace :deploy do

  task :create_symlink, {once: true, except: {no_release: true}} do
    deployed_servers = Array.new

    roles[:app].servers.each do |current_server|
      options = {hosts: current_server}
      deployed_servers.push current_server
      perform_task_offline(options) { create_symlink_task options }
    end
  end
end

在这种情况下,perform_task_offline 包括在options 中指定的服务器上执行的命令,这些命令将其从负载均衡器中删除,而yields 包括创建部署符号链接的create_symlink_task 的块。

然后您应该能够运行标准的cap 命令进行部署,您会看到服务器依次离线,创建“当前”符号链接,然后重新启动。

请注意,上面的代码使用deployed_servers 跟踪已成功部署到的服务器。如果您希望能够仅在先前已部署到的服务器上回滚活动失败的部署(即,失败发生在部署本身期间),您将需要一个类似的循环on_rollback do 块,但仅限于 deployed_servers

【讨论】:

    猜你喜欢
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2014-01-08
    • 2016-03-29
    • 2012-10-03
    相关资源
    最近更新 更多