【DevOps研发管理方案】三:代码管理

目录

一、代码托管

二、Git FLow 工作流程

三、 分支管理

1. 基本要求

2. 版本号

3. 角色划分与权限

4. 分支说明

5. 分支创建规则

6. 分支回收规则


一、代码托管

使用Git/SVN等开源版本控制系统进行代码托管。

二、Git FLow 工作流程

推荐使用Git Flow的模式进行代码分支管理。在使用Git Flow工作流程管理代码时,必须按照以下步骤执行。

说明:

  1. 由开发管理员负责在统一代码仓库里创建空白的仓库,并clone到本地,初始化仓库,并push到远端。
  2. 在统一代码仓库上设置保护分支,把master、develop分支保护起来,只有开发管理员可push。
  3. 功能开发者clone代码到本地,然后初始化仓库。
  4. 然后再开始新建功能分支,进行开发工作。
  5. 新功能开发全部完成或部分完成后,功能开发者把最新代码push到远端同样的新功能分支里,并在统一代码仓库发起Merge request给开发管理员。
  6. 开发管理员review代码,选择合并代码到develop分支,并可选择删除已经合并的新功能分支。
  7. 当开发管理员处理完合并请求后,功能开发者切换到develop分支,直接删除自己的本地分支及远程分支,不要点击完成(Finish Feature),此时开发者pull远端develop分支最新代码即可,可忽视本地的push提醒。
  8. release、hotfix分支和feature分支操作类似。
  9. 不可点击完成新功能、完成发布版本、完成修复补丁,因为这样会导致自动合并代码到master或develop分支。

Git Flow 工作流程

 Git Flow 工作流程

三、 分支管理

1. 基本要求

【强制】每一次commit必须有注释,注释内容遵循注释规范。

【建议】任务拆分时,建议合理控制任务粒度,一个新功能任务可一人独立完成,即一个feature新功能分支一人独立完成。

【建议】一次commit只做一件事情,便于后期版本回滚。

【强制】正确为每个项目设置Git提交用到的user.name和user.email信息,以公司邮箱为准,不可随意设置以影响无法正确识别。

【强制】每一个项目根目录下都必须提供readme.md文件,用来说明当前项目的主要功能。

2. 版本号

【强制】版本号(tag)命名规则:主版本号.次版本号.修订号,如2.1.13。

  • 主版本号:当API兼容性变化时,主版本号需要递增;
  • 次版本号:当增加功能,但不影响兼容性,次版本号需要递增;
  • 修订号:当修复bug但不影响兼容性,修订号需要递增;

【强制】版本号仅标记于master分支,用于标识某个可发布/回滚的版本代码。

【强制】对master标记tag意味着该tag能发布到生产环境。

【强制】对master分支代码的每一次更新(合并)必须标记版本号。

【强制】仅管理员对master进行合并和标记版本号。

3. 角色划分与权限

用户有四种角色划分:

  1. 功能开发者:模块中功能的开发人员,拥有浏览、push非主分支、提交Merge request的权限;
  2. 开发管理员:由项目模块开发的小组长(team leader)担当,拥有管理git项目、合并分支和代码的权限,可以进行代码审查;
  3. 发布管理员:由生产环境发布团队指定人员担当,拥有建立和管理Git项目、合并分支和代码、给master打tag版本号等权限;
  4. 测试管理员:由测试团队指定人员担当。

【强制】用户有五种角色权限:Guest、Reporter、Developer、Maintainer、Owner

  1. Guest:可以创建issue、发表评论,不能读写版本库;
  2. Reporter:可以克隆代码,不能提交,【测试管理员】赋予该权限;
  3. Developer:可以克隆代码、开发、提交、push,【功能开发者】赋予该权限;
  4. Maintainer:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,【开发管理员】、【发布管理员】赋予该权限;
  5. Owner:可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员。

注:开发管理员和发布管理员角色相同,但操作的项目范围不同。发布管理员可操作当前项目组下的所有项目。

组和项目有三种访问权限:Private、Internal、Public

  1. Private:只有组成员才能看到
  2. Internal:只要登录的用户就能看到
  3. Public:所有人都能看到

4. 分支说明

每个Git项目固定含有master、develop、feature、release、hotfix分支类型。主分支master和develop是保护分支,只能进行合并请求,均不可直接提交代码。

功能需求或常规Bug修复,从develop拉取feature分支;线上紧急问题修复,从master拉取hotfix分支。

名称

master

release

develop

feature

hotfix

说明

线上稳定版本

待发布分支

当前正在开发的分支

功能分支,每个功能需分别建立自己的子分支

紧急修复分支

命名规范

master

release-xxx

develop

feature-功能名-版本号

hotfix-功能名-版本号

分支命名

master

release-v1.0.0

develop

feature-login-v1.0.0

hotfix-fixorderdetail-v1.0.1

pom文件版本定义

xxx-1.0.0-RELEASE

xxx-1.0.0-RELEASE

xxx-1.0.*-SNAPSHOT

