时隔16年JeffBarr重返10.23-25 QCon上海站,带你看透AI如何重塑软件开发! 了解详情
写点什么

使用 Ruby on Rails 构建 GitHub,每周做一次升级

  • 2023-09-25
    北京
  • 本文字数:2236 字

    阅读完需:约 7 分钟

大小:1.15M时长:06:43
使用 Ruby on Rails 构建 GitHub,每周做一次升级

本文介绍了 GitHub 如何使用 Ruby on Rails 构建他们的应用程序,并且每周如何进行升级。文章中提到 GitHub 与社区合作来确保每个 Rails 发布版本在生产环境中运行,并强调了投资于 Rails 的重要性。


自从成立以来,GitHub.com 一直是一个基于 Ruby on Rails 的单体应用。如今,该应用已经接近两百万行代码,每天有超过一千名工程师在上面协作。我们平均每天部署 20 次,几乎每周都会进行一次 Rails 的升级。


每周升级 Rails


每个周一,我们都会自动触发一个计划好的 GitHub Action 工作流,创建一个拉取请求,将我们的 Rails 版本更新到当天 Rails 主干分支的最新提交。我们所有的构建都在这个新版本的 Rails 上运行。一旦所有构建通过,我们会审核这些更改,并在第二天发布。从周一开始升级,用户就已经有一个打开的拉取请求,链接到此次 Rails 升级提出的更改和一个已经完成的构建。


这个过程与几年前我们进行 Rails 升级的方法大不相同。过去,我们花费数月的时间从自定义的 Rails 分支迁移到更新的稳定版本,然后我们维护了两个 Gemfiles,以确保我们能够与即将发布的版本兼容。现在,升级只需要不到一周的时间。(可以在这篇 2018 年的博文中了解更多有关此过程的信息。)我们与社区密切合作,确保每个 Rails 发布版本在正式发布之前都在生产环境中运行。


使用最新版本的 Rails 有很多实际的好处:


  • 我们为 GitHub 的开发人员提供最新版本的 Rails,确保他们可以使用所有最新的改进,包括更好的数据库连接处理、更快的视图渲染以及每天在 Rails 中发生的惊人工作,为他们提供最佳的工具版本

  • 我们已经几乎删除了所有的 Rails 补丁。由于我们正在运行最新版本的 Rails,开发人员现在可以直接提交补丁到 Rails,无需等待 Rails 的更改。

  • 与团队共享 Rails 工作现在比以往任何时候都更容易!你不需要再告诉团队你在下一版中发现的 Rails 问题,而是可以在 Rails 上直接工作并在下周就看到结果!

  • 保持最新的依赖关系可以使我们拥有更好的安全姿态。由于我们每周进行升级,所以在出现安全咨询时添加升级是标准做法,不需要额外的工作。

  • 没有所谓的“大爆炸”迁移。由于每个 Rails 升级只包含少量更改,如果有不兼容性,更容易理解和深入挖掘。从一个未知的位置出现的意外更改是来自困难升级的最糟糕的问题。这种升级策略可以减轻这些问题。

  • 在主干分支中捕获错误并做出贡献可以加强我们的工程团队,并帮助我们的开发人员深入了解我们的应用程序及其依赖项。

持续测试 Ruby


为了确保应用在最新的 Ruby 版本上运行良好,我们采用了持续测试的方法。在 2022 年 2 月,我们升级到 Ruby 3.1,并开始使用并行构建来测试从 3.2-alpha 版本提交的 Ruby shas。当 CI 运行 GitHub Rails 应用程序时,会运行两个版本的构建:一个版本使用我们在生产环境中运行的 Ruby 版本进行构建,另一个版本则使用包括最新 Ruby 更改的最新 Ruby 提交进行构建。我们每周更新一次。


尽管我们每次更改都会构建 Ruby,但 GitHub 只会发布经过编号的 Ruby 版本到生产环境。这些构建帮助我们保持与即将到来的 Ruby 版本的兼容性,并为我们提供关于 Ruby 更改的见解。


2022 年 12 月初,CI 让我们有了信心,认为我们与即将发布的 Ruby 3.2 兼容。因此,我们可以使用部分生产流量测试 Ruby 发布候选版,并向 Ruby 团队提供我们发现的任何更改的见解。例如,我们可以复现由于关键字参数处理引起的分配增加问题,并在 Ruby 3.2 发布之前得到修复。此外,我们还确定了在应用 to_str#to_i 时的微妙变化。由于我们不断升级,识别和解决这些问题已经成为标准惯例。


每周升级 Ruby 的过程使我们能够在一个月内从 Ruby 3.1 升级到 Ruby 3.2 的单体架构,毕竟,我们已经在生产中测试和运行过 Ruby 3.2!这是我们迄今为止完成的最快的 Ruby 升级。我们在 Ruby 3.2.1 发布当天打破了这个记录。


这个升级过程对我们与 Ruby 核心团队的合作证明非常宝贵。拥有这些构建的一个好的附带效果是,我们能够轻松地测试和分析我们自己的 Ruby 更改,然后再向上游建议。这使我们更容易识别我们自己应用程序中的回归,并更好地理解更改对生产环境的影响。

我也应该这么做吗?


GitHub 之所以能够频繁升级 Ruby 和 Rails,是因为具备了一定的工程成熟度。每周升级 Rails 需要一个全面的测试套件,许多优秀的工程师致力于维护和改进它。此外,我们还从拥有出色的测试环境和渐进式部署中获得信心。我们的测试套件很可能会捕捉到问题,如果没有,我们相信在部署之前会发现并解决它。


