释放火车。Yandex报告

不同的Yandex团队(和任何大型IT公司)的发布过程以类似的方式安排,但在许多细节上有所不同。移动开发人员有自己的特点:他们的版本受App Store和Google Play中布局顺序的影响。Android开发人员Dmitry Polyakov姆波利亚科夫 他谈到了周围的过程-他的团队如何按计划发送发布训练,如何启动计划外发布,将预告片添加到已经发布的发布中以及如何保持进度。


-大家好,我是Dmitry Polyakov,我所使用的移动应用程序的Android开发者。



现在分为两个小组-我负责Android和iOS开发-每个小组13个人。这使我们可以并行执行许多很酷的任务,并迅速将它们发布给用户。在报告中,我将告诉我们如何学习使用git并生活在一个存储库中。

接下来,我将告诉您我们的发布周期如何运作。经理来找我们,说我们想尽快推出此功能。因此,也许任何经理都想要,所以我们设置了发布流程,以便每周进入App Store和Google Play。我还将讨论我们拥有的工具,我建议您尝试使用这些工具,因为它们很棒。

Git流


让我们从Git Flow开始。作为基础,我们采用了经典的Git Flow,但是在我们的团队条件下,它发生了很大的变化。您看起来也很合适,也许有些东西适合您,但有些不适合。每个团队使用git都有自己的方法。

它如何与我们合作? Epic是您的功能的根分支,具有一些出色的功能。为了更加清楚,让我们立即看一下产品示例。



经理来说-开发人员,使我们具有应用程序中选定产品的愿望清单功能。开发人员将启动一个新的分支史诗并将其称为“愿望清单”。



此外,他将其分解为较小的任务,这些任务从跟踪器开始。也许这是与网络一起工作,渲染UI,编写测试。对于每个此类功能,他都在跟踪器中启动任务。并且,一旦他开始完成任务,便开始相应的功能分支。从同一个史诗中吃早午餐。

一旦完成一项此类功能的工作,他便通过池请求将其倒入史诗中。当团队中的其他开发人员检查您的代码时,池请求就是一种机制。如果他们不喜欢这些东西,那么您的代码可能就无法达到史诗般的水平,这意味着直到您与他们达成协议后,您才能被释放。

我们团队中有两名审稿人。它们是随机分配的。这是一个自动化的过程,它从最近使用与池请求中更改的文件相同的开发人员中选择。



因此,事实证明,几个具有自己特征集的史诗并行存在于项目中。史诗只能具有一个功能。如果我们要通过池请求将此功能上载到史诗,则会发生这种情况。



一旦完成了一项史诗中所有功能的工作,该任务首先便会交给测试团队,质量检查团队,然后他们对分支机构进行功能测试。一旦发现错误,就可以将其编辑为本史诗的一部分。一旦修复了所有错误,您就可以将此史诗填满到开发中。在这里,您的团队尚未进行任何其他代码审查,因为在史诗般的功能冻结阶段已经查看了所有代码。

我们的开发就是这样一个分支,已经经过测试的代码将访问该分支,因为在史诗级阶段,已经对其进行了测试,并且代码通过了池请求。



这使我们能够在发布周期开始时安全地创建一个新的发布分支。不用担心会有许多尚未经过测试的错误。因此,我们正在从development创建一个新的发行分支,正在对其进行测试。一旦测试了发行版,并且我们准备进一步进行开发,该分支将合并到master。

有时我们有修复程序,并且有单独的分支类型。这是一个非常短的发行版,需要快速推出。我们没有时间等待三到四天才能开始下一个发布周期。通常这很小。

例如,如果某种错误已投入生产并且非常关键,我们需要紧急修复它。因此,我们停止当前版本,对此错误运行修补程序,并更新我们的版本。但是修补程序并不总是关于错误的故事。有时我们有产品需求。



例如,在莫斯科引入自我隔离模式后,我们就有了产品需求,以便用户可以在不接触的情况下订购产品。现在,在我们的应用程序中下订单时,用户可以选择“留在门口”功能。快递员到达后,将包裹留在门下,然后将其交给您而没有接触。

通过此修补程序中的任务,我们还包括了各种不同的小部件,这些小部件敦促您留在家中并通过快递订购商品。现在不要去接站。我们通过修补程序推出了这些任务,因此我们可以将它们尽快传达给用户,因为我们认为它们很重要。

有了修补程序后,我们就会从主菜单中进行午餐。从开发开始就不能轻描淡写了,因为在那一刻,新的史诗可能会发展起来,而史诗尚未发行。但是我们不想将这些史诗带给我们进行修复,以使它们不会随机影响我们并阻止我们的修复程序。修复程序完成后,我们将其注入master并添加到开发中,因为该代码在development中尚不存在。



Master是与应用程序最新版本相对应的代码库,该应用程序现在位于用户的商店中。这很干净,没有错误,因为功能和回归测试已经通过了,这是一个备份分支。

