客户端单周发版下的多分支自动化管理与实践

背景

目前,互联网产品呈现出高频优化迭代的趋势,需求方希望尽早地看到结果,并给予及时反馈,所以技术团队需要用“小步快跑”的姿势来做产品,尽早地交付新版本。基于以上背景,美团客户端研发平台适时地推行了单周发版的迭代策略。单周版本迭代的优点可以概括为三个方面:更快地验证产品创意是否符合预期,更灵活地上线节奏,更早地修复线上Bug。

首先说一下美团平台的发版策略,主要变更点是由之前的每四周发一版改为每周都有发版。具体对比如下:

  • (旧)三周迭代指的是2周开发+1周半测试,依赖固定的排期和测试时间,如果错过排期,则需要等待至少20天方可跟着下个版本迭代发布,线上验证产品效果的时间偏长。具体示例描述如下:

  • (新)单周版本迭代指一周一发版,单周迭代版本排期、测试不再依赖固定时间节点,需求开发并测试完成,就可以搭乘最近一周的发版“小火车”,跟版发布直接上线。对于一般需求而言,这将会大大缩短迭代时间。

业务方研发人员的痛点

在之前按月发版的迭代节奏下,基本上所有的需求都属于串行开发,每个版本的开发流程比较固定。从“评审-开发-提测-灰度-上线”各个环节都处于一个固定的时间点来顺序执行,开发人力资源的协调方式也相对简单。全面推进单周发版之后,并不能把所有需求压缩到5天之内开发完成,而是会存在大量的并行开发的场景,之前的固定时间节点全部被打破,由固定周期变成了动态化调配,这给业务方的需求管理和研发人员人力管理都带来了指数式复杂度的提升。一旦进入并行开发,需求之间会产生冲突和依赖关系,版本代码也会随之产生冲突和依赖,这也大大提高了开发过程中的分支管理成本,如何规范化管理分支,降低分支冲突,把控代码质量,是本文接下来要讨论的重点。

下面描述了几种典型的单周发版带来的问题:

  • 业务需求开发周期不固定,会存在大量的多版本、多需求并行开发。平台只提供了单周发版的基础策略,每5天发一版,业务方完成需求即可搭车发版。

对于各业务方来说,需求开发往往并不是都能在5天内完成,一般需求在5~10天左右,在之前串行发版模式下这个问题其实也存在,但并不突出,在单周发版的前提下,都要面临跨版本开发,意味着多个版本多个需求会同步并行开发,这给业务方的分支管理带来了极大的挑战。

  • 业务方架构复杂,仓库依赖多,单周发版分支创建合并维护成本大。

交通业务线涉及火车票、国内机票、国际机票多条业务线,代码仓库除了业务线的独立仓库,还有交通首页,交通公共仓库,RN仓库等多个仓库,Android端6个Git仓库,iOS端5个仓库,RN5个仓库,共计16个Git仓库。

多仓库频繁发版分支代码存在安全风险,容易漏合代码,冲掉线上代码。

交通业务线仓库结构示意图

  • 业务线自身的公共基础库需求变动频繁。也需要具备单周发版的能力。

例如交通公共基础仓库,承载了很多交通业务线的UI功能组件,这些公共组件的业务变化频繁,公共基础仓库变化的同时,可能会对使用组件的业务产生影响,需要同步的升级发版。美团平台的策略是公共服务组件每四个小版本统一升级一次,但对业务方自身组件这种策略限制较大,还是需要公共组件也要具备随时发版的能力。

单周发版分支管理解决方案

针对上面提出的问题,交通客户端团队通过技术培训、流程优化、关键点检测、自动化处理等方式保证分支代码的安全。技术培训主要是加强技术人员分支管理的基本知识,Git的正确使用方法,这里不做过多描述。本文主要讨论关键点检测,以及如何进行自动化的分支管理。

在实施单周发版之前,业务方代码仓库只有两个分支,Develop分支,即开发分支;Stage分支,即发版分支;开发流程基本在串行开发模式,每个版本10天开发,8天测试,然后进入下一版本的开发。

