有没有CI工具可以保证分支质量不会下降?


10

传统上,CI系统仅通过对已提交更改的代码库执行QA验证,监视回归并发送人工干预通知,来对集成分支中的质量级别进行监视

但是,当检测到这些回归时,分支机构至少在各自的QA验证开始后就已经陷入麻烦,并且将一直处于这种状态(甚至变得更糟!),直到所有罪魁祸首被发现,对其进行了修复并进行了新的QA验证确认分支质量级别已恢复。在所有这些时间里,分支可以被视为正常开发被阻塞。

是否有一个CI工具能够实际防止这种回归的发生,该工具将执行提交前的 QA验证,并且仅当使用相应提交更新的代码库也将通过那些提交前的QA验证时才允许提交。分公司质量水平?

更新:假设CI工具可以调用具有适当覆盖范围的适当的自动QA验证,以能够检测相应的回归。


我一直想知道了解这个问题的正确方法(以及您自己在答案中的建议)。如果我用“事后”代替“监视”,而用“事后防止”代替“预防”,那么问题还是差不多吗?另外,也许您可​​以添加一些示例方案来说明差异?
Pierre.Vriens

@ Pierre.Vriens这样好吗?
Dan Cornilescu

Answers:


6

据我所知,您正在寻找一种工具,该工具将拒绝破坏构建的提交-CI工具可能无法通过实际修复代码来防止回归,但它可能会阻止您添加错误的代码到存储库。

Atlassian有一些有趣的Git钩子应用程序

服务器端预接收挂钩是对持续集成的一个特别有力的补充,因为它们可以阻止开发人员将代码推送到母版中,除非代码满足某些条件(例如精英​​忍者守护者),以保护其免受不良代码的侵害。

如果您使用的是Git,则挂钩非常强大(并且SVNMercurial和其他版本控制系统也有类似的挂钩),并且使用它们来运行提交前检查可能会很有用。

Git的文档对创建一个钩子拒绝推送,如果他们不符合一定条件的页面可能很容易地适应这个用例。

但是,很多人会认为拒绝提交对分支机构来说不是一个好主意feature –当构建由于某种原因而中断时,您只是在浪费时间与CI系统进行战斗,而不是真正地修复错误。

master分支上,拒绝残破的合并可能很有意义,因为您可能要确保它始终在构建。对于一个feature分支,你不可避免地打破的东西,因为代码不会投入生产,现在,它更有意义只是为了提醒你比实际拒绝你一起提交。


那么,建立的sw映像有什么好处,但是从测试的角度来看DOA是预期的吗?开发人员即使构建代码也无法测试其代码更改,因此它们同样会被阻止。因此,总的来说,我会将提交拒绝扩展到未能通过最低质量检查的任何事物,可以通过平衡2个相互冲突的要求来选择:尽可能高以最大程度地保护受阻止的开发人员,并且尽可能低以使QA验证延迟不会不会使该过程减慢太多。
Dan Cornilescu

一个示例就是拉取请求模型,您可以在其中限制是否可以合并拉取请求。例如,我们(我的公司)使用Atlassian Bitbucket Server,并且在允许合并拉取请求之前,有一些选项要求给定分支至少需要N个批准和X个通过构建。这并不能完全拒绝它。但是,当测试失败或其他人尚未看到代码时,可以防止意外合并。
Andy Shinn

@AndyShinn:是的,我发现这很有用-GitHub还提供受保护的分支和对请求请求的检查,这通常很有用。
Aurora0001年

1
在功能分支中允许破坏代码的一个论点是,即使尚未准备好,开发人员也可以将他们正在处理的代码推送到存储库中。这对于与其他人共享代码以在事情准备就绪之前进行早期代码/体系结构审阅,帮助调试问题,或者对于正在休假的人将部分完成的工作放在别人可以得到的地方很有用。对于功能分支,我只会放置诸如linters和pre-commit挂钩之类的东西。
布雷迪

2

没有任何工具可以保证不进行回归-与执行测试的工具相比,这更多地取决于测试。但是,您可以帮助防止捕获的回归数据进入积分分支。您可以使用预提交的挂钩进行此操作,但是使用拉取请求通常会更容易(希望您已经将其用于对等代码审查)。

如果分支的上游是最新的(PR合并到该分支),并且其测试通过,则合并后它们仍将通过;否则,分支将通过。合并后目标分支的状态将与合并前源分支的状态匹配。