xxx-1.0.*-SNAPSHOT

xxx-1.0.0-RELEASE

合并目标

-

master/develop

master

develop

master/develop

合并操作

-

merge request

merge request

merge request

merge request

创建人

发布管理员

发布管理员

开发管理员

开发者

开发者

生命周期

全过程

版本发布后

全过程

功能开发完成后

紧急修复bug并验证后

生产环境分支。

  1. 操作权限:仅管理员。
  2. 合并说明:-
  3. 推送说明:-

主开发分支,此分支包含:正在测试、等待测试的代码,属于不稳定代码分支。

  1. 操作权限:仅管理员。
  2. 合并说明:-
  3. 推送说明:-

新功能开发分支。

  1. 操作权限:仅允许对应开发人员操作。
  2. 创建说明:创建自develop。
  3. 合并说明:合并到develop:新功能开发完成,等待测试。

预发布分支。

  1. 操作权限:仅允许对应开发人员操作。
  2. 创建说明:创建自develop。
  3. 合并说明:
    • 合并到develop:预发布环境测试通过,修复代码回归。
    • 合并到master:预发布环境测试通过,发布。

生产环境问题修复分支。

  1. 操作权限:仅允许对应开发人员。
  2. 创建说明:创建自master。
  3. 合并说明:
    • 合并到develop:问题修复完成并测试通过,修复代码回归。
    • 合并到master:问题修复完成并测试通过,发布。 

5. 分支创建规则

👉 新需求加入

如有一个订单管理的新需求需要开发,首先要创建一个 feature-[新功能] 分支,步骤如下:

  1. 基于 develop 创建新的本地分支 feature-[新功能]。
  2. 本地开发、测试。
  3. 需求在 feature-[新功能] 分支开发完毕,准备提测时,要先发送代码合并请求,经开发管理人员代码审核通过后,将代码合并到 develop 分支,等待测试人员测试,并删除该远程分支。
  4. 测试人员在 develop测试,不通过则回到第1步;测试通过后,研发人员再将代码发布到 release 供测试人员测试。
  5. 测试人员在 release 测试,不通过则回到第1步;测试通过后,研发人员再将代码发布到 master 和 develop 分支。
  6. 最后,待本次迭代内的所有特性均完成了测试,那么在 master 上打TAG标记版本号,准备发布新版本。

👉 普通迭代

若有一个订单管理的迭代需求,如果开发工时<1d,直接在 develop 开发,如果开发工时>1d,那就需要创建分支,在分支上开发。开发后的提测上线流程与新需求加入的流程一致。

👉 修复测试环境 Bug

在develop测试出现了Bug,需要新建分支进行修复。修复后的提测上线流程与新需求加入的流程一致。

👉 修复预上线环境 Bug

在 release 测试出现了Bug,则直接由开发者在release分支修复并提交。当测试完成之后,合并 release 分支到 master 和 develop 分支,此时 master 为最新代码,用于上线发布。

👉 紧急修复正式环境 Bug

上线运行一段时候后出现了严重Bug,需要紧急修复的,步骤如下:

  1. 基于线上版本的TAG创建新的分支hotfix-[BUG]。
  2. 本地开发、测试。
  3. 修复完毕,推到远程分支。
  4. 将该远程分支发布到测试环境。
  5. 测试不通过,则回到第2步;测试通过,则将 hotfix-[BUG] 代码合并到master 和develop 分支,同时删掉 hotfix-[BUG] 分支,打TAG,准备发布补丁版本。

6. 分支回收规则

  • master分支:长期存在。
  • develop分支:产生于master分支,并长期存在。
  • feature分支合: 合并回develop分支,经测试通过后,删除feature分支,或者feature分支与前期需求不符,直接舍弃。
  • release分支:在release分支上进行充分测试,并修复Bug,合并回develop分支和master分支后,然后删除release分支。
  • hotfix分支: 紧急Bug修复完成后,合并回maste分支,测试验证通过,再合并到develop分支,然后删除hotfix分支。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
