【问题标题】:Safe way to upgrade Ruby versions and gemsets in Rails applications在 Rails 应用程序中升级 Ruby 版本和 gemset 的安全方法
【发布时间】:2015-05-01 15:50:04
【问题描述】:

我想在我们当前运行的生产网站上升级我们的 Ruby 版本和一堆 gem。我们使用 RVM 来管理我们的 Ruby 版本和 gemset。

我知道如何使用 RVM 安装新的 Ruby 版本并在 gemset 中安装 gem。我也明白,如果我运行 bundle install,它会将我的 gem 安装到我正在运行命令的 Ruby 版本中。

有没有办法预先创建一个包含 gemset 的 Ruby 版本,然后交换我的生产站点以使用这个新的 Ruby 版本和 gemset?我知道这可以手动完成,但无论如何可以用 gemfile 来完成吗?

【问题讨论】:

  • rvm + git + bundler + capistrano = 版本迁移没有问题
  • 我已经在使用 rvm、git 和 bundler,据我了解 capistrano 用于部署过程。我感兴趣的是如何。我有一个正在运行的实时站点,我如何创建一个新的 ruby​​ 版本和 gemset,然后切换它。有时我会遇到捆绑安装问题,这可能会非常伤脑筋。更改 ruby​​ 版本和全新的 gemset 对我们来说是一件大事,我希望最大限度地减少停机时间和风险。预安装版本和 gemsets 然后切换到那个感觉比只运行 bundle install 更安全。就是我的感受。
  • gemgets 已被弃用,而是使用bundler。如果您使用捆绑程序,您可以简单地切换任何您想要的 gem 版本。只需确保您的应用在本地适用于新的 gem 版本
  • 如果我切换版本、进行捆绑安装,然后重新启动服务器,我的服务器会继续正常运行吗?您可以向我指出您在使用 bundler 谈论什么的任何文档?
  • 如果您的应用程序在本地运行良好,那么在生产上也可以使用

标签: ruby-on-rails ruby ruby-on-rails-4 rvm


【解决方案1】:

是的,您可以在 Gemfile 中指定 Ruby 版本:

source 'https://rubygems.org'
ruby '2.1.3'

例如,这允许您设置部署到 Heroku 时使用的版本。你的问题没有详细说明你的生产环境,所以不清楚它是否可以使用 Gemfile 中的 Ruby 版本。

在本地,应用程序将针对 RVM 激活的任何 Ruby 版本运行。知道它是否有效的唯一方法是针对新的 Ruby 版本运行规范。您的问题没有提到规格,但如果您有一套完整的规格,那么这是确定新 Ruby 版本是否可以工作的正确方法。

【讨论】:

  • 在我的本地环境中进行设置和测试一切都很容易。我的问题更多的是,假设我更新我的 gemfile 并运行 bundle install 并且它失败(在产品上),这对我当前在产品上运行的站点有何影响。注意我现在在 prod 上运行 bundle install ,其中 bundle install 可能会失败,因为 gems 需要某些可能在我的本地而不是在生产环境中的软件。此故障会影响我当前运行的站点吗?我的 gemfile 的设置与您在答案中的设置一样。有没有办法确保捆绑安装通过然后让我的产品站点指向那个新的 gemset?
  • 我不明白。您的问题似乎围绕“宝石需要某些软件”,但这应该很容易处理。我能想到的唯一“特定软件”是 RMagick、Postgres 和 Mongo。 Postgres 和 Mongo 无论如何都不应该在生产环境中使用,因为它们应该是单独的服务。我想最好的办法是创建生产环境的副本并部署到它,然后查看应用程序是否启动。如果您进行了测试并且应用程序启动了,那么它应该没问题。
【解决方案2】:

您可以整天安装新版本的 Ruby 和 gem 集,而不会影响正在运行的应用程序。一旦应用程序运行,它会一直在同一版本的 Ruby 下运行。

只要不删除应用程序所需的 Ruby 版本,您就可以让 RVM 安装新的 Ruby、操作 gemset 等。如果二进制文件消失,如果系统需要加载已删除的内容,您的应用可能会崩溃/锁定。

【讨论】:

  • 正是我不确定的。谢谢。
【解决方案3】:

这完全取决于您的设置。我正在为乘客/阿帕奇设置进行回答。

使用Passenger 和Apache,您可以在Apache Vhost 文件中设置我的PassengerRuby,以便它使用特定版本的Ruby,我会将其设置为您当前的ruby 路径并像这样重新启动Apache:

PassengerRuby <path-to-ruby>

然后您可以安装新的 ruby​​ 版本和 gem,安装完所有内容后,您可以将 PassengerRuby 更改为新的 ruby​​ 路径并重新启动 Apache。这应该可以顺利迁移您的 Ruby 版本,因为您可以随时回退到旧的 Ruby 版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-07
    • 2020-05-27
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多