假设我设置了一个自动夜间构建。我应该保存哪些构建工件?
例如:
- 输入源代码
- 输出二进制文件
另外,我应该保存它们多长时间,在哪里保存?
如果我进行持续集成,你的答案会改变吗?
你不应该为了保存而保存任何东西。您应该保存它,因为您需要它(即,QA 使用每晚构建来测试)。在这一点上,“保存多长时间”变成了 QA 希望它们多长时间。
我不会像标记/标记它那样“保存”源代码。我不知道您使用的是什么源代码控制,但对于任何质量源代码控制系统来说,标记都是微不足道的(性能和磁盘空间)。一旦您的构建被标记,除非您需要二进制文件,否则将它们放在身边并没有任何好处,因为您可以在必要时从源代码重新编译。
大多数 CI 工具允许您标记每个成功的构建。这对于某些系统来说可能会成为问题,因为您每天可以轻松拥有 100 多个标签。对于这种情况,我建议仍然运行每晚构建并且只标记它。
以下是我用于在每次构建时保留的一些工件/信息:
问自己这个问题:“如果某些东西完全破坏了我的构建/开发环境,我需要什么信息来创建一个新环境,以便我可以重做我的构建 #6547 并最终得到与第一次完全相同的结果?”
你的答案是你应该在每次构建时保留的内容,它将是我已经提到的内容的子集或超集。
您可以将所有内容存储在 SCM 中(我建议使用单独的存储库),但在这种情况下,您应该将这些项目保留多长时间的问题失去意义。或者您应该将其存储到压缩文件夹或刻录带有构建结果和工件的 cd/dvd。无论您选择什么,都有一个备份副本。
只要您可能需要它们,就应该存储它们。多长时间,将取决于您的开发团队的步伐和您的发布周期。
不,如果您进行持续集成,我认为它不会改变。
这不是您问题的直接答案,但不要忘记对每晚构建设置本身进行版本控制。当项目结构发生变化时,您可能必须更改构建过程,这将从那时起破坏较旧的构建。
我们保存二进制文件,剥离和未剥离(所以我们有完全相同的二进制文件,一次有调试符号,一次没有调试符号)。此外,我们将所有内容构建两次,一次启用调试输出,一次不启用(再次,剥离和未剥离,因此每次构建都会产生 4 个二进制文件)。构建根据 SVN 修订号存储到目录中。这样,我们就可以通过简单地检查这个版本来始终保留来自 SVN 存储库的源代码(这样源代码也被归档)。
我最近了解到的一个令人惊讶的问题:如果您处于可能被审计的环境中,您将希望保存构建的所有输出、脚本输出、编译器输出等。
这是您验证编译器设置、构建步骤等的唯一方法。
另外,保存多久,保存在哪里?
保存它们,直到你知道构建不会投入生产,只要你有编译的位。
保存它们的一个合乎逻辑的地方是您的 SCM 系统。另一种选择是使用会自动为您保存它们的工具,例如 AnthillPro 及其同类工具。
我们正在做一些接近“嵌入式”开发的事情,我可以告诉你我们节省了什么:
我们还将在“副作用”文件上运行一些工具的结果邮寄给感兴趣的用户。我们实际上并没有存档这些,因为我们可以稍后再复制它们,但这些报告包括:
当我们运行单元测试或功能测试(例如冒烟测试)时,这些结果会显示在构建日志中。
我们还没有扔掉任何东西——考虑到,我们的目标构建通常最终每个配置大约 16 或 32 MiB,而且它们是相当可压缩的。
为了便于访问,我们确实将二进制文件的未压缩副本保留了 1 周;之后我们只保留轻微压缩的版本。大约每月一次,我们有一个脚本提取构建过程生成的每个 .zip,并将整个月的构建输出 7-zip 压缩在一起(这利用了每个构建只有很小的差异)。
每个项目平均每天可能有十几个或两个构建......构建服务器大约每 5 分钟唤醒一次,以检查相关差异和构建。一个非常活跃的大型项目一个月的完整 0.7z 可能是 7-10GiB,但它肯定是负担得起的。
在大多数情况下,我们已经能够以这种方式诊断一切。构建系统偶尔会出现问题,文件实际上并不是构建发生时应该是的版本,但日志中通常有足够的证据证明这一点。有时我们必须挖掘出一个能够理解调试数据库格式的工具,并为其提供一些地址来诊断崩溃(我们在产品中内置了自动堆栈转储)。但通常所有需要的信息都在那里。
值得一提的是,我们还没有破解 .7z 档案。但是我们那里有信息,我有一些关于如何从中挖掘有用数据的有趣想法。
保存不能轻易复制的东西。我在 FPGA 上工作,其中只有 FPGA 团队拥有工具,并且设计的一些内核(库)被许可仅在一台机器上编译。所以我们保存输出比特流。但是请尝试将它们相互检查,而不是使用日期/时间/版本标记。
另存为签入源代码控制或仅在磁盘上?什么都不保存到源代码控制。所有派生文件都应该在文件系统中可见并且可供开发人员使用。不要签入二进制文件、从 XML 文件生成的代码、消息摘要等。单独的打包步骤将使这些最终产品可用。由于您拥有更改编号,因此您始终可以在必要时重现构建,当然前提是您需要进行构建的所有内容都完全在树中,并且可通过同步对所有构建进行。
只要您构建的二进制文件有机会投入生产或被其他团队(如质量保证小组)使用,我就会保存它们。一旦某样东西离开生产,你用它做的事情可能会有很大的不同。对于很多团队来说,他们只会保留他们最近的先前构建(用于回滚),否则会丢弃他们的构建。
其他人则有监管要求,将任何投入生产的东西保存长达七年(银行)。如果您是一家产品公司,我会保留客户可能安装的任何二进制文件,以防技术支持人员想要安装相同的版本。