Day940.开发分支 -系统重构实战

news2024/10/7 14:27:27

开发分支

Hi,我是阿昌,今天学习记录的是关于开发分支的内容。

组件化,软件变得更加高内聚、低耦合,开发及维护的效率也更高了,但是组件化的架构又会引入新的复杂度。

举个例子,在重构前我们基于一个模块一次编译就出一个版本,而组件化架构需要同时维护更多的组件版本以及管理更多组件的集成,这就又增加了复杂度。


一、分支作用

在版本控制与软件配置管理中,分支 是从某个版本的代码或文件中建立复制版本,在分支后的两个版本里都可以独立做修改

分支有什么作用呢?

举几个研发过程中使用分支的常见场景。

  • 有几个功能需要同时在研发,为了互相不干扰,拉取各自的 Feature 分支进行开发。
  • 有多个线上发布版本需要同时维护,为了便于追溯,每个版本都会维护各自的 Release 分支。
  • 线上版本出现 Bug,为了快速修复,基于发布分支拉取 HotFix 分支进行修复。
  • … …

结合这些场景,不难分析出,拉分支的主要目的是并行开发不同的功能,同时不让开发中的功能受到其他并行功能的影响。

分支让可以更加灵活地控制软件版本的发布,以及团队并行开发之间的协作。但是,很多团队往往会因为缺少分支的规范及有效的管理,出现大量的长期并行分支,这样就会影响开发效率。

—.

分支 管理不当,就会导致后面这些问题。

  • 由于存在大量的并行发布分支,当修复一个问题的时候,需要花费大量的时间在各个分支上进行代码同步
  • bug 修复了,但是没有及时同步到主干分支,导致提测的时候又出现相同的问题
  • 拉了特性分支开发,由于时间比较久,代码差异越来越大,最后代码合并不回去。
  • ……

分支给带来灵活性的同时,如果不能有效规范其的使用,最后反而会降低团队的研发效率。


二、分支模型

那么如何来解决 分支管理混乱 的问题呢?

一个有效的方式就是在团队内部采用统一的分支模型,规范分支的拉取及合并。

3 种常用的分支模型,它们分别是:

  • GitFlow 模型
  • 短特性分支模式
  • 单主干模型

三、GitFlow 模型

GitFlow 设计之初,主要是为了解决使用 Git 时,Git 提交记录杂乱无章的情况。

不难想象,每个人都随心所欲去提交自己的代码,项目很快就会变得难以协调和维护。

后面是 GitFlow 分支模型图:

在这里插入图片描述

从上图可以看出,开发人员主要都是基于 Develop 分支来开发的。

开发新的特性时,首先需要基于 Develop 分支拉取 Feature 分支,然后基于这个 Feature 分支实现特性开发,完成后合并入 Develop 分支。

当有版本需要发布时,就要基于 Develop 分支拉起对应的 Release 分支来做版本测试,验证成功后就会将代码合并到 Master 分支中,并打上 Tag 标记。

如果版本在线上运行时出现问题,会基于 Release 分支拉取 Hotfixes 分支并修复问题,修复完再将修改合并到主干和 Develop 分支中。

GitFlow 分支模型的特点是开发各自在特性分支上互不干扰地开发,特性分支可以长期存在,甚至跨越多个发布周期

GitFlow 分支也有一些问题,比如日常提交分布在各条特性分支,无法及时集成和联调;特性分支生命周期太长,冲突风险增加。


四、短特性分支模型

那么如何来优化 GitFlow 长期特性分支带来的问题呢?

这就要说到第二种常用的分支模型——短特性分支模型

短特性分支模型指的是所有的开发者都在主干上进行协作开发。

在这种模型下,为了保持灵活性,是不允许新建任何长期存在的开发分支的,但可以使用短的特性分支来持续集成。

后面是短特性分支模型图。

在这里插入图片描述

短特性分支模型的特点是使用周期非常短的特性分支,一般情况下,短特性分支的生命周期一般在 3 天左右,不超过 5 天,所有特性都会合并到主干。

