专用构建机器的目的是什么?


74

由于多种原因导致上一个构建周期的部署不佳,我竞选办公室使用专用的构建机器执行所有将来的部署,而我的老板接受了这个建议。

但是,我们不必在办公室使用一台实际的机器,而必须与其他几个小组共享一台机器-麻烦的是必须带着所有必要的信息离开我的办公室然后走上楼梯到另一个办公室来执行简单的构建,这让我想知道为什么我一开始就提出这个建议。

最初,拥有一台单独的构建机器的想法是,将我自己的本地编写的代码与其他几名开发人员的代码分开,并从部署中分离出我在机器上拥有的所有劫持文件。这也是为了解决我对ClearCase文件管理系统日益增长的担忧,该系统通常拒绝让我部署某些构建活动,除非我还包括了另一个具有“依赖关系”的活动。

现在,我实际上正在执行此过程,我想知道我是否误解了使用构建机器的全部目的-并且由于我们仅使用该机器将代码部署到我们的测试,登台和生产环境,以及不是针对我们的个人开发人员测试部署,我不确定它是否有任何用途。

那么,使用构建机器的真正原因是什么,我什至接近正确使用它?


166
“麻烦是必须离开我的办公室,并带上所有必要的信息,然后沿着楼梯走到另一个办公室,才能进行简单的构建。”您的确切意思是什么?您实际访问该计算机以创建构建吗?
Vincent Savard'Mar


13
真正的WTF是Clearcase,它比所有现代开源替代方案都差。该项目使用哪种语言?构建的大小/复杂程度是多少?
pjc50 '17

7
您在使用工具吗?Git / SVN和Jenkins / Team City / Octopus / TFS等?还是只是登录到另一台计算机,加载Visual Studio还是正在执行...复制项目,加载,编译...您是在使用专业工具还是手动进行操作?
WernerCD'3

84
我的构建机器在南卡罗来纳州的某个地方,我在西雅图。我向您保证,我不会走下任何台阶来使用它。我认为上一次可以物理访问构建机器的时间是在1994年当我负责Microsoft编译器的构建机器的实习生时,当时他们适合装入一个小壁橱。他们现在是某个地方的整个数据中心。将计算机连接到您的网络;更好的是,将其存储在云中并让其他人来照顾它。
埃里克·利珀特

Answers:


137

通常,您不仅会拥有专用的构建机器,而且还会在该专用机器上运行构建服务器。专用的构建机器仅提供的优点是,不会阻塞开发人员的工作,也不会从集中式机器进行部署。

构建服务器提供了更多功能。构建服务器允许CI(连续集成),这意味着它将在每次推送到VC​​S时自动构建(例如git),如果有的话甚至可以执行单元测试并允许“一键部署”。如果构建或测试失败,构建服务器可以通过邮件通知您。他们提供了发生的历史数据和趋势。

通常,可以使用在浏览器中运行的Web gui,一次由多个用户或团队访问构建服务器。

在Java世界中,最常用的构建服务器之一是Jenkins。Jenkins也可以很好地与C ++构建一起工作(因为您似乎使用了这两种语言)。Jenkins称其为自动化服务器,因为它可以运行与编程和构建无关的所有任务。


3
自大学以来,我实际上从未接触过c ++,但是我可以理解它的用处。尽管在这种情况下,我认为我们实际上正在做的事情可能与预期的目标相去甚远。
Zibbobz

21
对于某些语言(尤其是C ++),由于其编译速度相对较慢,因此具有专用处理能力更高的专用框也是有用的。
enderland'3

31
持续集成不仅意味着拥有构建服务器,还意味着每个人都尽可能频繁地集成彼此的更改,以避免“大爆炸”合并问题。否则,请准时进行。
罗布·克劳福德

尽管我喜欢此处示例所赋予的力量,但我仍然认为此答案完全不需要最后一段。
皮埃尔·

