在持续集成对我们有效之前有多少开发人员?


34

与持续集成相关的开销包括设置,重新培训,意识活动,停止修复最终导致数据问题的“错误”,强制分离关注点编程样式等。

持续集成在什么时候可以收回成本?

编辑:这些是我的发现

设置是带有Nant的CruiseControl.Net,从VSS或TFS读取。

以下是失败的一些原因,这些原因与设置无关:

调查成本:调查红灯是否是由于代码,数据质量或诸如基础结构问题(例如,网络问题,从源代码管理,第三方服务器读取的超时)之类的其他来源上的真正逻辑不一致所花费的时间掉了,等等,等等)

基础设施方面的政治成本:我考虑过在测试运行中对每种方法执行“基础设施”检查。除了更换构建服务器之外,我没有解决超时的方法。繁文tape节阻碍了系统,没有更换服务器。

修复单元测试的成本:数据质量问题引起的红灯可能表明单元测试写得不好。因此,重写了与数据相关的单元测试,以减少由于不良数据而导致出现红灯的可能性。在许多情况下,必要的数据被插入到测试环境中,以便能够准确地运行其单元测试。可以说,通过使数据更加健壮,然后依赖于该数据的测试就变得更加健壮。当然,这很好!

覆盖成本,即为现有代码编写单元测试:存在单元测试覆盖率的问题。有成千上万种没有单元测试的方法。因此,将需要大量的工作日来创建这些工作日。由于这很难提供业务案例,因此决定将单元测试用于以后的任何新公共方法。那些没有进行单元测试的人被称为“潜在的红外线”。此处的一个令人感兴趣的观点是,静态方法是如何唯一确定特定静态方法如何失败的争议点。

定制发布的成本:仅Nant脚本到目前为止。例如,它们对于EPiServer,CMS或任何面向UI的数据库部署的CMS依赖版本不是很有用。

这些是每小时进行一次测试运行和过夜进行QA生成时在生成服务器上发生的问题的类型。我认为这些是不必要的,因为构建大师可以在发布时手动执行这些任务,尤其是一个人的团队和一个小的构建。因此,以我的经验,单步构建并不能证明使用CI是合理的。那么更复杂的多步骤构建又如何呢?这些可能很难构建,尤其是在没有Nant脚本的情况下。因此,即使创建了一个,也不再成功。解决红灯问题的成本超过了收益。最终,开发人员失去了兴趣并质疑红灯的有效性。

经过一番尝试,我相信CI的成本很高,并且有很多工作要做,而不仅仅是完成工作。雇用经验丰富的开发人员,而不是搞乱大型项目,比引入和维护警报系统更具成本效益。

即使这些开发人员离开也是如此。优秀的开发人员是否离开并不重要,因为他遵循的流程将确保他编写需求规范,设计规范,遵守编码准则并注释其代码以使其可读。所有这一切都进行了审查。如果这没有发生,那么他的团队负责人就没有做好他的工作,这应该由他的经理接任,依此类推。

要使CI正常工作,仅编写单元测试,尝试保持完整的覆盖范围并确保可运行的系统的基础架构还不够。

最重要的是:人们可能会质疑,从业务角度来看,是否甚至需要在发布之前修复尽可能多的错误。CI涉及许多工作,以捕获少量错误,客户可以在UAT中识别出这些错误,或者无论如何在保修期到期时,作为客户服务协议的一部分,公司都可以获得酬劳。


13
即使对于一个团队来说也是有益的。尤其是如果您有一个运行时间较长的测试套件,那么自动获得通宵构建和测试运行的结果要比一直手动进行的结果要好得多。
SK-logic

3
@Carnotaurus,远程git存储库的本地克隆摆脱了源代码管理的超时。网络问题-用于构建产品?现在,真的...

3
由于数据质量或基础架构,@ Carnotaurus红灯亮是易碎测试的代名词。另请参见:管理单元测试的维护负担
k3b

