如果我们有多个敏捷团队在同一个代码库上工作时,如何将彼此之间代码互相冲突的风险小化?如何确保每个迭代结束时拥有一个干净的、可发布的软件版本?本文讲述了关于如何在敏捷的环境中与多个团队共同进行版本控制工作的实例??这正是我们在《Scrum and XP from the Trenches》中描述的公司所采纳的方式。

本文并非专为版本控制专家所写,实际上这样的专家在本文中找不到新东西。本文是为我们这些希望进行简单、有效的协作的人所准备的。任何直接参与敏捷软件开发的人,无论他承担何种角色,都有可能对其感兴趣??每个人都会用到分支和合并,而不只是配置经理。

介绍
本文讲述了关于如何在敏捷的环境中与多个团队共同进行版本控制工作的实例。我假定你已经熟悉了Scrum的基本元素、XP方法和任务板。这些方式不是我发明的,它们是基于“主线(mainline)模型”或“稳定主干(stable trunk)模式”。想阅读更多信息请查看引用部分。

撰写本文,是因为我一直在遇到需要类似内容的团队。许多团队在理解了模型之后,似乎非常喜欢这些模型。它也正是我们在《Scrum and XP from the Trenches》中描述的公司所采纳的方式。它真的可以帮助我们以更敏捷的方式来开发和发布软件。通过以易于阅读的方式来描述模型,也许我不再需要反复在白板前做解释了。)

注意这只是众多模式中的一种,不是“银弹“。如果你决定采用该模型,也许你需要做出一些变更来适应你自己的特定上下文。

目标

在多个团队构成的敏捷环境中,版本控制模型必须达成以下目标:

快速失败

代码冲突和集成问题应该可以被迅速发现。

经常修复小问题要胜过不常修复大问题。

一直可发布

即使经历了一个混乱的Sprint,也要保证至少有些可以发布的内容。

简单

所有的团队成员每天都会使用这些模式,所以相关规则和程序必须要简单明了。

单页总结(对于挂在墙上的内容)

如果该图让你觉得很迷惑,别着急,阅读本文即可。如果其中的理念对你来说很明显,读读本文也无妨。

版本控制模式

分支所有者&方针

下面是要遵循的一条简单规则。

规则:每个分支(即使是主干分支)都拥有一个所有者和一条方针。

不遵守上述规则,我们只能得到一片混乱。方针说明按照本规则,什么样的内容可以检入到当前分支中。所有者是负责定义和检查规则执行情况的人。

“完成”概念

一个用户故事怎么样才算“完成”?更明确地说,团队什么时候才可以把一个用户故事移入到任务版上的“完成”一栏之中?这又到底意味着什么?

我会给出下面的假定。

假定:“完成”的定义=“可发布”。
所以当一个团队成员说某个用户故事已经“完成”,并将故事卡移入到“完成”一栏中之后,客户可以马上跑到房间中说:“太好了!我们现在上线吧!“,而且团队中没有人会说:“别,先等等。”

你可以使用任何你喜欢的“完成”的定义。但是要记得??如果定义中没有完全包含“可发布”的含义,你要好好想想了:在“完成”定义中没有包含哪些内容?谁会来补齐这些内容?什么时候?如果在“完成”之后出现问题,又会发生什么?

“完成”分支
当一个故事“完成”后,它需要有一个落脚之处。使用我的关于“完成”的定义(“可发布”),意味着系统中的某个分支可以发布,这样该用户故事对应的功能可以进入到生产系统之中了。这是“完成”分支。

任何分支都可以是“完成”分支。我将会使用主干作为“完成”分支(这是一个不错的开始)。有时这被成为“主线”。

假定:主干作为“完成”分支。
主干方针:
任何时候都可以发布
希望尽早发布
“任何时候都可以发布”,这意味着:在任何时候,产品所有者都可以基于主干的新版本,发布新版本的产品。

下面是一个示例。

蓝色的线表示主干。每个绿色的球形图案表示一次代码检入活动。可以看到在本次Sprint中共检入了5次内容。虽然通常我们是在每个Sprint结尾时才进行发布,不过还是可以在任何时候从主干中发布产品。如果在接近Sprint结束时,有一半的团队成员生病,因此导致没有时间完成故事#5,我们还是可以进行一次发布。当然,我们也可以选择先不发布,以等待团队在另一个Sprint中完成故事#5。

“希望尽早发布”意味着如果我们不想让某个故事相关功能上线(或者说不关心它是否上线),不要检入该故事相关的代码。如果我不希望发布上图中的故事#3,这个分支被我毁掉了。由于这个分支不再是可发布的,我违反了分支的方针。

规则:不要在单一分支上合并不同的发布周期。

何时创建额外分支?

新分支的创建越少越好。下面是一条基于经验的原则。

推荐:只在下面这种状况下才创建新的分支:当需要检入新的内容,而且没有哪个现有的分支能够在不违反自身方针的状况下完成本次检入。

工作分支

好,假设我们已经有了一个很好、很干净的主干,并且在任何时刻都处于“可发布”状态。

等一下。“可发布”意味着已完成集成测试。这意味着我们必须要 运行集成测试。也是说我们要在向主干检入代码之前要运行集成测试。