这是你的问题。
我们只将提交到Master并由QA验证的分支合并到Release分支中。
这意味着您必须将功能分支集成两次。一次集成到Master,再次集成到Release。您正在努力解决显而易见的问题:如何确保集成到Master的所有内容都已集成到Release?由于功能建立在其他功能之上,它们必须以类似的顺序存在。
不要试图解决此问题。这很困难且混乱,您总是必须小心。最好拥有一个更加防护的过程。让我们回到您提出的目标。
确保仅验证了QA的开发分支进入下一个发布候选版。
(重点在我)那真的不是目标,而是实现目标的解决方案。您的真正目标是什么?这个怎么样...
确保仅经过QA验证的代码进入下一个发布版。
看到我做了什么吗?优质版本不关心代码来自哪里,只关心发行的代码状态。您希望确保未经QA检查的内容不会进入发布。为此,我建议将您的工作流更改为Gitflow Workflow的版本。它是这样的。
- 开发人员有一个任务要完成。
- 开发人员从主分支分支,称之为
task
。
- 开发人员在
task
上工作。
- 开发人员为
task
编写自己的单元测试。
- 开发人员需要更新
master
时获取更新。
- 他们可以变基或合并,无所谓。
- 开发人员完成了
task
。
- 开发人员从
master
进行最终更新。
- 开发人员确保其单元测试和所有回归测试都通过。
- 可选开发人员向QA提交
task
进行验收测试。
- 开发人员合并到
master
。
- 开发人员删除
task
。
因为开发人员正在编写自己的单元测试,所以此时您知道master
中的所有内容都已通过单元和集成测试。在5.3中进行了重要或棘手功能的验收测试,但通常您不会在这个阶段使用QA。
保持master
分支的高质量状态对于一个健康的工作流非常重要,这意味着开发人员必须参与测试过程。不能把它扔给QA部门然后希望一切都很好,QA应该花时间进行验收和黑盒测试,以捕捉开发人员没有想到的错误。master
始终是您的发布候选版本。
当您决定准备发布时...
- 将
testing
分支与master
匹配。
- 您可以将其合并到
master
上,或在master
上进行变基,或删除并重新创建testing
分支。每种方法都有轻微的优缺点,这些优缺点将很快显现。
- QA获得自上次发布以来添加的所有更改列表。
- 他们可以从问题跟踪器中获得此信息。
- 如果
testing
是从master
上进行变基,则可以使用git log
查看自上次发布以来的合并提交。
- 让QA根据
testing
接受测试更改列表。
让我们在这里停一下,解释一下为什么步骤3很重要。 QA是用户看到之前的最终检查点。重要的是QA测试用户将实际使用的内容。用户将看到集成的代码库,而不是独立工作的单个功能分支,因此QA应该把精力集中在集成发布上。
功能在独立运行时可能很好用,但在组合时可能会出现奇怪的错误。一个简单的例子是一个特性,它将项目的编码从ASCII更改为Unicode。开发人员忠实地将整个系统更改为使用Unicode,效果很棒。同时,另一个开发人员正在处理包括更改某些视图的任务。他们没有考虑字符编码,并且根据ASCII假设编写了其视图。开发人员非常不善于测试视图。在独立测试过后,功能分支运行良好。但是组合在一起时,QA可以捕捉到仍然使用错误字符编码的视图。
接着进行。
- QA通过发现并向开发人员报告错误。
- 对于小问题,开发人员修补
testing
(直接修补),对于大问题,他们在一个分支中进行修补。
- 可选的:开发人员将这些修复内容择机返回到
master
。这是可选项,因为稍后会处理它。
- QA宣布
testing
准备好发布了。
release
是git merge --ff-only testing
。如果不是快进方式,则在release
中有需要回溯的热修复。
- 使用版本号对
release
进行标记。
release
被推送到生产环境。
testing
被合并回master
。
最后一步确保在QA过程中发现的任何补丁都将合并回master
。这就是我之前说的重置testing
的方法并不重要的原因,因为它最终都会合并回master
。
以上是确保所有发布的代码都经过QA流程的一个过程。除了为QA开发变更日志之外,没有对必要的集成进行仔细跟踪。
git merge --no-ff taskA
。这样属于taskA
开发的提交范围仍然在视觉上靠近。如果您需要查找由taskA
引入的错误,这将非常有帮助。 - nils