1
测试越依赖于外部因素,它就越脆弱。示例:如果仅在客户XY在数据库中的情况下测试成功,则测试是否脆弱,除非测试设置通过在必要时插入数据本身来确保该先决条件存在。
k3b

6
“最重要的是:为什么要让其他人付钱来修复它,为什么要生产有效的产品,因为他们不希望他们首先使用该软件”?它可能不符合法律定义,但对我来说听起来像是欺诈。
克里斯·皮特曼

Answers:


43

设置CI引擎类似于在房屋中设置火警。

在我看来,好处与许多开发人员无关,而是与庞大的代码库相关。CI引擎会积极地执行您不想自己做的所有无聊的工作,并且每次都要做。

如果您断开了很长时间没有触摸的远程模块,则会立即通知您。如果已经设置了单元测试,那么不仅是明智的编译,而且是明智的。

还要注意,如果让CI引擎完成所有无聊的工作,包括设置安装程序等,则不必手动进行。您只需签入您的货源,然后等待在标准位置生产的成品即可。(编辑:CI引擎还可以在定义明确的环境中工作,避免了任何开发人员特定的设置,从而确保了可重复性)

这也是质量保证的一部分。


编辑:编写完以上内容之后,我就具有使用Java的Maven构建工具的经验。从本质上讲,这使我们能够将完整的CI配置保留在项目中(使用pom.xml),从而使维护CI安装和/或迁移到另一个CI引擎变得更加简单。


1
@Carnotaurus,在这种情况下,红灯也用于瞬态错误。听起来像您正在使用的CI引擎中的限制。

2
以我的经验,@ Carnotaurus彻底记录了所有方面的各个方面的工作,例如完成一次发布然后再进行多次上述发布,这比在ant或maven脚本中捕获工作流然后再由机器人执行捕获工作要大得多。任何次数。所述机器人还可以在洁净室环境中工作,以确保建筑物可复制。

1
请注意,我要寻找的突破并不是单元测试失败,而是我们仍然可以构建实际的程序。它不再像我们迁移到Maven工件那样重要,而不是为每个发行版编译所有内容,但是知道该构建功能完备仍然很重要。我们也只需要持续部署部分。

2
@Carnotaurus:我不是在谈论警报系统。如果测试失败,则补丁不会(完全)未集成到主存储库中,以确保每当您签出/克隆时,您都可以获得完整的工作副本并可以立即开始工作。现在,我同意你说的测试可能很难编写和维护的......但我已经有和没有测试工作,我看到一个明确的质量改进他们。所以问题是:是否自动化?根据我的经验,手动测试所需的时间比编写自动化脚本所需的时间长(但我在一家拥有大型工具的大型公司中工作)。
Matthieu M.

5
要捕获少量的错误,无论如何,作为公司的客户服务协议的一部分,公司将获得报酬,这是一项艰巨的工作。 ”-在这种情况下,您有经济动机不生产具有尽可能少的错误的软件,并且在这种情况下,所有这些都不适用于您。

33

它不是多少开发人员,而是从1到n(包括1和n)要花费多少步骤?

1:签出代码

n:具有可安装/可部署的软件包

如果n <2,则可能不需要CI
,则需要CI

更新通过
阅读您的发现,我只能得出结论,您是从错误的方向和错误的原因接触CI的。


1
+1-我可以在上面做很多事情-但这非常接近我为什么喜欢CI的核心...不仅因为它做了什么,而且还因为需要它做才能做到工作(这些要求无论如何都是您真正应该做的)。
Murph

2
@murph:是的,它几乎没有带来什么好处,例如1)知道将在您的存储库中构建什么,2)单击构建,3)能够在发布通知时立即发布版本,以及更多
Binary Worrier

因此,可以公平地说,这取决于要发布的内容的复杂性,以其能够“测试”各个层的部署步骤数来衡量?
CarneyCode

1
@Carnotaurus:对不起,队友,但是我不确定我是否知道你想说什么。CI与测试无关。是的,您可以并且应该在构建过程中运行单元测试,但是它们不应依赖于未在测试中设置的任何内容。但是CI确实有助于测试。之一- 许多 - CI的好处是,它允许QA团队立即与无缝皮卡新代码的变化。CI =可立即释放的能力
Binary Worrier,

