大数跨境
0
0

架构之发布、升级与版本管理

架构之发布、升级与版本管理 二进制跳动
2024-02-10
2
导读:架构之发布、升级与版本管理

在软件开发周期中,应用开发团队完成新版本迭代后,通常会提交更新后的源代码至源代码管理系统。发布这一新版本涉及几个关键步骤:

  1. 构建:这一阶段包括从源代码管理系统中获取最新的源代码,然后编译这些代码以生成目标文件,即构成新版本软件的实体。

  2. 测试:此步骤旨在通过各种测试验证新版本软件的性能,确保其达到预期的质量标准。

  3. 打包:在此阶段,新版本的软件及其必要的相关文件(例如配置文件)会被一同打包,并分配一个版本号以便跟踪。

  4. 部署:最后,将新打包的软件版本部署到生产环境。为了维护线上环境的稳定性,这一过程通常采取渐进式部署而非一次性全面更新。


整个发布与升级的过程,大体可以用下图来表示。

从上面我们可以看出,发布是一个具备很强的事务特征的工作,过程很复杂。不仅如此,发布工作的心智负担也很大。

所有 SRE 都应该牢牢记住以下这句七字箴言:变更是故障之源。我们应该怎么做,才能彻底解决发布与升级的问题?

密闭性与可重复性

确保服务的可靠性要求实施一个稳固的发布流程,核心在于保障发布的过程具有高度的封闭性和可重复性。可重复性是我们追求的主要目标,确保相同的软件版本能够被多次部署而不引发任何副作用。这种可重复性是实现无风险升级和在遇到问题时能够安全回滚的基础。

为了实现这种可重复性,必须确保流程的封闭性。所谓的封闭性,或称环境的完整性,意味着在整个发布过程中,所有资源和环境都是预定义且固定的。例如,源代码的管理应当是封闭的,通过特定的版本号检出的代码必须是一致、完整且可预期的,不再依赖于任何外部资源或第三方代码的动态检出。

同样,构建过程的一致性和可重复性也至关重要。理想情况下,任何两个开发人员应能在不同的计算机上,使用相同版本的源代码进行构建操作,并得到一模一样的构建结果。这意味着构建过程不应受到构建机器上安装的第三方库或其他软件工具的影响。要做到这一点,构建过程中必须使用特定版本的构建工具和编译器,并依赖于指定版本的第三方库。编译过程应完全独立,不依靠任何编译环境外的服务。

从自动化到自服务

在软件开发的世界里,发布流程虽然复杂,但却需要频繁执行。因此,仅仅实现单次发布的自动化是不足够的。随着公司的扩展和团队的增长,每个团队都需要具备独立完成发布任务的能力,这就要求发布流程不仅要自动化,还需要易于管理和可扩展。

为了满足这些需求,许多公司会组建专门的工程效率团队。这些团队的主要职责是开发和维护工程效率平台,这包括为发布流程提供自动化工具和制定最佳实践指南。有了这些工具和指南,产品研发团队就能够自主控制和执行他们的发布流程,无需每次都依赖工程效率团队的直接干预。

这种模式允许每个团队根据自己的需求和时间表来安排新版本的发布,从而实现了真正意义上的自动化发布流程。在这个过程中,自动化构建和部署工具发挥了关键作用,它们能够自动完成构建和发布,大大减少了人工干预的需求。仅在遇到特定问题时,工程师才需要介入处理。

这种自服务的模式确立了团队间的合作边界:工程效率团队负责提升和维护发布平台的效率,而产品研发团队则专注于产品本身的开发和质量。这种做法在工程界被形象地称为“吃自己的狗粮”,意味着开发团队实际使用自己开发的工具和平台来推进产品的发布和迭代,这不仅能促进工具的改进和优化,还能增强团队的自给自足能力。

追求速度

在确保质量和满足需求的前提下,频繁的版本更新被视为理想选择。这种做法可以从两个主要方面进行考量:市场竞争力和工程质量。

首先,从市场竞争的角度来看,产品的迭代速度反映了其竞争力。特别是对于面向用户的软件产品而言,更新频率通常需要保持在较高水平。一些团队甚至采取了“测试通过即发布”的策略,即所有通过测试的版本都将被发布。