之前的串行发版模式

这种方式只能适用于节奏固定的长周期开发方式,对于多版本并行开发来说,有点力不从心,显然已经不能承载当前更灵活的发版节奏。

针对这些问题,我们推出了如下分支管理结构。总的来说,就是废除之前作为开发分支的Develop分支,建立对应的Release发版分支,每个版本打包从Release分支直接打包;同时Stage分支不再承担打包职责,而是作为一个主干分支实时同步所有已发布上线的功能,Stage分支更像一个“母体”,孵化出Release分支和其它Feature分支;当Release分支测试通过、并且发版上线之后,再合入到Stage分支,此时所有正在开发中的其它分支都需要同步Stage分支的最新代码,保证下一个即将发布的版本的功能代码的完整性。

交通业务单周发版分支管理模型示意图

上面的流程描述可能有些复杂,下面是简化的流程图,每个版本都有自己的生命周期:

交通业务单周发版分支生命周期

  1. 从Stage创建一个Release分支;
  2. 进入开发阶段;
  3. 如果Stage分支有变化,同步Stage分支;
  4. 打包测试;
  5. 测试通过,发布线上;
  6. 发布线上之后,合回Stage分支。

为了适应单周发版,新的开发流程也引入了很多新的挑战。例如下图所示的一个Branch分支中涉及的六个关键点:创建分支、合入主干、主干变化通知、Merge主干变化、检测主干同步、未同步拦截,除了这些还要考虑多仓库同步操作的问题,还有热修复版本的管理方式的问题。能否把这些关键节点合理的规范和把控起来,是我们当前应对多分支并行开发的主要难点:

交通业务单周发版关键节点

如何更高效的解决这些问题呢?结合我们当前使用的工具:Git + Atlassian Stash 代码仓库管理工具;Jenkins Build打包工具;大象(美团内部通讯工具)内网通信工具。目前这三个开发工具已经非常成熟、稳定,并且接口丰富易于扩展,我们需要配合当前单周发版的分支管理模式,利用这些工具来进行扩展开发,正所谓“要站在巨人的肩膀上”。

  1. 创建分支Release分支如何创建,何时创建,分支命名规范定义如何约束?

创建Release分支,本质上是从Stage新建一个分支,当前提前一个周期创建新的发版分支,例如在10.1.1版本Release后,创建10.1.3版本的分支,此时10.1.2版本处于开发测试阶段。业务方所有的分支命名和平台的分支命名保持一致,采用Release/x.x.x的格式,但同时需要升级成为即将发布的Release版本号,例如10.1.3。

现在交通业务线多达十几个仓库,每个仓库每周都要操作一次需要耗费大量人力。之前每个分支的创建都是通过Stash或者手工创建,能不能自动化批处理的创建呢?答案是肯定的。对此,我们采用了Jenkins的方式,需要建立一个Jenkins Job, 基本原理就是通过命令行的方式进行Branch的创建,然后通过Job管理,批处理建立所有仓库的Release分支,这样就收敛了Branch的创建,即采用统一的命名规范,并且同时升级版本号。这就解决了创建分支的难点,实现了自动化创建分支,并且实现了规范化命名。

  1. 如何知道Stage分支有变化,变化后需要做什么,不做会怎样?

一个好的开发习惯,就是每天写码之前都同步主分支,但是还是需要一个机制来确保同步。这里做了三个措施来确保各个分支和Stage是保持同步的:一个通知,一个警告,一次拦截。这三个步骤解决主干变化通知、检测主干同步、未同步拦截的问题。

一个通知:具体路径如下,建立了一个内部推送公众账号和一个Jenkins监听Job,当所有交通业务仓库Stage分支有代码改动,通知所有对应的开发人员,该仓库有代码变化,请及时合入。

一次警告:本地开发过程中,每次提交代码到远端仓库时,会触发一个Stage分支代码同步检测的脚本,如果发现未同步,会通过内部通讯系统通知提交者存在未同步主分支问题。但这里目前并不做强制拦截,保证分支代码开发的整体流畅性。

