实践者的 DevOps 之路(2. 迈出第一步: 分支模型)

DevOps 不仅涵盖了从开发,部署,线上监控的多个环节,还包括了组织文化,工作流程的变化,因此许多人在开始实施 DevOps 时往往觉得无从入手,或是匆忙之中采取了一些反模式,最终导致 DevOps 没有起到预期的效果。

那么该如何开始一个 DevOps 项目呢?或是如何启动组织内的 DevOps 实践呢?本文会从整个 DevOps 流程的第一步,分支模型开始,讲述如果落地 DevOps。

选择适当的分支模型

作为整个 DevOps 的开始,你的开发分支模型是非常重要的,与你的发布计划与频率息息相关。在主流的实践中有以下的几种选择,我会基于自己的经验分享各种不同模型的长处与缺陷。

基于主干开发的分支模型

它的优点是简单易用,如果你的团队不大,整个团队单纯负责一款产品的开发,那么你可以尝试这种分支模型。

整个流程很简单,master 即主干分支,它对应的是随时可以发布上线的稳定版本,任何开发人员都不应该直接在这条分支上提交代码。

Dev 即开发分支,所有的开发人员都在这条分支上工作,提交代码。hotfix 分支对应的是缺陷修复分支,对应 master 版本上发现缺陷需要修改的分支。

整体的工作流程如下图所示:

从上图稍做修改之后就会发现,这种模型需要固定频率的合并代码与发布。假设你的团队是采用例如 Scrum 这种敏捷的工作方式,每个迭代(1 周或是 2 周)发布一次,那么此时 dev 代码会自动合并到 master 分支。master 分支的代码经过自动化测试,回归测试等,就可以认为是 production ready 状态了。

对于开发人员的要求则是要有良好的开发习惯,最好是 TDD 的拥趸,在开发一段代码,通过 UT 后,就提交到 dev 分支,而不是开发了3,4 天之后才提交,从而避免不必要的代码冲突。

当你的系统是个大型的单体应用,你的团队人数众多,又分为数个小团队,每个小团队开发各自不同的 feature,那么这种模型的缺陷就很明显。

首先如果系统各个模块的边界不是那么清晰,隔离做的不好,那么团队提交的代码很可能频繁的冲突或是破坏集成测试,造成团队开发效率的降低。

其次固定频率发布的优点是有计划,可预期发布的功能,而随之带来的无法灵活的响应需求做到完成某个功能即上线。同时在一些大型团队,发布的频率无法做到 2 周一次,往往是 1 个月一次,这会让这种模式的缺陷愈加严重。

如果你的团队规模不大(5 ~ 10),开发的则是一款中小型的应用,那么我建议你采用基于主干开发的分支模型,快速,简单,易于上手。

GitFlow

GitFlow 是由 Vincent Driessen 提出的一种 Git 分支模型,网上的讨论很多,下面的图片来自作者的文章。

网上对于 GitFlow 的讨论已经很多了,你可以在以下的连接获得更加详细的信息与工具。

git-flow 备忘清单

https://danielkummer.github.io/git-flow-cheatsheet/index.zh_CN.html

在实践中大家对于 GitFlow 的诟病之处主要在于两点,其一是工作流程稍显复杂,需要对开发人员做一定的培训。其二是如果 feature 划分不合理,出现需要开发很长周期的 feature 时,合并回 dev 分支所遇到的冲突问题会很明显。

有部分开发人员的观点是,除了主干分支之外,不应该长时间的存在一个公用分支,这会造成分支合并时需要额外的时间解决代码冲突。从精益的角度而言这是一种浪费。应该频繁的提交到主干版本,通过 CI 来保证主干的稳定性。

从我的角度而言,GitFlow 在某些项目上表现的很好,但是在另一些项目上可能就存在不少的问题。但是仔细分析,这往往与 GitFlow 没有什么太大的关系,而是整个团队的迭代节奏,工具的熟练程度,以及 feature 到 user story 的拆分。如果你的团队规模在 10 人以上,对 git 的使用很有经验,并且按照类似 Scrum 的流程运转的很流畅,那么我建议你可以考虑使用 GitFlow 的分支模型。

GithubFlow

从名字上可以看出,这是由 Github 提出的一种分支管理模型。下面的图展示了工作的流程,你会发现整个流程与基于主干的模型非常类似,只保留一条 master 主干分支,任何一个 feature 的开发都会新建一条分支。但是在合并的过程中,GithubFlow 是依靠 PR(Pull Request),由主干的维护者 code review 之后再合并的。

GithubFlow 的优点也是在于简单,基于 feature 开发。但是它严重依赖于团队有健全的 code review 机制,项目需要专门留出 code review,PR 审核的时间。之前参与过的项目中有很多 PR 的审核流于形式,往往较为宽松,只要没有冲突就直接通过,对整个项目的代码质量造成了很大的伤害。

反思

上面 3 种是我在之前项目中使用过的分支模型,在我做项目回顾时发现,其实并不存在一种完美的分支模型,只有适合你团队的分支模型。但是所有这些模型的目标都只有一个,就是一定要有一条时时刻刻 production ready 的分支。同样的任何一个分支模型都需要团队在其他方面最佳实践的支撑,例如规划迭代,单元测试,user story 编写, code review 等,具体可参考下图。

所以这也是我在文章的一开头就提及的,DevOps 是一个系统性,全局的实践,其中的分支模型亦是如此。当你觉得你的分支管理十分混乱,每次发布前在代码集成层面麻烦不断时,不然先看一下其他相关方面的实践做的好不好,而不是草率的换一种分支模型,这往往会暂时解决一个老问题,又引入一个新问题。

最后,我的建议是,如果你的团队规模不大,产品也较为简单,可以从基于主干的分支模型开始。如果你的团队已经在使用例如 Bitbucket,GitLab 等支持 PR 的工具,那么我觉得你不妨使用 GithubFlow,培养团队内部 code review 的习惯。知道团队达到一定规模时,再尝试 GitFlow。

下一篇我会介绍 DevOps 中的 CI/CD,希望你不要错过!

相关阅读:

面对疫情这样的复杂问题,有什么招呢?

疫情中的员工关怀,我只服这家公司

DevOps关键能力之产品和流程 - 重磅新书预览《加速》

小说体敏捷/DevOps转型教科书

和实战经验分享

购书指南


纸质书、电子书在京东当当亚马逊、微信读书等渠道已全面上架,搜索关键字“猎豹 敏捷”即可找到。点击阅读原文可直接购书。

有声书已登录喜马拉雅、微信读书,适合路上听书的你。

关注公众号看其他原创作品

敏于思 捷于行 

坚持每周输出一篇高质量文章

觉得好看,点个“在看”或转发给朋友们,欢迎你留言

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值