另外,当线上版本需要修复 bug 时,会基于 Release 分支的 Tag 来修复 bug,修复记录需要同时合并到主干分支。

短特性分支模型需要配合其他敏捷实践一起使用,团队要提前规划固定节奏的发布计划,并且要将特性拆分成可以独立交付的小故事(任务)。

为了保证代码质量,则需要完善的代码审核和持续交付的流水线,且在合入主干前要先验证所提交代码的质量,通过流水线保证主干随时可发布(至少是测试版本)。


五、单主干分支模型

短特性分支已经可以很好帮助实现版本持续集成,但如果需要更加频繁地集成发布。

可以参考第三种分支模型——单主干分支模型

单主干分支模型与短特性分支模型类似,关键的区别是单主干没有短的特性分支,有且只有 1 个开发分支,即主干分支,所有改动都发生在主干分支。

后面是单主干分支模型图。

在这里插入图片描述

单主干的挑战相比短特性分支模型更大,由于所有的特性都是直接合并到主干分支,所以对于代码合入质量、需求规划要求更高。

另外,在架构上需要支持使用抽象的“分支”或特性开关来屏蔽特性,从而保证主干上的功能能够灵活地配合规划发布相应的版本。

不过,单主干也有它的优点,由于没有临时开发分支,所有特性都能及时集成。

其模型简单,分支少,开发人员的切换成本低,所以单主干模式也是最符合持续集成的要求。


六、Sharing 分支模型设计

通常情况下,组件化的架构一般分为 2 个部分:

  • 第一个部分是独立维护迭代的组件
  • 另外一个部分是集成发布组件的基座。

分别来看看这 2 种类型的分支模型。因为组件会持续不断地演进新的功能,所以常常会出现一个版本内多个小特性同时开发的情况。所以建议组件分支模型可以考虑使用短特性分支模型。

在实践过程中,需要将需求拆分为各个小的特性或者任务,并且通过质量门禁来保障合入主干的代码质量。并且为了保护主干分支的质量,我们可以将主干分支设置为保护分支,所有合并入主干分支的代码需要提交 MR 或者 PR,经过人工代码检视后,再合入主干分支。对于集成的基座来说,通常代码提交只为配置需要发布的组件,然后集成发布组件。

所以对于集成基座的分支模型,可以考虑使用单主干分支模型。但在实践过程中,仍然可以利用版本管理工具的 MR 或者 PR 来人工 Reivew,但此时的临时分支仅仅只是为了做代码监视而已。

确定好产品的分支模型非常重要,因为后续的持续基础流水线都会基于分支来触发构建,可以根据不同的分支类型,针对性地设计流水线环节与质量门禁,为高效、高质量地发布软件版本保驾护航。


七、总结

分支的灵活性像是一条捷径,可以在研发过程中更方便地去做功能组合以及控制版本发布。但是如果缺少规范及约束,大量长期的分支会大大增加我们后期合并代码的工作量,所以“美酒虽好,但不能贪杯”。

因为对于分支来说,长期分支在本质上和持续集成背道而驰!分支一旦拉出,就意味着有分叉,没有及时集成代码。分叉的时间拖得越久,那么代码的差异可能就越大,最后合并的成本可能就越高。

如果没有重视及做好分支规范,可能会导致需要花费大量的时间及人力在做代码合并的工作。

3 种常用的分支模型:

  • GitFlow
  • 短特性分支
  • 单主干

在实践中根据自己的产品以及团队规模来选择合适的分支模型。对于组件化架构的分支策略来说,组件分支模型可以参考使用短特性分支模式,集成基座的分支模型可以参考使用单主干分支模型。但是注意不管选择何种模型,仍然建议需要做好分支的规范以及管理,避免存在大量的长期并行分支。

如果团队短时间内无法统一分支模型,为了持续集成还可以在分支管理方面,做哪些努力呢?

