Continuous integration 有没有一种方法可以避免坏代码或未经测试的代码使用CI上线?

Continuous integration 有没有一种方法可以避免坏代码或未经测试的代码使用CI上线?,continuous-integration,Continuous Integration,我最近让我的团队转向CI。我们仍处于起步阶段,但到目前为止,我们已经开始使用它,而且效果很好。我们还没有运行任何自动测试,所有测试都是手动进行的。我们目前也在做每周发布,所以我们在周一下午从我们的开发分支创建一个发布分支,在周二运行进一步的测试,并在周三上午将其推送到我们的主分支,并在一整天中进行监控。问题是,有时我们的QA团队没有及时测试我们的所有功能,或者该功能在QA中失败,但是已经在开发分支中,并且可能在问题得到解决之前就已经上线了。有什么方法可以缓解这种情况吗?这对我们来说都是全新的,所

我最近让我的团队转向CI。我们仍处于起步阶段,但到目前为止,我们已经开始使用它,而且效果很好。我们还没有运行任何自动测试,所有测试都是手动进行的。我们目前也在做每周发布,所以我们在周一下午从我们的开发分支创建一个发布分支,在周二运行进一步的测试,并在周三上午将其推送到我们的主分支,并在一整天中进行监控。问题是,有时我们的QA团队没有及时测试我们的所有功能,或者该功能在QA中失败,但是已经在开发分支中,并且可能在问题得到解决之前就已经上线了。有什么方法可以缓解这种情况吗?这对我们来说都是全新的,所以我愿意在必要时改变一切

希望这个图表能很好地解释当前的工作方式: 你没在做什么

在CI中,您只有一个分支(master/main/etc)——CI工具在其上运行——并且可能会有非常短的子分支合并到该分支中,理想情况下在<1天内。几乎等同于

在传统CI中,中断是正常的,这是流程的一部分-错误的更改在合并到分支后由CI工具识别(您使用它的原因之一)。中断,因为它们阻碍了项目的关键路径。不幸的是,这需要人为干预,这对大型项目来说可能是一个严重的减速

还有一个门控CI
,它在将更改合并到分支之前对更改执行自动编排的验证,拒绝未通过验证的更改,并将成功的更改自动合并到分支中,从而确保分行始终保持最低质量水平。IMHO是进行集成的唯一舒适且确定的方法,尤其是在大型项目中。AFAIK只有两个这样的工具:和(这是我的宝贝)

QA/release阶段只是CI/CD管道中的后续步骤,如果前面的步骤通过,则会自动到达这些步骤,请参见中的图片。(可选)您可以从相应的refpoint中拉取发布分支,这将允许复杂的多版本故事、热修复等。但是这些分支从不合并回它们的父分支,热修复被双重提交/挑选到主分支中,根据不同分支上下文的要求,可能会进行其他更改

GitFlow不是CI:

  • 您有多个分支(思洛存储器),偶尔只合并一次
  • 分支合并可能很快成为一场噩梦,尤其是在大型项目中,您可以同时激活多个功能分支。尝试在图片中再添加1到2个平行特征分支,以及在执行已显示的合并之前需要执行的额外上游分支合并。由于这些额外的合并,您可能需要额外的QA执行。只是想了解一下这种战略的规模有多大
  • 在这些独立的分支中进行的测试是断章取义的——这些分支并不反映整个项目集成。即使这些测试通过,主分支也可能会失败,或者在合并后完全中断。请参见仅2个简单更改如何导致此类问题,更不用说带有多个更改的分支了

正如您现在可能猜到的,我不是GitFlow的忠实粉丝,它与我很久以前不得不忍受的CI集成前的做法非常相似;)

所以,在自动化测试到位之前,甚至不用担心代码覆盖率(关键字)。大多数CI系统允许“测试失败时失败”。确保代码覆盖率(新代码或现有代码)是顶层的一层。关于流程:未经测试的代码(例如,如果流程是手动的)应保留在开发/质量保证分支上,且不得合并到主线上。然后,可以使用开发/质量保证分支检查验证代码,在主线分支上只进行更小/更快的验证。这将避免将QA推到超出其(手动工作流程)的能力范围之外。如果未验证,则不会合并,因此不会部署。(在适当的CI设置中,分支机构将运行流程,阻止测试失败/质量问题/覆盖不足时的合并。)tldr;如果未通过适当的测试(手动或其他方式)进行验证,则不应将代码从功能分支合并到主线上,从而不进行部署。然后,带有分支检查的CI系统强制执行以下操作:1)防止“坏的”或未经测试的分支的代码被合并到主线上;2)确保主线分支没有倒退。一旦遵守了这一点,主线上应该发现的问题最少。如果发现这样的问题,两个主要选项是:1)将部署推迟到“最后一个好版本”(使用标记而不是分支作为部署目标),或2)确保在必要时部署之前应用并验证“错误修复”(甚至对已部署的代码进行“热修复”)。可能有兴趣: