Help us learn about your current experience with the documentation. Take the survey.

Rails 升级指南

我们努力使用最新的 Rails 版本来运行 GitLab,以获得性能提升、安全更新和新功能。

Rails 升级方法

  1. 为 GitLab 准备一个 MR
  2. 为安全补丁创建补丁版本和向后移植

为 GitLab 准备一个 MR

  1. 查看 Ruby on Rails 升级指南 并为即将到来的变化做好准备。
  2. Gemfile 中更新 rails gem 版本。
  3. 运行 bundle update --conservative rails
  4. 对于主版本和次版本更新,运行 bin/rails app:update 并检查是否应该应用任何建议的更改。
  5. qa/Gemfile 中更新 activesupport 版本。
  6. qa 文件夹中运行 bundle update --conservative activesupport
  7. 运行 find gems -name Gemfile -exec bundle update --gemfile {} activesupport --patch --conservative \; 并根据需要将命令中的 --patch 替换为 --minor--major
  8. 解决任何 Bundler 冲突。
  9. 确保 @rails/ujs@rails/actioncable npm 包与 package.json 中的新 rails 版本匹配。
  10. 更新后运行 yarn patch-package @rails/ujs 以确保我们的本地补丁文件版本匹配。
  11. 创建一个带有 pipeline:run-all-rspec 标签的 MR,看看是否会破坏流水线。
  12. 要解决和调试测试失败,请使用 git bisect 对 rails 仓库。请参阅下面的 调试部分
  13. 在合并请求描述中包含两个版本之间的 Gem 链接差异。例如,这是 activesupport 6.1.3.2 到 6.1.4.1 的 gem 差异。

为 Gitaly 准备一个 MR

不再需要,因为 Gitaly 不再包含 Ruby 代码。

为安全补丁创建补丁版本和向后移植

如果 Rails 升级涉及补丁版本且包含重要的安全修复,请确保在 GitLab 补丁版本中发布给自托管客户。请咨询我们的 发布经理 了解如何进行。

废弃日志记录器

我们还将 Ruby 和 Rails 的废弃警告记录到专门的日志文件 log/deprecation_json.log 中。当存在测试覆盖不足的代码时,它会提供线索,从而避免被 DeprecationToolkitEnv 忽略。

对于 GitLab SaaS,GitLab 团队成员可以在 Kibana (https://log.gprd.gitlab.net/goto/f7cebf1ff05038d901ba2c45925c7e01) 中检查这些日志事件。

对 Rails 使用 Git bisect

通常,如果您知道哪个 Rails 变更导致测试失败,它会提供额外的上下文,并有助于找到失败的修复方法。为了高效快速地找到导致测试失败的 Rails 变更,您可以对 Rails 仓库使用 git bisect 命令:

  1. 在您选择的文件夹中克隆 rails 项目。例如,它可能是 GDK 的根目录:

    cd <GDK_FOLDER>
    git clone https://github.com/rails/rails.git
  2. 将 GitLab Gemfile 中的 gem 'rails' 行替换为:

    gem 'rails', ENV['RAILS_VERSION'], path: ENV['RAILS_FOLDER']
  3. 使用您克隆 Rails 的文件夹设置 RAILS_FOLDER 环境变量:

    export RAILS_FOLDER="<GDK_FOLDER>/rails"
  4. 切换到 RAILS_FOLDER 目录并设置 git bisect 命令的范围:

    cd $RAILS_FOLDER
    git bisect start <NEW_VERSION_TAG> <OLD_VERSION_TAG>

    其中 <NEW_VERSION_TAG> 是测试失败的标签,<OLD_VERSION_TAG> 是测试通过的标签。例如,如果我们从版本 6.1.3.2 升级到 6.1.4.1,则使用 git bisect start v6.1.4.1 v6.1.3.2。将 <NEW_VERSION_TAG> 替换为测试失败的标签,将 <OLD_VERSION_TAG> 替换为测试通过的标签。例如,如果我们从版本 6.1.3.2 升级到 6.1.4.1,则使用 git bisect start v6.1.4.1 v6.1.3.2。在输出中,您可以看到大约需要多少步才能找到提交。

  5. 启动 git bisect 进程,并将测试文件的文件名作为参数传递给 scripts/rails-update-bisect。选择一个示例而不是整个测试文件可能会更快。

    git bisect run <GDK_FOLDER>/gitlab/scripts/rails-update-bisect spec/models/ability_spec.rb
    # OR
    git bisect run <GDK_FOLDER>/gitlab/scripts/rails-update-bisect spec/models/ability_spec.rb:7
  6. 当进程完成时,git bisect 会打印提交哈希值,您可以使用它来在 rails/rails 仓库中找到对应的 MR。

  7. 执行 git bisect reset 以退出 bisect 模式。

  8. 恢复对 Gemfile 的更改:

    git checkout -- Gemfile

后续阅读材料