“构建服务器”有什么意义?

时间:2009-07-08 16:24:52

标签: continuous-integration build-process agile build-server

我没有为大型组织工作过,而且我从未为拥有“构建服务器”的公司工作。

他们的目的是什么?为什么开发人员不在本地计算机上构建项目,或者是他们?有些项目是如此之大,以至于需要更强大的机器来在合理的时间内构建它吗?

我认为构建服务器有用的唯一地方是与构建服务器持续集成,不断构建提交到存储库的内容。是不是我还没有做过足够大的项目?

有人,请赐教:构建服务器的目的是什么?

18 个答案:

答案 0 :(得分:93)

给出的理由实际上是一个巨大的好处。转向QA的构建应该只来自仅从存储库构建的系统。这种方式构建包是可重现和可追踪的。除了自己的测试之外,开发人员手动构建代码是危险的。太多的东西没有被检查,与其他人的变化等等过时的风险等。

Joel Spolsky on this matter.

答案 1 :(得分:43)

构建服务器很重要,原因有几个。

  • 他们隔离了环境本地Code Monkey developer说“它在我的机器上编译”,当它不能在你的机器上编译时。这可能意味着不同步签入,或者可能意味着缺少依赖库。 Jar地狱并不像.dll地狱那么糟糕;无论哪种方式,使用构建服务器是廉价的保险,您的构建不会神秘地失败或错误地打包错误的库。

  • 他们专注于与构建相关的任务。这包括更新构建标记,创建任何分发包,运行自动化测试,创建和分发构建报告。自动化是关键。

  • 他们协调(分布式)开发。标准情况是多个开发人员正在使用相同的代码库。版本控制系统是这种分布式开发的核心,但是根据工具的不同,开发人员可能不会相互交互很多代码。而不是强迫开发人员冒险构建错误或担心过度积极地合并代码,而是设计构建过程,其中自动构建可以看到适当的代码并以可预测的方式处理构建工件。这样,当开发人员提交有问题的东西时,比如不检查新的文件依赖关系,就可以快速通知他们。在分段区域中执行此操作,让您标记已构建的代码,以便开发人员不会提取会破坏其本地构建的代码。 PVCS使用推广小组的想法很好地做到了这一点。 Clearcase也可以使用标签来做,但需要比许多商店提供的更多的流程管理。

答案 2 :(得分:26)

他们的目的是什么?
负载开发人员计算机,为构建提供稳定,可重现的环境。

开发人员为什么不在本地计算机上构建项目,或者是他们?
因为使用复杂的软件,只需“编译”就可以解决很多问题。我实际遇到的问题:

  • 不同类型的不完整依赖项检查,导致二进制文件未更新。
  • 发布命令无提示失败,忽略日志中的错误消息。
  • 构建包括尚未提交源控制的本地源 (幸运的是,还没有“该死的客户”消息框..)。
  • 当试图通过从另一个文件夹构建来避免上述问题时,从错误的文件夹中挑选了一些文件。
  • 聚合二进制文件的目标文件夹包含其他陈旧的开发人员文件,这些文件未包含在发布中

由于所有公开发布都是从源代码控制获取到空文件夹,因此我们的稳定性得到了惊人的提升。以前,有很多“有趣的问题”,“当乔给我一个新的DLL时,它就消失了”。

某些项目是否如此庞大,以至于需要更强大的机器才能在合理的时间内构建它?

什么是“合理的”?如果我在本地计算机上运行批量构建,那么有很多事情我不能做。而不是向开发人员付费以完成构建,而是付IT以购买真正的构建机器。

我刚刚没有参与足够大的项目吗?

尺寸肯定是一个因素,但不是唯一的因素。

答案 3 :(得分:6)

构建服务器是Continuous Integration服务器的独特概念。存在CI服务器以在进行更改时构建项目。相比之下,存在构建服务器以在干净的环境中构建项目(通常是针对标记修订的发布)。它确保没有开发人员破解,调整,未经批准的配置/工件版本或未提交的代码使其成为已发布的代码。

答案 4 :(得分:4)

构建服务器用于在签入时构建每个人的代码。您的代码可能在本地编译,但您很可能不会一直在其他所有人进行所有更改。

答案 5 :(得分:4)