1
@BinaryWorrier-我认为第1步正在检查代码;)

10

即使是一个团队,这也是值得的。当您开发跨平台代码并且需要确保所做的更改将在两个平台上均适用时,尤其如此。例如,Microsoft的C ++编译器比GCC更具接受性,因此,如果您使用Windows开发,但也需要支持Linux,那么在Linux上的构建中断时,让CI系统告诉您是一个巨大的帮助。

一些CI系统很容易设置,因此开销并不是那么大。例如,尝试詹金斯或哈德森。


我没有考虑过跨平台方案。如果需要不同的编译器来创建不同的内部版本,则CI很有必要-赞成。
CarneyCode

4

就像您说的那样,设置它并使其保持运行需要开销。

但是,收支平衡点在哪里的问题并不取决于团队中有多少人,而取决于项目时间的长短。

话虽如此,但是您可以在以后的所有项目中使用一部分安装成本,因此从长远来看,间接费用可能接近零。


那么项目的长度(项目的大小)对您的CI很重要吗?我发现虚假警报的成本很高。
CarneyCode

是的,您需要有时间偿还安装和学习曲线的费用。从理论上讲,您应该随着时间的流逝学习如何消除错误警报。
Stephen Bailey

是的,这是理论
CarneyCode

好吧,不,它的做法。随着时间的流逝,您会记下哪些测试是易碎的,哪些测试不是易碎的,并且如果您的易碎测试失败,则不必担心太多,除非它们连续破坏几次。您将学习到如何编写更多孤立的,健壮的测试,并让旧有覆盖范围随时间推移而建立,而不是立即全部完成。在实践中,CI并非灵丹妙药,它是一种过程变更,需要时间,最终会导致软件故障少。
philosodad 2012年

3

我本周成立了Jenkins,以构建一个正在从事的小型.NET项目。我将其与我的Git源代码控件集成在一起,从而在每次提交时都触发了构建。我将单元测试集成到构建中。我以FxCop和StyleCop违规的形式集成了静态分析。

现在,每次我检入时,它都会检出我的所有代码,对其进行构建,在所有程序集中增加版本号,对其进行测试,针对FxCop和StyleCop违规进行分析,将其生成进行存档并将结果记录在多个图形中,以便随着时间的推移,我对测试结果和违规情况有了解。

从头开始执行此操作需要一个小时左右的时间(如果您以前从未这样做过,那么可能需要一天与Google联络)。它免费,因为所有工具都是免费提供的。

如果在项目建设过程中以及在项目建设时,我将拥有一个高质量的基础架构,它将随其免费发展。无论何时或何时有新的开发人员加入该项目,我都可以免费了解他们的工作及其对项目的影响。

因此,我看不到CI不值得的唯一情况是,该项目要花一天左右的时间,然后再也没有被重新审视,或者是一种没有可用的现有/免费工具以及获得这些工具的成本的语言与工作不成比例。


正如我所说的,覆盖遗留代码的单元测试带来了巨大的成本。另外,我们在这里也不是在谈论一个人的团队……不过,我很感谢詹金斯。
CarneyCode

1
无论如何,我对CI服务器运行时没有进行任何测试就获得了可观的收益-仅凭对全新版本的信心和部署软件包的可用性。
Murph 2012年

1

如果您可以在每次更改后验证项目的各个方面,那么您就不需要CI。

在其他所有情况下,这都是净赢。


我认为这也是我来自哪里。它也便宜得多。
CarneyCode

在这种情况下,验证是什么意思?如果它是自动化的,尽可能频繁地发生,并且有助于识别精神失误和疏忽,那么我全力以赴。:-)
William Payne '02

1

开销很小。我想说,对于一个人的项目,这将是有用的。一旦达到两个,那将是无价之宝。