通常,指出PR中的源分支是否与目标保持最新以及是否具有通过的CI构建(这取决于所使用的工具)通常并不特别困难。您可以将此作为合并拉取请求的要求(根据策略和/或在软件中强制执行)。


“如果分支的上游(PR合并到的地方)是最新的,并且其测试通过了,那么合并后它们仍然会通过” –为什么?合并是不连续的,它带来了未知数。像冲突一样-代码可能要等到解决后才能生成。您需要运行测试并确认它们通过任何分支合并。我想说的是即使快进也要安全。见apartsw.com/insights/2016/11/16/...
丹Cornilescu

嗯,是的,这样的保证是可能的,请检查我的答案。好吧,也许我应该澄清一下:通过回归,我的意思是说结果差于分支基准结果(并且忽略误报的可能性,需要解决这些问题,因为它们可能会倾斜基准,使整个事情脱轨并需要人工干预)。间歇性的假阴性只是令人讨厌的事情,可以减慢速度,但是可以解决。
Dan Cornilescu

您不能保证没有回归,只能保证没有检测到回归。如果更改导致回归无法被测试捕获,则表明CI工具无法做出任何保证。而且,虽然合并两组更改确实带来了未知数,但是您可以选择在功能分支(通过合并上游)中进行操作,然后再合并另一个方向。如果源与目标是最新的,则这是一次简单的合并(快进),之后目标状态将与合并之前的源状态相同,因此,如果之前通过测试,则在之后通过。
阿德里安

劈开头发。可以使用测试配置CI工具,以检测并因此防止您关心的任何回归。对于合并,我不会过分争论-​​我的目标是尽可能避免合并,
这只会给

我的观点是,通过编写测试,不是由CI工具提供保护的是您。CI工具无法提供您提供的测试以外的任何保证。
阿德里安

1

像Reitveld和Zuul这样的真正的持续集成工具(而不是连续测试)可以提供帮助,尽管它们仅与您编写的测试和代码审查一样好。


但是Reitveld似乎是一个协作代码审查工具,而不是CI工具,我是否缺少某些东西?我就是这样看的:github.com/rietveld-codereview/rietveld
Dan Cornilescu

Zuul似乎确实相关,我将对其进行深入研究。
Dan Cornilescu

它不进行测试,但可以处理分支管理的某些方面,充当网守系统,这是阻止合并阻止不良代码进入的最佳选择。
coderanger

我明白你的意思了。好吧,它可以帮助提高整体代码质量,但是它本身并不能带来任何保证。两个完全通过所有QA验证的完美变更在分支中相遇时仍可能导致中断。
Dan Cornilescu

1

使用GitLAB,您可以在项目设置中进行设置,以仅在管道成功时才允许合并,因此可以进行真正的持续集成,并通过将QA添加到合并批准列表中以及与Dynamic Environments相结合,可以保证质量在您合并到母版之前。


该方法有效,但前提是您不允许第二次合并在上一次合并完成之前启动质量检查,否则第二次合并将看不到第一次合并,从而为回归留出了空间。换句话说,合并(包括其质量检查)必须完全序列化,这不适用于大型团队。
Dan Cornilescu

0

ApartCI是一个CI系统,旨在防止回归,从而确保平坦或提高分支质量水平。仍处于测试阶段。

它以某种方式编排集中的预提交验证,以确保仅在更改经过验证之后才提交更改,以及在此之前提交的所有其他更改,以达到或超过最新的分支机构质量水平。

与通常由开发人员驱动的提交前验证(通常并行执行)相比,这是关键的区别,这为因干扰的变化(从未一起测试)导致的回归留有空间。

该工具还设计为易于扩展 -能够维持很高的传入候选更改率,并支持在同一集成分支中工作的100/1000开发人员。

免责声明:我是该工具的作者和提供该工具的公司的创始人。对广告表示歉意。


最好添加免责声明,但我个人认为可以通过将自己的公司或产品推广为垃圾邮件的形式来提出问题并自我回答。
THelper

我问了一个关于meta的问题,是否允许:meta.devops.stackexchange.com/q/59
THelper

SnapCI也这样做。RIP。
paul_h

@paul_h,除非我缺少SnapCI及其推荐的替代GoCD都基于提交后的验证(通过轮询SCM触发),所以它们仍然仅用于监视。除非进行PR检查,否则除非将这些检查完全序列化,否则它们只能降低回归发生率,而不能完全消除它们。
Dan Cornilescu

丹,不轮询不,钩子。到尚未合并到主干/主站的短暂PR分支-trunkbaseddevelopment.com/game-changers/…–
paul_h
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.