“自动构建”是什么意思?


15

我正在尝试将持续集成添加到项目中。

根据Wikipedia的介绍,CI的一项主要内容是自动构建。但是,由于CI和构建自动化文章似乎不同意,我对确切的含义感到困惑。

特定的混淆点:在以下情况下, “自动构建”是什么意思

  • 使用解释性语言(例如Python或Perl)的项目?
  • 在最终用户的计算机上从源代码构建?
  • 具有不能简单地预编译和分发的依赖项的应用程序,例如用户计算机本地的RDBMS中的数据库?

2
我已经标记既buildsbuild,因为我不知道该用哪一个。

Answers:


14

您正确地指出,对于某些技术,不需要编译步骤。但是,我建议您在解释“构建自动化”一词时放宽眼界。将“构建”考虑为包括以下两个主要组件:

  • 用于将源工件(代码,数据库架构,文档等)部署到最终用户的过程。
  • 在上述转换过程中质量保证措施的应用

因此,自动化只是指使所有这些操作(即使不是全部)自动进行(即不需要人工干预)。根据您的技术,这可能包括很多步骤:

转换步骤:

  • 汇编
  • 连结中
  • 打包
  • 部署方式
  • 数据迁移
  • 后备
  • 通知

质量保证步骤:

  • 编译器警告/错误
  • 单元测试
  • 整合测试
  • 系统测试
  • 部署验证

这些天来,好的CI工具将使您解决所有这些问题。最初,大多数商店都对自动编译代码感兴趣,因为这是常规软件开发中第一个也是最明显的问题来源。


21

自动化构建是对过程的描述,应涵盖以下基本知识:

  1. 从源代码管理中获取最新代码
  2. 将最新代码编译为可执行文件
  3. 针对已编译的代码运行测试(单元测试,系统测试,集成测试)
  4. 将完成的可执行文件部署到已知位置进行部署。
  5. 发布构建结果。
    5.1编译成功,单元测试成功

这是一个无需人工干预的过程,应在零人工干预下运行。


3
由于已明确询问,您可能会提到不适用的步骤是可选的。例如,如果您的应用程序是一堆python脚本,则步骤2可能什么都不是,或者可能只是将代码压缩到单个文件中一样简单。没有编译步骤是完全可以接受的。
布莱恩·奥克利

@BryanOakley这很公平。等效于没有为脚本进行编译可能会确保此时正确地收集了所有依赖项(如果有)。例如,应包含Python脚本所需的任何其他第三方库,以便将它们包含在以下所有步骤中。我想,如果知道目标计算机和构建计算机始终具有所有必需的库,那么这也是不必要的。
谢尔顿·沃肯汀

2

在我看来,自动化构建是

  • 自动发生,可以按计划执行,也可以每次提交到源代码管理时自动发生
  • 创建一组人工制品,可以将其简单地部署到任何服务器

目的是要有一个可以重复的部署过程-阅读:经过测试-以便在部署到生产环境时,您可以肯定地确定事情不会出错。在构建和部署过程中人与人之间的互动越少,发布就越安全。

如果您使用的是非编译语言,则仍然可以构建网站并将其压缩以创建单个文物。

一个好的CI工具将使您可以将许多任务编写脚本到构建过程中,包括运行单元测试。它还会保留您成功和不成功的构建,测试覆盖率等的记录。但是这些都不是我定义为自动构建的一部分。(即,一个好的自动构建过程具有这些东西,但是一个糟糕的过程不会被称为“自动构建”,因为它缺少这些东西。)

我建议将集成/回归测试作为部署过程的一部分而不是构建过程来运行(尽管,如果您有方便的环境,则可以在每个构建过程中进行部署)。


安排计划的构建并允许开发人员以一个动作启动一个自动化的构建可能也是有用的(如果是两个动作,那不是真正的自动化,是吗?)在我们的情况下,某些系统的构建也是每次提交的启动时间都很长,因此它已按计划并应要求提供。
David Thornley

@DavidThornley:是的。这很有用。大多数CI工具允许您在设定的时间表之外开始构建。但是同样,它不会停止成为自动化构建,因为此选项不存在。如果开发人员总是必须触发它,它将不再是自动化构建。
pdr

1
a project using an interpreted language, such as Python or Perl?

在使用解释语言的情况下,可能会遇到麻烦。某些互穿语言具有编译器,但使用它们的可能性通常不是很大。在那种情况下,我通常只扫描代码中的语法和解析错误以代替编译,或者直接跳过对代码运行测试。

在最终用户的计算机上从源代码构建?

对我来说,这意味着您可以提供一个命令,最终用户可以运行该命令来获取程序的最新版本,对其进行编译,根据需要进行配置和部署。

具有不能简单地预编译和分发的依赖项的应用程序,例如用户计算机本地的RDBMS中的数据库?

这些将属于持续集成的测试部分,因为您可以自动销毁和重建数据库,以确保脚本正确并且程序可以正确地对其进行测试。


1

您在问题中讨论的实际上是3个不同的概念:

持续集成的核心是进行小的更改,并经常将这些更改与“全局真相”同步。开发人员应该执行一天之内可以完成的任务,而不是进行检出并坚持一个星期,以使他的代码永远不会与主存储库太不同步。

为了做到这一点而又不会引起团队的痛苦(即检入未构建或破坏现有功能的源代码)。开发人员必须验证他的代码没有“破坏构建”。如果手动完成,这会增加开发过程的额外开销(例如,一个项目需要很长时间才能构建和/或具有许多相互依赖关系,其中一行代码的更改会以意想不到的方式影响应用程序)。

为了减轻这种情况,我们使用其他技术来消除这种开销。

我们使用自动化构建来签出源代码并构建它(可选),运行自动化测试来验证应用程序是否应该正常工作(此步骤仅与测试套件一样有用)。

持续交付的又一个步骤解决了数据库和其他问题。这里的想法是为数据库和环境的其他因素提供某种程度的版本控制,以便我们可以尽快确认应用程序在尽可能接近生产环境中工作。


1
要点...太糟糕了,大多数人没有读懂主题和投票的内容。
2012年

0

“自动构建”意味着您可以通过一个(可调度的)操作(通常是shell脚本或批处理文件)从源代码控制转到可交付的程序包。

在这种情况下,什么才是真正的构建,很大程度上取决于您要交付的是什么,交付的方式以及开发堆栈各个部分所需的步骤,但是无论如何,您都必须从源代码控制中的内容,您最终会获得可交付使用的产品(或错误消息和生气的项目经理)。

对于一个简单的Python项目,自动化构建可能仅包含两个步骤-检出源代码,并将相关文件复制到正确的目录中。对于更复杂的项目,可能涉及以下内容:

  • 编译,链接
  • 运行自动化测试
  • 创建安装程序包
  • 安装
  • 修改数据库
  • 创建备份(以防您需要回滚)
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.