最终拦截:在开发分支打包的过程中强制拦截,最终功能代码上线还是需要打包操作。在打包操作时统一收口,由于之前打包也是在Jenkins上来完成的,这里我们也是通过在打包Jenkins上接入了分支合并检测的插件,这样每次打包时会再次检测和主分支的同步情况。如果发现未同步则打包失败,确保每次发版都包含当前线上已有代码的功能,防止新版本丢失功能。

  1. 如何合并分支,如何保证漏合?

和上面提到的第一个如何创建分支的问题类似,通过Jenkins Job来进行批量操作,可以一键创建所有分支的Pull Request;在每个版本发版之前,统一进行一次打包,合入美团的主分支,防止多个仓库有漏合的情况。

  1. 公共基础库版本策略?

公共基础和业务分支保持同样的策略,通过批处理脚本同时建立分支,合并分支,监听分支变化,需要注意的是,每次版本升级,公共基础库也需要同步的打包,并且强制业务库升级。不然,如果基础仓库存在接口变动,有的业务升级了,有的业务没升级,最终会导致无法合入主分支,进而无法打出App包。

  1. 热修复的版本管理策略?

热修复确实是一种非常规的处理方式。从原则上来讲,热修复需要在对应的Release分支上进行修改,然后把修改合入Stage分支,同时需要同步到其它正在开发的分支。实际的处理需要根据具体情况来分析,是否需要对线上多个版本热修复。如果多版本都要修复就不能再合入Stage分支,否则会导致Stage分支冲突,如果把Stage分支合入需要热修复的其它分支,会把线上当前最新代码带入历史旧版本,会导致版本兼容性问题。最终执行起来可能还是对热修复版本进行单独处理,不一定要进行Stage主分支的同步,热修复的版本管理成本会比较高,更多的需要人工介入。

未来展望

目前整体的分支发版流程已经基本完成,现在已经稳定运行了10个小版本,同时没有出现因为分支管理问题而引发的线上问题。

不过,当前整体流程的自动化程度还有待提高,每周需要人工去触发,很多代码合并过程中的冲突问题还需要人工去解决。未来我们希望能够自动化地根据平台的版本号自动创建分支,并且对于一些简单的冲突问题拥有自动化的处理能力。随着单周发版的不断成熟,未来对于持续交付能力也将不断提升,发版节奏可以不限于单周,一周两版或是更快的发版节奏也成为一种新的可能。

作者介绍

  • 王坤,美团客户端开发工程师,2016年加入美团,目前主要负责大交通业务的客户端架构、版本管理及相关工作。

发现文章有错误、对内容有疑问,都可以关注美团技术团队微信公众号(meituantech),在后台给我们留言。我们每周会挑选出一位热心小伙伴,送上一份精美的小礼品。快来扫码关注我们吧!

原文地址:https://www.cnblogs.com/meituantech/p/10254647.html

时间: 2024-11-05 15:44:52

客户端单周发版下的多分支自动化管理与实践的相关文章

AEAI CRM客户关系管理V1.0.3版发版说明

AEAI CRM客户管理系统包括一些核心的客户关系管理业务功能,如:潜在客户.线索管理.客户管理.拜访管理.商机管理.订单管理等模块,满足企业客户关系信息化的基本要求,并帮助企业提高客户资源的管理效率.本次发版的AEAI CRM客户关系管理为v1.0.3版本,该产品现已开源并上传至开源中国,产品下载地址:http://pan.baidu.com/s/1mgIdzGc ,欢迎大家下载使用,也可以加入数通畅联产品QQ技术群 299719834或关注"数通畅联"微信公众号,一起参与讨论. 官

易助工资总额管控发版说明

一.开发背景 易助工资总额管控系统-2016已经正式发版.上市,满足人事薪酬管理的基础应用,基于平台开发,这意味着软件界面信息.数据结构.功能模块及数据处理算法均可随意修改,用户可根据自身实际情况自行组装.修改模块,甚至可开发新的应用系统.是目前市场上少见的一款务实.经济.高效.灵活的企业管理系统. 二.应用特征 1.功能完备,适用性强 提供系统维护.组织管理.人事管理.合同管理.薪资管理.报表管理.政策法规.保险福利.绩效管理.考勤管理.自助管理功能模块,提供报表与图形分析功能,方便用户使用与

