底部有 TL;DR(总结)。
我的经验是使用 Jenkins,所以示例将与此相关。
任何构建系统(无论是 CI 服务器还是构建脚本)的一个要点是它应该稳定、简单且自包含,以便未经培训的前台接待员(具备打印说明和适当凭据)可以执行它。
易用性和可重复性
基于上述内容,人们可能认为构建脚本会胜出。但并不总是如此。就像前台接待员的例子一样,这取决于易用性和可重复性。
如果一个构建脚本有相互依赖的构建目标,只有在正确的顺序下才能工作,依赖于预先提供的属性文件,在构建之前必须进行调整以适应正确的分支,依赖于环境变量,但没有人记得是谁最初创建的,并且需要获取 SCM 修订号,必须查看过去一个月的提交日志... 这与可以通过单个按钮触发的 Jenkins 作业毫无区别。
同样,Jenkins 工作流可能依赖于多个相关作业,每个作业在构建之前都需要手动预配置,并且需要从一个地方上传工件到另一个地方... 这是没有接待员会做的。
因此,在这一点上,一个自包含的良好构建脚本,只需要
ant build
命令就可以从头到尾完成所有操作,就像只需要按下
build now...
按钮的 Jenkins 作业一样好。
自包含的
因此,在这一点上,无论整个构建逻辑是在单个构建文件还是单个XML作业配置文件中,都可以在正确完成时是自包含的。
你所熟悉的事物
在大多数情况下,问题归结为你所知道的东西。
这两种观点都有利有弊,取决于质量-时间-预算三角的各方面考虑。
演讲内容
到目前为止,情况已经比较平衡了。然而:
我的Jenkins会通过电子邮件发送详细的HTML报告,其中包含作业页面链接,并直接发送给(不精通技术的)CEO。他可以查看最新构建列表,以及每个构建的SCM更改,链接到为每个构建修复的JIRA问题(所有相关位置的超链接)。他可以选择具有所需更改集的构建,然后在他刚刚用于查看所有这些信息的iPad上单击“安装iOS软件包”。与此同时,我可以转到同一作业页面,并查看每个日志的构建日志和工件,检查构建时间趋势,并比较失败和成功作业之间使用的参数(我不必编写任何
echos 来显示它,因为Jenkins会为您完成所有这些操作)
使用构建脚本,即使将输出重定向到文件中,你是否会将其发送给(不精通技术的)CEO?不太可能。但是等等,你非常了解这个“魔鬼”。几个快速的更改和黑客攻击,几杯红牛......数月的无私工作(大多数是在下班后)后......你创建了一个构建脚本,将创建并启动Web服务器,准备HTML报告,收集统计数据和历史记录,向所有相关人员发送电子邮件,并像Jenkins一样发布所有内容在一个网页上。(哦,如果人们能看到你在构建脚本中逃避和清理所有那些HTML内容所做的所有魔术)。但是等等......这仅适用于单个项目。
所以,喝了一整箱红牛之后,你成功地将它变得通用,可以用于构建任何项目,并创建了另一个 Jenkins/Bamboo/CI 服务器。
恭喜您。起个名字,推广它,赚点钱吧,因为这个终极的构建脚本现在成了另一个像 Jenkins 的 CI 解决方案。
TL;DR:
如果CI服务器可以简单直观地配置,以至于接待员都能运行构建,并且配置可以自包含(通过CI服务器使用的任何存储方法)并在SCM中进行版本控制,则所有问题都归结为质量-时间-预算三角形。
如果你没有太多的时间和预算来学习CI服务器,你仍然可以通过采用CI服务器组织内容的方式极大地提高质量(至少是演示文稿的质量)。
如果你有无限的时间和预算,那么请务必自己创建一个带有构建脚本的Jenkins。
但考虑到“无限”的部分相当不现实,我会尽可能地采用CI服务器。是的,这是一种变化。然而,花费一点时间学习CI服务器以及它如何将构建流程的不同部分分隔或分解成任务,这些时间花费可以大大提高质量。
同样地,如果你没有时间和/或预算,弄清所有插件/任务等的怪癖以及它们如何组合在一起只会降低你的整体质量,甚至会拖累时间/预算。在这种情况下,使用CI服务器仅满足触发现有构建脚本所需的最低限度。但在某些情况下,“最低限度”甚至不比首次不使用CI服务器好。当你处于这种情况时...问问自己:
你为什么要首先使用CI服务器?