刚刚发布的ThoughtWorks技术雷达 建议技术团队“暂缓或谨慎”使用反模式“CI theatre(伪CI,可以理解为不完整的持续集成)”。 “伪CI”描述的是实践持续集成(CI)过程中的一些错觉,然而这些并不是真正的CI实践。 基于持续集成,我和同事 Emily Luke做了一些研究, 我将分享伪CI是什么样的,为什么我们建议你“暂缓或谨慎使用”,以及预防伪CI的方法。持续集成我最喜欢的CI定义来自于continuousdelivery.comCI开发人员定期(至少每天)将他们所有的工作集成到主干(也称为主线或主干分支)这个引用中暗含了CI实践的两个基本原则。第一个是“把他们所有的工作集成到主干”;第二个是“至少每天”。对于CI还有一系列其他原则和实践,例如:将所有内容都检入您的代码库,构建每个提交,自动化构建,保持快速构建,并有可以自我验证的代码, 还有Martin Fowler 关于持续集成的评论中的可视化故障并立即修复故障等。我个人认为 每天至少检入代码到主干分支一次 是CI的基础。没有达到这一点就只是伪CI而不是真正意义上的CI。伪CI是什么样的?这是我们调研到的一个故事,一位经验丰富的开发人员(让我们称他为David)来自湾区的一个中型创业公司,每周有两次产品交付。 David说他的组织正在践行CI,他说:“是的,我们用Circle CI”,他描述了一个具有挑战性的场景,曾经在一个分支上工作了一段时间,大约修改了100个文件和7000行代码,然后在代码审查阶段就开始招架不住了,因为他要向他的同事解释所有的代码变更的原因。“最具挑战性的事情是你最终要将一大堆功能集中到一个提交里,因为它们都是这个组件的一部分”,他解释说:“我希望有一个更好的方式来分解这些提交,因为很难把所有事情(变更历史)记在脑子里。”如果这个情况你听起来很熟悉,那么你也在做伪CI。 如果有下面的这些场景,那么你们就是在做伪CI:当有人问起你们在实践CI吗? 如果你说我们有一个CI服务器并且我们使用X工具在我们的调查中,只有10%的参与者承认有CI服务器与CI践行不一样。 相反,90%的个人表示他们正在践行CI,无论他们是否有专门从事CI的基础知识。 所以简单的认为只要有一个CI服务器就是“在做CI”,这就清楚地表明是在做“伪CI”。使用长期开发分支,但不会定期检入master主干在David的故事中,他们并没有实践每天检入master主干,这就是“伪CI”的标志。 这是我们在调研中常看到的一种模式,其中团队在master主干上运行CI,但不频繁构建,也不是每天都在提交。 或者他们在分支上运行CI,但不会频繁的集成到master主干。 只对特性分支运行CI,其实应该称之为持续隔离(continuous isolation)才对.合并分支时感到焦虑和疲惫真正的持续集成要把代码所有者的责任意识扩展到整个团队。 这改变了团队内部人员的观点以及他们对失败构建的态度。 不再是“我的宝贵的分支”,或是“我的错误导致构建被破坏”,而是“我们的代码”和“我们的失败”。David遇到焦虑和疲惫的事实清楚地表明,他忽略了CI的一个重要的优势:持续反馈和代码集体所有权。伪CI还有更多的一些现象,虽然我们发现有一些并不那么常见,但它们仍然存在一些问题,构建的时候,仅有极少的测试覆盖允许构建长时间处于失败状态虽然David的团队引入了一个备受尊崇的CI工具和常见的流程,如特征分支和代码审查,但他们并没有实施全套CI实践,因此错过了许多好处。 我们遗憾的发现,在我们的研究的组织中90%发生了这种情况。一些组织实施伪CI中反而错失了CI的主要优势 - 快速反馈,代码集体所有权,并准备达成持续交付如何避免,预防和解决伪CI的问题?如果您确定可能正在遭受伪CI之苦,则可以通过种方式来解决问题并进行持续改变。1. 提交更频繁回到根本,尽量频繁地提交,每天至少提交一次应该是最低目标。 如果你还没有开始做CI,这就是你可以开始的地方,即使你在做CI,依然会有改进的空间。我喜欢“频率降低难度”的说法。 往往我们在做一些事情时,任务变得越小,则其更容易被实现。 持续集成就是是一个典型例子。 我的建议是要更加频繁地检入你的代码代码库并且将开发分支集成到主干分支,至少每天集成一次”。2. 基于主干分支开发有很多论坛在讨论基于主干还是基于开发分支进行开发,我不想讨论那些血淋淋的细节。 然而,在我们的调研中,当我们与一些曾经在实践CI过程中感到痛苦的人交谈时,没有引入主干开发的团队对此有更深刻的感受。 DevOps现状调查报告-2016 还发现,基于主干开发和持续集成是达成持续交付的关键因素,同时也能建设更高效能的团队。基于主干的开发肯定会有一定的挑战,但它可以把问题提前暴露出来,而不是要等到代码合并、代码审查甚至到延迟发布的时候。如果你想达到更好效果的CI和CD,我建议在主干上做开发,或者如果你更愿意使用短周期的临时分支(合并到主干之前不到一天)进行开发,那么最好同时不要超过个以上的活跃分支。3. 自动化自动化是做好持续集成的基石,所以如果你还没有自动化一切,现在是开始的好时机。 如果你认为已经实现了所有自动化的功能,那么每次有人手动地做任何事情超过一次,便要问自己“这个为什么不能自动化”? 我已经观察到自动化不仅可以帮助您在CI中变得更好,还可以帮助您开始持续交付。总结现在你知道什么是伪CI了,如果你的团队正在这么实践伪CI,那么你可以阻止这种情况继续发生了。 如果您仍然感到困惑,我建议你在Martin Fowler的博客“CI Certification test”做一个测试, 以确认你的组织是否正在做可靠的CI。 如果你通过了CI测试,那太好了,现在是考虑您是否准备好实施持续交付的时候了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值