Rails 升级指南
我们努力使用最新的 Rails 版本来运行 GitLab,以获得性能提升、安全更新和新功能。
Rails 升级方法
为 GitLab 准备一个 MR
- 查看 Ruby on Rails 升级指南 并为即将到来的变化做好准备。
- 在
Gemfile中更新railsgem 版本。 - 运行
bundle update --conservative rails。 - 对于主版本和次版本更新,运行
bin/rails app:update并检查是否应该应用任何建议的更改。 - 在
qa/Gemfile中更新activesupport版本。 - 在
qa文件夹中运行bundle update --conservative activesupport。 - 运行
find gems -name Gemfile -exec bundle update --gemfile {} activesupport --patch --conservative \;并根据需要将命令中的--patch替换为--minor或--major。 - 解决任何 Bundler 冲突。
- 确保
@rails/ujs和@rails/actioncablenpm 包与package.json中的新 rails 版本匹配。 - 更新后运行
yarn patch-package @rails/ujs以确保我们的本地补丁文件版本匹配。 - 创建一个带有
pipeline:run-all-rspec标签的 MR,看看是否会破坏流水线。 - 要解决和调试测试失败,请使用
git bisect对 rails 仓库。请参阅下面的 调试部分。 - 在合并请求描述中包含两个版本之间的 Gem 链接差异。例如,这是
activesupport6.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 命令:
-
在您选择的文件夹中克隆
rails项目。例如,它可能是 GDK 的根目录:cd <GDK_FOLDER> git clone https://github.com/rails/rails.git -
将 GitLab
Gemfile中的gem 'rails'行替换为:gem 'rails', ENV['RAILS_VERSION'], path: ENV['RAILS_FOLDER'] -
使用您克隆 Rails 的文件夹设置
RAILS_FOLDER环境变量:export RAILS_FOLDER="<GDK_FOLDER>/rails" -
切换到
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。在输出中,您可以看到大约需要多少步才能找到提交。 -
启动
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 -
当进程完成时,
git bisect会打印提交哈希值,您可以使用它来在rails/rails仓库中找到对应的 MR。 -
执行
git bisect reset以退出bisect模式。 -
恢复对
Gemfile的更改:git checkout -- Gemfile