总结了实践过程中拉取分支的六个要点。

  1. 尽量少拉长期分支。
  2. 尽量晚拉分支。
  3. 分支尽早合并或删除。
  4. 分支活跃期间要频繁同步。
  5. 分支从哪里拉出来,就合并回哪里。
  6. 主干分支必须保持随时可发布。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决Failed to load ApplicationContext问题的思路

中文翻译&#xff1a; 加载ApplicationContext失败 第一步&#xff1a;首先检查测试类的注解 以及 依赖 SpringBootTest <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope…

【数据库复习】第三章关系数据库标准语言SQL 集合查询 2

用EXISTS/NOT EXISTS实现全称量词 SQL语言中没有全称量词" &#xff08;For all&#xff09; 可以把带有全称量词的谓词转换为等价的带有存在量词的谓词&#xff1a; 查询学生S没有选修的课程 查询选修了全部课程的学生姓名。 等价于&#xff1a;查询这样的学生&#xf…

基于灵动微SPIN系列开发的水泵方案介绍 以 MM32SPIN040C/MM32SPIN560C为主控

水泵是输送液体或使液体增压的机械。它将原动机的机械能或其他外部能量传送给液体&#xff0c;使液体能量增加&#xff0c;主要用来输送液体包括水、油、酸碱液、乳化液、悬乳液和液态金属等。 水泵以 MM32SPIN040C/MM32SPIN560C为主控。 水泵方案 MCU: MM32SPIN系列 1.输入…

redis主从复制详解

文章目录主从复制概述主从复制的作用主要包括&#xff1a;数据冗余故障恢复负载均衡高可用基石主从库之间采用的是读写分离的方式读操作写操作主从复制原理全量复制确立主从关系全量复制的三个阶段第一阶段是主从库间建立连接、协商同步的过程&#xff0c;主要是为全量复制做准…

业务逻辑复杂如何解决性能问题

0 前言 上节针对生成订单信息这个接口做了三个阶段的分析定位和优化动作&#xff0c;让TPS变得正常。不过&#xff0c;系统资源并没有完全用起来&#xff0c;这个接口显然还有优化空间。性能优化的过程中&#xff0c;要把资源都用起来。 在性能环境中做优化&#xff0c;把资源…

自动化测试框架之selenium

目录1 自动化测试1.1 单元测试1.2 接口测试1.3 UI测试1.3.1 UI自动化测试的优点&#xff1a;1.3.2 UI自动化测试的适用对象1.4 自动化测试流程2 selenium3 selenium IDE 录制脚本1 自动化测试 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统&…

50 openEuler搭建PostgreSQL数据库服务器-配置环境

文章目录50 openEuler搭建PostgreSQL数据库服务器-配置环境50.1 关闭防火墙并取消开机自启动50.2 修改SELINUX为disabled50.3 创建组和用户50.4 创建数据盘50.4.1 方法一&#xff1a;在root权限下使用fdisk进行磁盘管理50.4.2 方法二&#xff1a;在root权限下使用LVM进行磁盘管…

图解HTTP阅读笔记:第5章 与HTTP协作的Web服务器

《图解HTTP》第五章读书笔记 图解HTTP第5章 与HTTP协作的Web服务器5.1 用单台虚拟主机实现多个域名5.2 通信数据转发程序&#xff1a;代理、网关、隧道5.2.1 代理5.2.2 网关5.2.3 隧道5.3 保存资源的缓存5.3.1 缓存的有限期限5.3.2 客户端的缓存第5章 与HTTP协作的Web服务器 5…

学习系统编程No.18【进程间通信之管道实战】

引言&#xff1a; 北京时间&#xff1a;2023/4/11/21:17&#xff0c;今天的文章更新啦&#xff01;但是还是没有上热榜&#xff0c;所以我们需要继续更文啦&#xff01;我相信下一篇博客肯定是可以上热榜的&#xff0c;加油&#xff01;并且今天晚上因为有一节体育课&#xff…

Linux下让进程不再被拉起