阿里云移动研发平台 EMAS 助力银行业打造测试中台,提升发版效能

随着移动互联网的发展,手机银行凭借低成本.操作简单.不受时间空间约束等优势,正逐步替代传统的网银交易方式.越来越多的银行开始了“业务移动化”转型之路,“手机APP”已经成为企业价值传递和关系维护的关键纽带,客户争夺的主战场已转向移动端,事实上手机银行的用户比例早已超越了网银用户. 但是伴随着银行APP承载的业务需求日益增多.版本迭代速度不断加快,以“手工测试”为基础的测试体系,已很难满足业务对测试效率和质量的要求.APP 测试急需完成从“纯人工”到“人机协同”的范式转换. 一.银行 APP 的质

数飞表单引擎系统高级版测试及下载

公司网址:  http://www.soarwell.com   电子信箱: [email protected]下载网址1 : http://www.saas88.com/download/SZOA2015free.rar 软件简介: 数飞OA高级版V6.6主要实现表单自定义.流程自定义.公告文档管理.常用流程审批.资源管理.电子邮件收发.公文审批:可实现Office在线编辑.电子印章:支持手机浏览器访问,支持邮件提醒:可通过微信访问.可支持微信提醒.数飞OA高级版V6.6包含表单引擎.流程自定

C语言实现单链表-03版

在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4,一个专门遍历数据的功能: Solution 我们的数据结构体定义如下,和上一个版本稍微有所不同: 例如,我们把人这个结构体添加一个name域,前几个版本没有名字的节点: 我们叫起来很尴尬,都是第几个第几个节点,好啦!现在有名字啦! #include <stdio.h> #include <s

C语言实现单链表-02版

我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1,要是数据很多怎么办,100000个节点,这个main函数得写多长啊... 2,这个连接的方式也太土啦吧!万一某个节点忘记连接下一个怎么办... 3,要是我想知道这个节点到底有多长,难道每次都要从头到尾数一遍嘛... 4,要是我想在尾部添加一个节点,是不是爬也要爬到尾部去啊... 这个是简单版中提出

iOS实时发版,动态库方式 不上App Store可以使用啊

iOS如果想要实现实时发版,据我了解现在基本上用的是两种方式 1:使用Lua脚本进行,基本上很多手游都是这样做的,再配合上Cocos2d-x这个框架使用起来也比较简单. 2:使用动态库  这里我说的就是这中方式. 先说下实现思路,在动态库中实现一个入口类,和入口方法,这个方法在主工程中调用 这里说下创建动态库的步骤: 下面直接上代码啦. 动态库中测试界面 VCOne.h #import <UIKit/UIKit.h> @interface VCOne :UIViewController @pr

React-native集成tfs自动发版问题

前提是苹果开发者账号是企业账号,用mac本地打包成ipa是没有问题的,提交到tfs自动发版就有问题,这两个库没有导入进来,原因是路径不对了. 解决方法: 找的本地库的位置,拷贝到自动发版的目录下,就能自动发版.应该还有其他解决方案,只是一个发版而已,不影响程序本身,解决了就好了 原文地址:https://www.cnblogs.com/xinyunboss/p/9934742.html

jenkins 配置子项目发版

刚接手公司的项目虽说也多模块.分布式部署,但是模块之间却没有被父项目管理,每个模块是一个小的父子项目,管理了两个子项目,单独维护着当前模块内使用的依赖,版本等,模块之间自然有很多重复引用的依赖,我不知道当初为什么这样创建,在我集成apollo配置中心的时候我改掉了这样依赖结构,所有的模块的依赖都和版本都统一由一个父pom管理,这也为后面埋下一个坑. 测试环境上线的时候,使用的jenkins自动部署,原以为更换了源码路径就可以了,但是发版错误提示没有定义版本号,×××的是要部署的模块代码,其他模块