3
“专用的构建机器仅提供了永不阻塞开发人员的工作和从集中式机器进行部署的优势。” 并非完全正确。询问者指出,在开发人员计算机上创建不干净的环境非常容易。包含的库和其他环境变量都可以更改构建结果。专用机器应具有记录良好的环境,以便轻松进行构建娱乐。
TafT

107

除了Traubenfuchs的回答外,您还暗示了问题中使用构建机器的另一个原因。

仅仅因为该软件可以在您的计算机上构建,并不意味着它可以在其他任何人的计算机上构建。您可能依赖于恰好在计算机上的一些随机文件(甚至可能不受版本控制)。您可能依赖于从晦涩的构建脚本中调用的一些被遗忘的应用程序或库。

如果您拥有专用的构建机器,则应该知道安装了什么机器。这应该有据可查。如果需要重建软件,也许是在数年之后,则只需要创建一个新的构建机器,并在上面安装文档化的内容即可。


37
+ 1次东西的量工作的开发人员的机器上,而不是他的团队的...其余
user2259716

45
这个。在另一台机器上构建的主要目的是具有可复制的构建;特别是通过从方程式中消除非承诺的物料,不同的环境变量等。
Matthieu M.

9
进一步扩展:使用新的干净容器映像,从中开始每个构建。然后让引导脚本设置系统。真正保证了可复制的构建。
马提亚斯·库恩

9
@MatthiasKuhn:真正(逐字节)可复制的构建需要更多,请参阅reproducible-builds.org wiki.debian.org/ReproducibleBuilds
ninjalj

1
同样,仅因为产品的Linux版本可以在Linux桌面上构建并通过测试并不意味着将构建Windows版本或Mac版本。
所罗门慢速

53

拥有专用构建机器的主要原因是获得一致的构建,而不管谁在进行构建。开发人员工作站很少(读:从不)相同。很难知道每个版本都使用相同版本的依赖项和编译器等。开发工作站版本最严重的问题之一是,开发人员可以从未经检查的代码进行版本控制。

目前尚不清楚您使用的是哪种平台/语言,但理想情况下,您应该拥有一个直接从源代码控制中提取的构建服务器。也就是说,当需要构建时,它将从给定版本的存储库中检索源,并自动对其进行编译。这需要使用自动构建工具来编写构建脚本。如果没有这个,那应该是第一步。

请记住,在本地进行开发没有任何问题。您绝对应该在本地运行单元测试,代码质量分析和珩磨构建脚本。否则,您将浪费大量时间。构建服务器的输出用于您可能要转移到生产中的所有内容。诸如集成和验收测试之类的所有QA活动仅应使用构建服务器中的构建来完成。


此外,还具有额外的病毒抗性。
约书亚

@Joshua是什么让您想到这个?
jpmc26,2017年

14
@ jpmc26:构建机器上安装的软件少得多,需要的远程访问点少,而且没有人在其上打开Web浏览器访问随机Internet站点。
约书亚

19

其他答案很正确地指出,您应该自动化构建,这意味着不必走到另一个办公室。但是,让我提出一些步骤,您可以采取一些步骤来改进您的构建过程:

  • 首先,设置对构建服务器的远程访问!如果您通过键入命令“ make”进行手动构建,则意味着您不必再步行到另一个办公室来键入“ make”,您只需通过SSH进入构建服务器并键入“ make”即可。如果您尚未使用make或类似的构建系统,请使用这种构建系统。
  • 其次,安装一个持续集成环境,该环境会自动从版本控制系统(您有一个版本控制系统,对吗?如果没有,那将是一个额外的步骤)中获取最新更改,并进行构建。我推荐詹金斯。设置Jenkins也可以运行您的单元测试和系统级集成测试(您确实拥有这两种方法,对吗?如果没有,则从单元测试开始创建它们,然后结束于系统级集成测试)。
  • 第三,如果发现与其他团队共享同一台机器有问题(例如,对于应该使用的操作系统,版本和功能有不同的看法),请考虑使用虚拟化。如今,一台好的服务器可以运行大量的虚拟机。也许您可以将自己设置为32位计算机和64位计算机,以使您知道构建可在两种体系结构上使用。
  • 最后,这可能不是必需的:如果您绝对必须拥有一台专用计算机,例如您的应用程序性能非常重要,并且同时运行的其他构建/测试运行对您的结果影响太大,请安装专用的硬件服务器,而不是只有你用。但是,在可能具有多达40个甚至更多的虚拟CPU内核的最新服务器上,创建一些不共享对同一CPU内核的访问权的虚拟机是相对简单的。

