让我先描述一个简单的 CI 工作流程(我们使用 git、Jenkins、maven、nexus):对于一个项目,有人从 master 分支创建一个分支,进行更改、验证和代码审查。现在有人提出改变要求。
以下都是自动化的。更改被合并到 master 并排队等待发布。要部署,对于队列中的每个项目,二进制文件是从 master 分支构建的(使用标签或提交 id),运行测试套件,并以 1% 的流量进行部署。在 12 小时内,我们自动分析性能数字和业务数字,此时我们提供 100% 的流量。然后拿起队列中的下一个项目。
每个 100% 版本的一个更改的分离是很重要的,因为如果多个更改在一个版本中,则很难调试错误。
这一切都很好,直到出现问题。
- 假设我们将 Feature1 推到 1% 的流量,发现数字不好,在 12 小时内发现,Feature2 已合并到 master。在这种情况下,如果我们想要 Feature2 去恢复有缺陷的 Feature1 直到我们修复它的错误,就需要在 Feature1 上执行 git revert。
- 在上面的案例中,Feature1 非常重要,我们也发现了问题并知道了修复方法。然后我们需要从 master 恢复 Feature2,将 Feature1 fix 合并到 master 并重置队列。
- 如果在功能之外有一些紧急修复,此时生产处于 Feature0,Feature1 处于试验阶段。我们希望 Feature0 的紧急修复达到 100%。这一次我们需要从 master 恢复 Feature1。
是否有一个工作流程,使用多个分支而不是只使用 master 或添加更多自动化,从而避免 git reverts - 特别是在完成他/她的功能的开发人员没有做错任何事情的情况 2 和 3 中。