发布完成后,我们还将其重新投入开发。因为作为该发行版的一部分,可以找到在功能测试中未发现的错误,并且不同的史诗可能会相互冲突。因此,我们还将发行版本注入到development中,以便我们也可以在开发中获得这些修复。



关于史诗,可以做很多工作,为了跟上开发中的代码,开发人员有时会将其添加到史诗中,从而减少了冻结冲突。



由于我们将开发添加到了史诗中,因此出于同样的原因,史诗也需要添加到您的功能中。



在史诗和功能分支的名称中,我们在任务跟踪器中有一个票证号。这很酷,因为正是根据票证号,我们可以从应用程序的任何部分完全找到票证号,票证在其中发生了更改,谁编写了此代码以及出于什么目的进行了编写。



release and hotfix分支在其名称中具有应用程序的当前发行版本号。一些团队将修补程序编号与发行版编号结合在一起,以以下事实证明这一点:修补程序很小,对于用户而言可能并不重要。因此,它们不会增加应用程序的版本。我们不使用这种方法,因为制造商会提供各种崩溃报告,并且我们想确切地了解此报告是在修补程序中还是在发行版中,以便知道在哪里查找问题。



掌握和开发是不断存在于我们存储库中的分支。一旦创建,就可以生活了。因此,它们的命名如此简洁。

那就是我们的生活方式。现在我们舒适,方便。

发布火车


我们进入发布流程。但是在讨论发行版本以及如何构建它们之前,我将讨论支持发行版本所必须扮演的角色。

我们有一个待命的开发人员,他会在一个工作周内停止处理产品任务,并修复当前版本中的错误。如果他没有当前版本的任务,他将修复一些我们积累的技术债务,从积压中获取任务并进行纠正。

还有一个值班的测试员。他还将在一个工作周内停止测试产品任务,并检查当前版本。如果他没有当前版本的任务,则他将测试已更正的内容作为技术债务的一部分。



该版本从星期五开始。在这一天,我们有一个艰巨的截止日期。晚上18点,值班的测试人员单击“开始发布”按钮。此刻之后,将要注入到develop中的所有内容将不再属于当前发行版,因为在单击按钮后,已经创建了发行​​分支,develop已经合并,并且不会再有更多的注入。

另一个重要过程将在星期五进行,这是当前版本中的另一个项目,我将在后面讨论。



我们在周末休息,所以第二个发布日是星期一。值班的开发人员首先进行分析。他正在研究当前版本中代码方面的更改。在当前发行版分支和master之间获取git diff。通过这种差异,他可以查看哪些组件受到了影响。它可能会影响结帐流程或购物篮,并且不影响使用基座的工作。

因此,他形成了在测试期间将要测试的各种情况的列表。这有助于我们加快回归速度,而不是检查整个应用程序。编译列表后,测试团队将检查应用程序,值班的开发人员将更正错误。如果他有很多错误,则可以将一部分委托给其他最近使用这些代码的开发人员。



在星期二,我们将继续测试发行版并修复发行版错误。下午,我们的回归测试结束,我们准备出发了。我们发布了发行火车-实际上,甚至发布了数个发行火车,因为我们最近为我们进入了一个新的市场。我还建议您不仅尝试在Google Play上发布,还要在其他一些网站上发布。优点不仅在于您会获得新的忠实受众。

不知何故,我们发布了版本,几个小时后发现用户中的错误数量已经大大增加。我们查看了这些错误,对其进行了分析,发现它们仅在华为设备上发生。我们无法立即了解发生了什么,但是我们有了华为,我们对其进行了测试,发现了一个错误,将其修复并进行更新。

当我们在Google Play上获得更新时,我们看到了一个大横幅,上面写着,由于世界目前的情况,Google Play的负载非常大,他们没有时间像往常一样检查应用程序。事实证明,我们还没有时间检查我们的应用程序,我们没有接触到Google Play用户,而是仅在华为AppGallery中发布。这就是为什么我们仅在华为上存在错误的原因。因此,甚至可以在发布到Google Play上之前检测并修复关键错误。

接下来,我将告诉您出版物是如何通过Google Play进行排列的,因为那里的用户非常多。在华为AppGallery,我们最近离开了,并且仍在努力了解那里的一切安排。

我们不会立即在Google Play上向所有用户发布,因此某种随机错误不会影响我们的整个受众。我们仅向所有认可可能存在错误的测试人员公开,但是他们将是第一个接受我们的更改和发布的人。此外,我们仅发布5%的受众群体。



在星期三,值班的开发人员正在观看无崩溃的新版本。对我们来说重要的是,没有新的崩溃,而且没有太多的旧崩溃。如果一切正常,他仍将检查产品指标。例如,使订单数量与同期相比不下降。如果我们的产品指标和无崩溃性能都很好,那么我们将再推出5%,总计10%。



在星期四,值班的开发人员在商店中检查评论。实际上,他在星期三看他们。没错,在星期三,我们的观众仍然很少,只有一两个评论。但是在星期四,有更多的评论来判断发布。可能有10-15件。