我同意,对于一个人的项目,如果您具有“一步构建/验证”功能,则可以进行持续集成,但是在那种情况下,您已经完成了设置CI的大部分艰苦工作,因此也可以放在正式系统(CC,Hudson,TeamCity等)中进行。


你是说没有CI?
CarneyCode

1

CI何时才能收回成本的问题,对于一个新项目来说很难回答。

在现有项目中,它很容易看到。如果您在供应链的开发环节中发现了严重的错误,那么您就知道该问题最早可能存在。现在,修复成本最低。如果在开发之上的任何环境中都存在该问题,则您的成本会更高。

现在,管理层可能会决定发布带有错误的漏洞,但这是业务风险。至少现在至少可以通过该风险评估来缓解,而不是通过深夜的电话/紧急呼叫来缓解,如果按小时计费,则最终可能会非常昂贵。

在成本方面要考虑的另一件事。您的质量检查部门是什么样的?是手动测试吗?如果您选择CI,则可以通过针对开发人员自动执行这些脚本来降低总体质量检查成本。通过使他们参与CI阶段,可以减少支持项目的质量检查人员的数量。


1
用一些UI自动化测试替换手动回归测试需要大量的时间和技巧。在一家公司中,一小伙写了大约40%的测试并离开了公司。几年以后,仍然没有编写测试。我敢打赌这很典型。
CarneyCode

不,这不是典型的。
quant_dev

我还没有看到太多反证
CarneyCode

如果您使用诸如Gherkin之类的自然语言DSL编写集成/验收测试,则可以轻松地将自动测试转换为手动测试。所以我认为这不是问题。
Mike Cornell

@Carnotaurus-我认为这很典型。我也看过两次 UI自动化测试很难。
罗克兰

1

CI始终总是值得的:它给您带来的安全感使您能够以比其他方式更快的速度工作。您遇到的问题似乎与单元测试有关。我同意单元测试非常昂贵,但也认为(对于很多事情而言)它们是我们拥有的最差的选择。就我个人而言,对于我倾向于使用的各种系统,我发誓要通过结合实际情况和(可能是综合性)病理情况进行的系统级测试;它比单元测试便宜,并且可以进入概念性领域难以到达的角落:唐纳德·拉姆斯菲尔德(Donald Rumsfeld)的“未知未知”。


我喜欢系统级UI测试。许多测试由于质量和覆盖范围令人怀疑的单元测试而迷失了。
CarneyCode 2012年

覆盖范围也是人类心理的问题。我们天生就有为我们已经考虑过的情况编写测试的倾向。出于这个原因,要获得高SIL级别的认证,单元测试需要与开发被测系统的团队分开编写,而即便如此,在很多情况下,每个人都只知道回想起来。需要严格检查代码覆盖率;但非常困难和昂贵。
威廉·佩恩

...因此,将最讨厌的垃圾扔到系统的最顶层,看看会发生什么,您会从中得到好处... :-)
William Payne

1
+1-完全同意。系统的某些部分只是不可单元测试的(例如,数据库的边缘)。当然,您可以模拟数据库,但这使与数据库通信的代码未经测试。在某些时候,您需要编写一些真实的测试来集成您的系统并与其他系统对话。当您这样做时,您总是会发现在舒适的干净的单元测试环境和模拟框架中遗漏了一些错误(想起了LINQ to SQL)。

实际上,我最近发现了一个有趣的绒毛测试方法,可以兑现单元测试:jester.sourceforge.net
William Payne

0

无论团队规模如何,都应始终使用它。例如,如果只有您一个人,您知道吗,您可能是在星巴克的笔记本电脑上进行编码,然后在家中从功能更强大的系统继续进行?

开销确实还不错。



0

多少开发人员不是问题,而是

一种。使用自动化可以节省多少时间,以及多少时间。

  • 集成,运行自动化测试和创建设置后节省的构建时间*签入频率=节省时间的百分比。

b。您有多少个版本/分支/产品。

  • 如果您有一个开发人员在两个不同的分支上工作,那么节省的时间就会增加一倍,因为每个分支都需要构建,测试和打包。
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.