其次,从工程质量的角度考虑,频繁发布的好处在于可以减少每次版本更新之间的变更量。这样不仅可以简化测试过程,还能更容易地进行错误调试和定位。

因此,无论是从提升市场竞争力还是从提高工程质量的管理角度出发,都支持采用少量且频繁发布的版本更新哲学。为了有效实施这一策略,建议采用数据驱动的方法进行监控,特别是关注那些核心指标。例如,监控发布速度——从代码更改提交到部署再到生产环境的总耗时,是一个关键的度量指标。

重视质量,尊重流程

在软件发布过程中,确保质量是至关重要的,这涉及到多个关键步骤。这些步骤包括:进行代码评审以审批源代码更改;批准新的发布版本,这可能基于源代码仓库的一个特定版本并包含一些Bug修复;批准发布版本的部署;以及批准配置更改。重要的是,发布流程设计得足够严格,以确保只有授权人员能执行特定操作,防止绕过关键步骤直接发布。

此外,对于SRE(站点可靠性工程师)来说,掌握每个新发布版本中的所有具体更改细节至关重要,这样一来,如果发布中出现问题,可以迅速在线进行故障排除。这就要求自动化发布系统不仅要整合,还要提供包括源代码更改、Bug Issue、配置更改在内的每个版本所有更改的详细报告

因此,一个有效的发布流程应该包括严格的质量保障步骤,并通过自动化工具来确保所有更改都被适当记录和审查,以促进快速准确的故障诊断和解决。

配置管理

配置管理在软件发布流程中虽然看似较为细微,却是线上服务不稳定的一个关键因素。随着时间的推移,配置管理的策略也在不断进化。以七牛云为例,它在早期依靠代码仓库管理所有线上环节的配置,这样做的好处显而易见:配置更改能像源代码更改一样被跟踪并受到严格的审查。但是,当集群规模扩大时,这种做法的缺点逐渐显现,尤其是当配置变更不仅仅由版本发布引起,还可能由线上故障导致,如需将服务从一台机器迁移到另一台,这种情况下的配置变更变得越来越频繁。

依赖代码仓库进行配置管理在处理硬件故障时效率低下。理想情况下,对硬件故障的响应应该是无需人工操作的,即不需要SRE介入。为了解决这个问题,有两种策略可以采用:一种是引入配置中心,将某些频繁的配置更改集成到应用逻辑中。这一策略背后的理念体现在服务治理的一个分支——服务发现。另一种策略是将配置管理与物理硬件环境彻底解耦,这正是数据中心操作系统(DCOS)所采取的措施。这两种策略的核心思想相同,即将频繁的配置更改集成到应用逻辑中,不同之处在于后者由一个底层平台来实现。

在今天的讨论中,我们着重探讨了服务治理中的一个关键环节——发布与升级。这个过程涉及到几个重要的子过程,包括构建、测试、打包、部署和配置变更。虽然我们没有深入探讨具体的发布与升级系统的实现细节,但业界在这些环节上已有许多成熟的实践案例。对于正在评估采用何种发布系统的团队来说,将这些实践案例与我们今天讨论的发布哲学相结合,将有助于做出更加明智的决策。

发布系统的复杂性和工作量都非常大,要实现高效的发布流程,工程师的思维方式起到了决定性的作用。我们强调必须采用系统化的思维方式,以根本解决发布过程中遇到的各种问题。这种思维方式要求我们不仅要关注单个环节的优化,还要考虑整个发布流程的协同和效率,确保每一步都能顺利衔接,从而实现快速、稳定的软件发布与升级。

【声明】内容源于网络
0
0
二进制跳动
15 年 + 技术老兵 架构师|技术总监|科技创业技术合伙人 曾任职苏宁科技、电讯盈科、联想云 专注架构设计与技术落地
内容 739
粉丝 0
二进制跳动 15 年 + 技术老兵 架构师|技术总监|科技创业技术合伙人 曾任职苏宁科技、电讯盈科、联想云 专注架构设计与技术落地
总阅读97
粉丝0
内容739