Ruby on rails 可以将Heroku配置为执行真正的无缝部署吗?

Ruby on rails 可以将Heroku配置为执行真正的无缝部署吗?,ruby-on-rails,heroku,continuous-integration,Ruby On Rails,Heroku,Continuous Integration,我们的团队最近对持续部署非常感兴趣,但在如何在Heroku上实际部署代码方面,我们遇到了一点障碍-似乎不可避免地需要一些停机时间才能将代码推送到Heroku 在传统环境中,代码部署可能如下所示: 将代码推送到某个临时目录(旧代码仍然有效) 对数据库运行迁移(通常情况下,事先运行迁移更安全,并且可以防止少数会破坏代码的迁移) 从负载平衡器中取出一半(或一定百分比的服务器) 将代码部署到这些服务器 如果可能,运行某种自动冒烟测试/测试服务器,使其处于“热”状态 切换负载平衡器中的服务器和负载平衡器中

我们的团队最近对持续部署非常感兴趣,但在如何在Heroku上实际部署代码方面,我们遇到了一点障碍-似乎不可避免地需要一些停机时间才能将代码推送到Heroku

在传统环境中,代码部署可能如下所示:

  • 将代码推送到某个临时目录(旧代码仍然有效)
  • 对数据库运行迁移(通常情况下,事先运行迁移更安全,并且可以防止少数会破坏代码的迁移)
  • 从负载平衡器中取出一半(或一定百分比的服务器)
  • 将代码部署到这些服务器
  • 如果可能,运行某种自动冒烟测试/测试服务器,使其处于“热”状态
  • 切换负载平衡器中的服务器和负载平衡器中的服务器
  • 冲洗并重复
  • 对于Heroku,我几乎无法控制两个关键步骤:

    • 我不能先运行数据库迁移。我考虑过的一种解决方法是将数据库迁移分开进行,并首先将它们推到heroku—这虽然很痛苦,但会解决问题—但只会加剧
    • Dyno启动时间可能需要相当长的时间——显然,这更多是Rails的错,而不是Heroku的错,但关键问题是,我不能像上面的负载平衡器洗牌那样,在新部署的服务器放回负载平衡器之前,确保我的应用程序已经准备就绪并加载。相反,我几乎别无选择,只能给用户一个10-15秒的加载屏幕,并希望得到最好的结果(如果我使用上面的数据库部署策略,我会这样做两次)
    我们目前确实使用维护屏幕,但如果我们转向完全连续部署,它将不是一个可扩展的解决方案(我们可能每天有10-20次部署,10-20*30秒的维护屏幕开始累积)


    有人遇到过类似的问题吗?你是怎么称呼他们的?在heroku上进行真正的连续部署有什么好的案例研究/成功案例吗?

    在heroku上,我们将在重启时向您的dyno发布SIGTERM。短时间后,如果进程不停止,它们将被杀死。这将允许您在不运行迁移时有足够的宽限时间进行无缝重启

    您始终可以将代码推送到指向生产数据库的登台应用程序,并从那里运行迁移。Pedro写了一篇关于运行零停机迁移的不错的博文,这应该也会有所帮助:


    希望这能有所帮助。

    关于dynos的启动时间,Heroku有一个测试版功能来解决这一问题:

    它基本上是先引导你的新动态,等待一段时间,切换流量,然后才杀死旧的动态。在部署期间,我的应用程序的性能有了显著提高。你可以在这里阅读:


    谢谢!我认为这对于数据库方面有很多很好的策略——尽管还没有启动时间,但这是朝着正确方向迈出的一大步。关于你的第一点,我不确定这有多大帮助-在dyno spin up期间,总会有用户访问该网站,他们会看到很长的等待时间,除非我错过了一些东西。这看起来非常适合我们!谢谢你让我知道!我正在www.versioneye.com的制作中使用此功能,它工作得非常完美。有一些想法值得注意。它不是大型数据库迁移的解决方案。但对于推出db更改较少的功能来说,这是完美的。我喜欢它。