团队或应用程序规模是否会影响发布过程?这得看情况。让我们想象一下一家只有一个小团队的初创公司。在这种情况下,团队通常会制作一个功能,然后发布它。现在,让我们想象一个大型项目,例如一个银行应用程序,有许多团队在处理它。
在这种情况下,可能应该有一个流程、发布周期,也许还应该有一些官僚机构。没有它,就会出现混乱。
那么,什么时候可以明确为您的应用程序设置这样的流程呢?
在本文中,我将分享我为 Dodo Pizza 应用程序(Android 和 iOS)实施 Release Train 的经验,以及我们团队实施 Release Train 时遇到的问题。
如果您是一个快速增长的 Android 或 iOS 项目的 Team Lead/Tech Lead,并且您尚未管理发布流程,我希望我们的经验能够对您有所帮助。
2021 年,我们已经在团队中使用基于主干的开发 (TBD) 方法。我们通过功能切换、分解任务以及运行单元和 UI 测试来覆盖代码。我们的功能分支寿命不长,而且我们有 CI 工作。
发布过程非常简单:谁准备好推出其功能,就推出它。
我们的分支工作流程大致如下。几个团队(灰色、蓝色、橙色和绿色)致力于不同的功能。由于我们是根据 TBD 进行工作的,因此每个功能都可以通过多个连续的分支来实现。
例如,灰色团队用 4 个步骤制作了他们的功能,蓝色和橙色团队用 1 个步骤制作了他们的功能,绿色团队用了 2 个步骤制作了他们的功能。
当团队完成一项功能后,他们可以推出一个版本。例如,如果蓝队完成了一项功能,他们可以发布版本。然后,橙色团队将完成一个功能并发布另一个版本。
正如当时看来,我们拥有完美的流程。在某种程度上它运作良好,但所有美好的事物都会结束。
出了问题:艰难、拥挤、不可预测
我们遇到的第一个问题是版本开始积累大量功能并变得太大。
团队并不总是希望立即发布他们的功能。发布和回归过程非常耗时,需要 3-4 天。因此,如果您的功能很小且不紧急,您并不总是能够自己发布它,因为其他团队可能很快就会发布它,并且它会包含在该版本中。大致看起来是这样的:
这是一个相当脆弱的安排,尤其是当团队数量开始增长时。许多团队开发了许多小功能,每个新版本中的新代码总量变得巨大。当有人要发布他们的大功能时,他们必须同时发布一整只猛犸象。
猛犸象释放导致:
我们需要做到这一点,以便即使示例中的蓝色和橙色团队不想发布,发布也会以某种方式完成。
每个团队都是独一无二的,每个功能都是不同的。有时,事情发生的方式是几个团队大约在同一时间完成他们的功能。在这种情况下,有很多“等我,我明天早上合并它,我保证!”四处走动。
最终,这样的瓶颈导致了:
我们需要做出两个关键的改变:
发布团队不需要等待任何人;
其他每个团队都应该知道下一个版本预计何时发布。
想象一下,蓝色团队制作了一个小功能,并期望橙色团队很快发布它。但出了点问题,橙色团队由于自身的一些问题也没有推出该版本。
结果,蓝色团队告诉业务部门,该功能很快就会投入生产,但事实证明还不够快。因此,无法预测该功能何时投入生产。
这并不意味着蓝队不负责任。如果他们有一个超级重要或紧急的功能,那么他们当然会自己发布。但在其他情况下,无法准确判断该功能何时可供用户使用。
正如您所猜测的,我们经常遇到此类问题。我们需要能够准确地判断客户何时可以在生产中获得某个功能,无论其大小或紧急程度如何。所有这三个问题(庞大的版本、瓶颈和缺乏可预测性)都是密切相关且相辅相成的。
然而,其中最基本和最重要的可能是缺乏可预测性。它会产生其他问题。
我们已经受够了;是时候做出改变了。发布列车应该可以帮助我们做到这一点。
术语“发布列车”有不同的含义:计划的发布过程,或管理发布过程的专门团队。在这里,我们要谈谈预定的发布过程。
我喜欢 Martin Fowler 在“管理源代码分支的模式”一文中描述的 Release Train 的方式,以及Thoughtworks 在其技术雷达中给出的定义(也许它也属于 Martin)。
这就是我们为自己定义 Release Train 的方式:
发布列车是协调团队之间发布的过程。所有版本都按固定的时间表进行,无论功能是否准备就绪。火车不等人。如果迟到了,就得等下一班了。
让我们用几个使用颜色编码的团队的例子来分解它。
发布列车按计划进行,并不取决于谁将哪些内容合并到主分支中。在下面的示例中,将发布蓝队和橙队的功能。剩下的就等下一趟车了。我们可以再等一段时间,但那样我们就会得到一头猛犸象。
同时,发布列车可以帮助我们更高效地规划工作。假设蓝队原本计划稍后完成一个功能。但由于每个人都知道发布日期,因此他们可以稍微重新安排计划以尽早完成该功能。
或者,相反,他们可以意识到他们肯定不会准时搭乘下一趟火车,因此他们可以安全地完成该功能,因为他们知道整个时间表。
在下面的示例中,蓝色团队想要发布并在发布之前合并所有更改。否则,可能会出现瓶颈。
最重要的是,Release Train通过设计为我们提供了可预测性。
这些例子对某些人来说似乎是显而易见的,但我们在问题出现时就解决了它们。当发布没有问题时,我们就不再使用 Release Train。当问题不断积累时,我们意识到时机已到。
我们做的第一件事是编写RFC 。 RFC 既指流程本身,也指许多公司在开始项目之前使用的设计文档。有些专门使用 RFC,有些使用 ADR,有些只是用更通用的术语“设计文档”来称呼它们。
在 Dodo Engineering,我们同时使用 RFC 和 ADR。
我们的 RFC 流程如下所示:
我们起草了一份RFC文件;
我们进行了小组讨论,收集意见,进行调整;
然后将 RFC 传达给更广泛的群体;
然后我们实施了它;
之后,我们收集反馈、跟踪指标并评估结果。
我们的发布系列的 RFC 文档的结构如下:
在起草RFC时,我们参考了其他公司的经验:
首先,我们提出了这个过程:
来自其中一个功能团队的 1 名 iOS 和 1 名 Android 开发人员;
质量保证工程师2名。
从原理上讲,我们的发布列车如下所示:
一个月后,我发现虽然第一次体验感觉很棒,
2021 年,我们的回归测试平均需要 3-4 天。 2022 年,我们设法将其缩短到 2-3 天,但有时会超出这个时间范围。我们继续通过 e2e 测试覆盖回归案例,但尚未达到 100% 的覆盖率。我们在每个平台上的回归案例覆盖率分别约为 70% 和 60%。
由此得出的结论是,只要回归测试需要几天时间才能完成,那么每周运行一个发布周期可能会很不舒服。
我们最终转向了两周的发布周期,发布列车现在看起来像这样:
来自其中一个功能团队的 1 名 iOS 和 1 名 Android 开发人员;
质量保证工程师2名。
如果一切按计划进行,流程如下:
这一切看起来就像每周一个周期,除了有足够的时间进行潜在的修补程序。这是扩展回归测试的样子:
也没什么大不了的;甚至还有时间进行修补程序。
我们的主要目标是提高可预测性。它可以分为两部分:
我们回答了“什么时候发布?”的问题。通过实施发布列车流程。现在,每个团队都能够回答“我的功能最终会在哪个版本中发布?”的问题。他们在计划和评估功能时独立地进行。
以前,不可能确定,因为另一个团队可能会或可能不会发布该版本。现在,一切都取决于该团队自己的规划。
为了进一步证实这一点,我们对移动开发人员、质量检查和产品经理进行了调查,并提出了其他问题:
Release Train 还帮助我们解决了代码冻结和发布冻结的问题。除了除夕夜(例如 9 月 1 日和一些节假日)之外,我们还经历了几个这样的日子。现在,有了发布列车,我们不必通过创建发布分支、回归测试等来适应这些日期。按计划发布工作;我们稍后会在商店里打开它们。
除了解决问题之外,我们还测量指标。我们来看看主要的。
我们衡量的第一个重要指标是发布的交付时间承诺。
这就是图表的样子。我用箭头标记了我们开始发布列车流程的时间点。
该图显示交货时间下降到六天左右。六天是长还是短?
有
我认为,对于标准移动应用程序,交付周期理想情况下应为发布周期长度的一半。这相当于每天合并一个任务到主分支中。也就是说,如果发布周期是 14 天,那么 Lead Time 的目标应该是 7 天。
我们跟踪的另一个指标是每次回归的错误数量。它描述了候选版本的稳定性。如果上一个版本是很久以前的版本,那么我们可能创建了很多可能包含大量错误的新代码,并且我们可能会花费更多时间进行回归和修复。
在某一时刻,这个指标减少到了三个错误。具体数字并不那么重要,但总体而言,您可以看到趋势有所下降。
我将简要讨论发布系列中还监控了哪些指标。
我们喜欢当前的流程,因为我们认为它已经实现了目标。我们也知道如何进一步改进它:
虽然我们规模相对较小,但我们不需要发布列车。当我们面临无法预测版本、版本大小和数量的事实时,我们决定实施版本列车。起初,我们尝试了每周发布周期,但由于回归耗时,我们不得不切换到两周发布周期。从那时起我们就一直这样生活。
现在,我们对发布有了可预测性,并且指标显示出积极的动态。我们计划通过 e2e 测试增加回归案例的覆盖范围,自动化分支机构的工作流程,并优化翻译流程。
我希望这篇文章和我们的经验会对您有所帮助,特别是如果您已经遇到过类似的问题并且它们让您思考发布过程。
非常感谢您阅读我的文章。我希望你喜欢它。如果您有任何问题或建议,请在评论中给我留言,我一定会阅读!
和
也发布在这里