我同意迄今为止在稳定性,可追溯性和可重复性方面的答案。 (很多'ity',对吗?)只有大型公司(医疗保健,财务)与MANY构建服务器一起工作,我想补充说它也是关于安全性的。有没有见过电影Office Space?如果一个心怀不满的开发人员在他的本地计算机上构建了一个银行应用程序而没有其他人查看它或测试它... BOOM。超人III。

答案 6 :(得分:3)

必须拥有一个没有先前版本(和配置更改)工件的“干净”环境,以确保构建和测试工作并且不依赖于工件。隔离的有效方法是创建单独的构建服务器。

答案 7 :(得分:3)

这些机器的使用有几个原因,都试图帮助您提供优质产品。

一种用途是模拟典型的最终用户配置。该产品可能在您的计算机上运行,​​并且设置了所有开发工具和库,但最终用户很可能与您没有相同的配置。就此而言,其他开发人员也不会拥有与您完全相同的设置。如果您的代码中有某个硬编码路径,它可能适用于您的计算机,但当Dev El O'per尝试构建相同的代码时,它将无法工作。

此外,他们还可以用来监控最后一个产品是谁,更新了什么,以及产品退回的地方。每当签入新代码时,构建服务器都会构建它,如果它失败,则表明存在错误并且最后提交的用户有错。

答案 8 :(得分:3)

添加已经说过的内容:

一位前同事曾在Microsoft Office团队工作,并告诉我完整的构建有时需要9个小时。那很难在你的机器上进行,不是吗?

答案 9 :(得分:2)

为了保持一致的质量并使“从机器上”构建“以发现环境错误,并且您忘记签入源控件的任何文件也会显示为构建错误。

我也用它来创建安装程序,因为这些需要花费大量时间在桌面上进行代码签名等。

答案 10 :(得分:1)

这是关于我们的管理和测试。使用构建服务器,我们始终知道我们可以从版本控制构建我们的主“主干”线。我们可以通过一键创建主安装并将其发布到Web。我们可以在每次签入代码时运行所有单元测试,以确保其有效。通过将所有这些任务收集到一台机器中,可以更容易地重复使用它。

答案 11 :(得分:1)

你是对的,开发人员可以在他们自己的机器上构建。

但这些是我们的构建服务器购买我们的一些东西,而且我们不是复杂的构建器制造商:

  • 版本控制问题(前面的回复中已提到一些)
  • 效率。开发人员不必停下来在本地进行构建。他们可以在服务器上启动它并继续下一个任务。如果构建很大,那么dev的机器没有被占用的时间更长。对于那些进行持续集成和自动化测试的人来说,甚至更好。
  • 集中化。我们的构建机器具有脚本,可以构建,将其分发到UAT环境,甚至是生产分段。将它们保存在一个地方可以减少使它们保持同步的麻烦。
  • 安全。我们在这里做的并不多,但我确信系统管理员可以使生产迁移工具只能由某些授权实体在构建服务器上访问。

答案 12 :(得分:1)

也许我是唯一一个......

我认为每个人都同意应该

  • 使用文件存储库
  • 从存储库(以及在干净的环境中)进行构建
  • 使用连续测试服务器(例如巡航控制)查看“修复”后是否有任何损坏

但没有人关心自动构建的版本。 什么东西在自动构建中被破坏了,但它不再是 - 谁在乎呢?这是一项正在进行中的工作。有人修好了。

如果要执行发布版本,可以从存储库运行构建。而且我非常确定你想在那个时间标记存储库中的版本,而不是每当服务器执行它时每六个小时标记一次。

所以,也许“构建服务器”只是一个用词不当,它实际上是一个“连续的测试服务器”。否则听起来几乎没用。

答案 13 :(得分:1)

我们使用一个,以便我们知道生产/测试框具有与构建服务器上可用的库相同的库和版本。

答案 14 :(得分:0)

构建服务器可以让您对代码有一点意见。签入时,会检查代码。如果有效,代码的质量最低。

答案 15 :(得分:0)

此外,请记住,低级语言编译比高级语言需要更长的时间。很容易想到“好吧,我的.Net项目可以在几秒钟内完成!有什么大不了的?”一段时间后,我不得不乱用一些C代码,我忘记了编译需要多长时间。

答案 16 :(得分:0)

构建服务器用于安排位于存储库中的通常大型项目的编译任务(例如,夜间构建),有时可能需要几个小时。

答案 17 :(得分:0)

构建服务器还为您提供托管的基础,在其他人可能有权获得所有权的情况下,能够捕获重现构建所需的所有部分。