如果你拥有这些工具,你也应该每周升级 Rails,并使用最新的 Ruby 进行测试。GitHub 成为了更好的 Rails 应用程序,这使我们的团队能够进行我非常自豪的工作。


Ruby 专家 Eileen Uchitelle 在 2022 年的 Rails Conf Keynote 中解释了为什么投资于 Rails 很重要:


归根结底,如果更多公司将框架视为应用程序的扩展,这将导致更高的韧性和稳定性。投资于 Rails 可确保您的基础不会在应用程序的重压下崩溃。将其视为应用程序中不重要的部分是一个错误,许多领导者都犯了这个错误。


感谢来自全世界的人们的贡献,使用 Ruby 比以往任何时候都更好。GitHub 和其他数百家公司一样,受益于 Ruby 和 Rails 不断改进。定期升级和投资于我们的框架是我们在 GitHub Ruby 架构团队上的工作的核心。我们始终感激 Ruby 社区,并很高兴我们能以一种改进我们的应用程序和工具以及为每个人改进它们的方式回馈。


作者介绍

Adam Hess,软件开发者。


原文链接:

https://github.blog/2023-04-06-building-github-with-ruby-and-rails/

2023-09-25 12:069056

评论

发布
暂无评论
发现更多内容

第一届POLARDB数据库性能大赛-亚军0xCC☣☢比赛攻略

阿里云天池

CVPR2021 安全AI挑战者计划第六期赛道一第二名方案分享 (UM-SIAT队)

阿里云天池

Spark“数字人体”AI挑战赛_脊柱疾病智能诊断大赛_GPU赛道亚军比赛攻略_triple-Z团队

阿里云天池

如何借助SD-WAN实现简单且经济的组网?

Ogcloud

SD-WAN 企业组网 SD-WAN组网 SD-WAN服务商 SDWAN

新场景、新能力,AI-native 时代的可观测革新

阿里巴巴云原生

阿里云 云原生 可观测

inBuilder零代码新版表单设计器特性一览

inBuilder低代码平台

低代码 零代码

爬虫如何帮助构建比价系统|涨姿势

八爪鱼采集器︱RPA机器人

爬虫 采集

ChatGPT 向更多用户推出高级语音模式:支持 50 种语言;字节发布两款新视频生成大模型丨 RTE 开发者日报

声网

性能测试 | JMeter的运行

测试人

软件测试

如何在 Rust 中通过 Rumqttc 实现 MQTT 通信

EMQ映云科技

rust mqtt emqx

如何根据拍立淘API返回值进行商品数据分析

技术冰糖葫芦

API Gateway api 货币化 API 接口 API 测试 pinduoduo API

JMeter的运行

霍格沃兹测试开发学社

2024-09-25:用go语言,给定一个长度为 n 的整数数组 nums 和一个正整数 k, 定义数组的“能量“为所有和为 k 的子序列的数量之和。 请计算 nums 数组中所有子序列的能量和,并对

福大大架构师每日一题

福大大架构师每日一题

PhysicsAI 与 Inspire Cast 的结合:实现铸件缺陷的快速预测

Altair RapidMiner

人工智能 AI 仿真 智能制造 altair

面试官:项目中如何实现布隆过滤器?

王磊

开发者的利器:Rainbond 赋能你的产品创新

北京好雨科技有限公司

云原生 k8s rainbond 企业号9月PK榜

AI加速数字员工智能化落地——中国数字员工市场发展及企业数字员工落地建议

易观分析

天池云上智能降雨量预测总决赛-优胜奖RIOFGROUP队攻略分享

阿里云天池

鸿蒙智行首款轿跑SUV智界R7上市,小艺化身贴心随行的用车顾问

极客天地

TEDxDUTH 使用 NocoBase 实现革新

NocoBase

低代码 TED 管理工具 无代码 创新管理

专业期刊《Java aktuell》:使用Apache TsFile和Apache IoTDB对时序数据进行分布式数据采集

Apache IoTDB

体验3A云游戏,无需购买高端显卡

Ogcloud

云游戏 3A云游戏 云游戏发行 游戏云化

手工测试用例转Web自动化测试生成

霍格沃兹测试开发学社

豆包MarsCode初体验,用 React 创建一个最经典的贪吃蛇游戏

TRAE.ai

人工智能 编程 程序员 AI 代码

深入探索 RUM 与全链路追踪:优化数字体验的利器

阿里巴巴云原生

阿里云 云原生 全链路追踪 RUM

从自动化到智能化:AI如何推动业务流程自动化

天津汇柏科技有限公司

自动化 智能化 AI 人工智能

面试官:谈谈你对 IoC 和 AOP 的理解!

JavaGuide

Java spring aop ioc

火山引擎数据飞轮面向企业大模型业场景务提供数智服务

字节跳动数据平台

大模型 数智化 数智化转型

华为四大创新助力运营商打造万兆智能接入网,加快50G PON商用部署,加速智能应用创新

极客天地

“万亿级”低空经济,谁在风口上“飞”?

趣解商业

科技 出行 低空经济

被动元数据的不足和主动元数据的先进性

Aloudata

大数据 数据治理 元数据 数据管理 数据血缘

使用 Ruby on Rails 构建 GitHub,每周做一次升级_架构_Adam Hess_InfoQ精选文章