如果我们有很多指标和图表,他为什么还要看评论?该应用程序可能不会崩溃,即使指标可能是正确的。但是用户可能有字体,或者某些过滤器对他不起作用。我们尝试使用户尽可能方便地使用该应用程序,并分析此类评论,纠正用户遇到的错误或问题。

如果评论井井有条,正常运行也是正常的,并且产品指标也没有下降,那么我们已经推出了20%。



因此它开始于星期五,即我们发布的发布日。我想谈的第三点是,星期五我们将完成当前版本。我们将其从20%立即降低到100%。这似乎是一个很大的飞跃,而且风险很大。但这取决于团队和您的听众。

20%的受众群体使我们很有可能判断发布的稳定性。如果一切都好了20%,并且在星期五我们没有发现任何问题,那么我们将直接前进到第100位。

我知道在Google Play上有使用生活技巧的团队-也许他也会为您提供帮助。您可以以99.9%的比例推出而不是100%。这将使您在Google Play上具有一个按钮来紧急停止发布。如果您将其展开为100%,此按钮将消失。但是,正如我所说,我们有百分之二十的受众可以准确判断发行的稳定性。因此,我们从容地推广到100%,这使我们免于其他步骤。然后您需要再滚动0.01%。

这是我们的过程,因此我们每周骑行,并尽量避免迷路。


我们还需要哪些其他工具来支持用户的良好生活?这些是强制更新,软更新和功能切换。



强制更新-一种机制,如果版本过时,则会阻止使用该应用程序。在服务器的管理面板中设置了被认为已过时的版本。并且一旦在此更改了编号,某些应用程序将带有一个不允许您离开的框。只有一个“刷新”按钮,用户将被迫升级。

我们尝试尽可能少地使用此机制,但是有时它非常重要。例如,如果我们破坏了向后兼容性,则推出旧代码不支持的新功能。然后,该应用程序的过时版本的用户可能最终处于不一致状态。他将去上篮,例如,他将没有订单。他不明白为什么,尽管在新版本中已记录了所有错误,并且很清楚为什么无法下订单。



为了帮助强制更新,提供了软更新。这是Google的本机,它只是嵌入在您的应用程序中,不会阻止使用。但她说-Google Play上有一个更新,请安装并更新,您将获得新奇的功能。

最初,它是通过这种对话来实现的。这是Android的原生设计。然后可以将其嵌入到您的应用程序中。例如,我们在配色方案的小部件“更新应用程序”中实现了它。

软更新使我们可以大大减少版本的尾部,并且仅根据文档即可实现。如果发行版本很多,请尝试一下。



另一个重要工具是功能切换。它允许您在用户端调整部分功能,并在管理面板中对其进行更改。我们可以通过一组功能来打开和关闭服务器,而无需进行其他应用程序更新。

让我们讨论Feature Toggle如何在第三方应用程序示例-车辆上工作。最初,开发人员只有这种自行车,它已经具有两个Feature Toggle:一个马达和一个大尺寸。客户使用自行车,然后测试团队说:我们测试了电动机,电动机可以工作,行驶,冷却,让我们为用户打开它。



我们转到管理面板,在不更新用户的情况下打开Feature Toggle和单车,旅途中它会变成助力车。用户感到舒适,这使他可以更快,更方便地移动。

该产品正在开发,受众在增长,它不再适合一辆轻便摩托车。用户希望与家人同行,一起骑行。开发人员和管理人员提供了附加的功能切换-大尺寸。我们在管理面板中启用了它,用户的车辆在旅途中变得越来越大。



看起来很酷:Feature Toggle可以帮助我们。的确如此,但是您可能会遇到一些问题。例如,您需要监视向后兼容性和功能切换兼容性。假设在某个时候应用程序损坏了电动机,发生了崩溃或错误。否则,这台电机会占用我们很多资源,而我们将无法为太多的用户提供支持。然后我们必须关闭它。

但是我们不希望用户的应用程序消失。尽管他仍然有一个很大的Toggle,但我们想给他机会来使用该应用程序。因此,当我们关闭电动机时,我们必须具有一个后备机构来控制车辆。在这种情况下,这是一种混合动力。



也许值得考虑屋顶倾斜。驾驶员坐在这样的座位上可能会感到不舒服。但是他仍然能够驾驶车辆,使用该应用程序并且不会走路。

我们还如何使用功能切换?假设后端仍在开发中,尚未准备发布。然后,我们可以开发功能的一部分,支持与后端进行所有通信的API合同,支持UI并在功能切换关闭的情况下推出。后端准备就绪后,我们将测试一切是否正常,如果可以,请启用Feature Toggle。然后,无需更新用户即可获得新功能。也就是说,我们已经有一个受众,我们将立即出现在此受众中。太棒了



现在,正如我已经说过的那样,我们每个Android和iOS开发团队中都有13个人。我们在一个存储库中处理一个Git Flow,建立了计划的发布流程,缩短了上市时间和每周骑车时间。我们最近发布了华为AppGallery,并查看其他商店。我们学习了如何由于功能切换而更改用户应用程序而不进行更新。谢谢您的关注。

All Articles