我认为共享计算机比手动构建好得多。我当前的项目现在使用虚拟机,但是由于需要进行系统级集成性能测试,因此我们正在迁移到具有40个虚拟CPU内核的专用服务器,其中性能测试需要17个。


16

...我们不必在办公室使用一台实际的机器,而是必须与其他几个小组共享一台机器...

你说那是一件坏事。

现在,您将拥有一个通用的构建服务器,可以构建您所有构建(包括您和其他团队)的构建。构建的一致性?校验。

……必须带着所有必要的信息离开我的办公室,然后沿着楼梯走到另一个办公室以进行简单的构建的麻烦,让我感到奇怪,为什么我首先提出了这个建议。

您仍在手动执行构建,这不好。

您需要一个服务器进程,您可以向该服务器进程提交/排队构建请求,并让该进程将结果发送回给您。


5
“你说那是一件坏事。” 如果他们有自由统治权,可以安装他们想要的任何垃圾。如果他们要远程访问或物理访问它,我看不出如何防止这种情况发生。
jpmc26,2017年

7
“您说这是一件坏事。现在您拥有一台通用的构建服务器,您的所有构建(您和其他团队的构建)都是通过构建的。构建的一致性?检查”。这与一致的构建完全相反!如果有其他团队决定更新其编译器或任何其他工具,那么您将突然遇到一个完全不同的构建环境。这几乎是最坏的情况(除了没有构建机器之初)。
Voo

1
同意希望有一个自动过程来创建新的构建,但是与此同时,您还希望虚拟化构建代理以确保构建环境在您自己的控制之下。对于开发人员而言,虚拟机是一个了不起的工具,您应该充分利用它。
Voo

@Voo这几乎不是最坏的情况,这是中等情况。询问者当前拥有的是最坏的情况。(还请注意,如果您从不复制构建,则随机编译器升级不会有太大问题)
immibis

@immibis您确实在引用的部分之后阅读了部分内容?如果涉及构建服务器,则是最坏的情况。不可复制错误的问题在于,如果同时更改整个构建环境,您将无法真正执行Hotfix。如果您只有一个发布的版本保持接近主干,那么这并不是什么大问题,但是在所有其他情况下,这都非常糟糕。
Voo

1

除了其他相关答案之外,这听起来还像您是直接在有问题的机器上运行构建。

对于可靠的构建系统,尤其是与其他用户共享构建计算机时,通常在虚拟机中运行构建。这样可以确保其他用户无法通过安装自己的代码依赖的应用程序或库版本来更改构建行为。这样做的一个很大的优点是可以轻松备份VM,也可以轻松将其克隆到任何其他PC(包括您自己的开发计算机)上。


1

它提供了一个集中的,中立的位置来执行构建,而独立于单个开发人员的IDE,OS和库配置。

使用专用的构建机器,您可以在每次将代码推送到存储库时对其进行重建。当有人中断构建时,该过程可以立即发出警报,以便可以立即解决问题。

除了使所有内容更具可重复性和可靠性,并确保存储库中不存在因依赖问题而潜伏的残破垃圾之外,它还使开发人员的生活更加轻松,因为要使构建在其计算机上正常工作,他们要做的就是复制任何内容。在构建机器上完成。


4
在先前的6个答案中,似乎并没有提供任何实质性的解释和解释
Mar'Mar
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.