Linux下为了防止应用挂掉&#xff0c;我们会设置服务进程来拉起这些应用。但某些流氓软件也会利用该机制使得它们被杀掉后能再被拉起来。本文讲述让这些进程不再被拉起的方法。 比如&#xff0c;有名称为recordmain.bin的进程&#xff0c;使用kill -9 杀掉它后&#xff0c;过几…

NVIDIA jetson tensorrt加速yolov5摄像头检测

link 在使用摄像头直接检测目标时&#xff0c;检测的实时画面还是有点慢&#xff0c;下面是tensorrt加速过程记录。 一、设备 1、设备jetson agx xavier 2、jetpack4.6.1 3、tensorrt 8.2.1.8 4、conda虚拟环境 python3.6 二、虚拟环境搭建及依赖 1、参考此博客安装torch Nvidi…

做自动化测试时所谓的“难点”

这篇关于自动化测试的文章&#xff0c;可能和你看到的大多数自动化的文章有所不同。我不是一位专职的自动化测试工程师&#xff0c;没有开发过自动化的工具或者框架&#xff0c;用的自动化的工具也不多&#xff0c;也没有做过开发&#xff0c;所以我讲不出那些现在很多人很看重…

[C++]日期类计算器的模拟实现

目录 日期类计算器的模拟实现&#xff1a;&#xff1a; 1.获取某年某月的天数 2.构造函数 3.拷贝构造函数 4.赋值运算符重载 5.析构函数 6.日期天数 7.日期天数 8.日期-天数 9.日期-天数 10.前置的运算符重载 11.后置的运算符重载 12.前置--的运算符重载 13.后置--的运算符重载…

前后端交互系列之Axios详解(包括拦截器)

目录前言一&#xff0c;服务器的搭建二&#xff0c;Axios的基本使用2.1 Axios的介绍及页面配置2.2 如何安装2.3 Axios的前台代码2.4 Axios的基本使用2.5 axios请求响应结果的结构2.6 带参数的axios请求2.7 axios修改默认配置三&#xff0c;axios拦截器3.1 什么是拦截器3.2 拦截…

Go分布式爬虫笔记(二十)

文章目录20 调度引擎调度引擎目标通道函数选项模式函数式选项模式的好处通道底层原理无缓冲区的通道带缓冲区的通道Select 机制的底层原理思考题在我们的课程中&#xff0c;schedule 函数其实有一个 bug&#xff0c;您能看出来吗&#xff1f;你觉得可以用什么方式找出这样的 Bu…

OTA A/B 分区升级 update_engine简介

近期猛然发现公司的项目都已经换成了AB升级&#xff0c;AB升级之前一直有所了解&#xff0c;只是一直都没有去仔细查看过其具体升级流程&#xff0c;这两天抽空捋了捋&#xff0c;简单整理下。 AB升级&#xff08;谷歌官网叫法无缝更新&#xff09;是自android7.0开始新增的一…

头歌(Linux之进程管理一):第2关:进程创建操作-fork

任务描述 在上一关我们学习如何获取进程的pid信息&#xff0c;本关我们将介绍如何编程创建一个新的进程。 本关任务&#xff1a;学会使用C语言在Linux系统中使用fork系统调用创建一个新的进程。 相关知识 在Linux系统中创建进程有很多函数可以使用&#xff0c;其中包括了系…

初识Elasticsearch

文章目录介绍一、什么是elasticsearch&#xff1f;二、基本概念三、安装elasticsearch与kibana四、安装kibana&#xff08;跟ES要在同一个网络中&#xff09;五、IK分词器总结介绍 好处&#xff1a;可以帮助从海量数据中查找需要的内容&#xff1b; 一、什么是elasticsearch&…

ETL工具-pentaho企业实战部署

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

C++二叉搜索树与KV模型

二叉搜索树与KV模型二叉搜索树概念与操作性能分析实现KV模型二叉搜索树 本章是为了C的map和set做铺垫 概念与操作 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小…