TeamCity Platform 团队协作工具

构建链:TeamCity 的管道融合, 第 1 部分 – 入门指南

在 TeamCity 中,当我们需要构建某些东西时,我们创建一个构建配置。构建配置包括构建步骤,并在构建代理上一次运行中执行。您可以在一个构建配置中定义任意多个构建步骤。但是,如果步骤数太大,应该检查构建配置在做什么 – 也许它一次执行太多操作。

我们可以将步骤分为多个构建配置,并使用 TeamCity 快照依赖项将配置链接到构建链。TeamCity 与构建链一起工作的方式启用了许多有趣的功能,包括构建的并行执行、重新使用构建结果以及多个源代码控制存储库的同步。但最重要的是,它使整体维护变得更加容易。在此博客文章中,我们将说明如何通过为构建配置準備快照依赖項来在 TeamCity 中创建构建链。

最小的构建链

要创建一个简单的构建链,只需创建两个构建配置并配置从一个配置到另一个的快照依赖項就足够了。在此示例中,我们使用的是 GitHub 存储库。该存储库包括一个构建 Spring Boot 应用程序的 Gradle 项目。此外,还有一个 Dockerfile 用于构建 Docker 映像。

我们将分两步构建此项目。首先,我们将构建应用程序,然后使用第一步中生成的二进制文件构建 Docker 映像。

首先,构建配置 TodoApp 会构建 Spring Boot 应用程序并发布一个工件作为结果。第二个构建配置 TodoImage ,取决于 TodoApp 构建配置并会构建 Docker 映像。

我们将需要配置两种依赖项:快照依赖项和工件依赖项。

工件依赖项

TodoApp 构建配置将工件发布到 todo.jar 文件。任何其他构建配置都可以通过配置相应的工件依赖项来下载文件。

在 “Dependencies” 选项卡上,单击 “Add new artifact dependency” 按钮。在对话框中,找到应该从中下载文件的构建配置,并指定模式以匹配文件路径。

文档页面描述了如何更详细地配置工件规则。

快照依赖项

要配置快照依赖项,请转到构建配置设置中的 “Dependencies” 选项卡,然后单击 “Add new snapshot dependency” 按钮。在对话框中,找到将依赖的构建配置,然后单击 “Save” 。

有许多与快照依赖项关联的设置。您可以在文档中了解各种设置。对于我们当前的示例,默认配置就足够了。

触发 TodoImage 构建配置时,TeamCity 确保此构建配置的所有依赖项都是最新的。因此,所有通过快照依赖项形成构建链的依赖构建配置都将添加到构建队列中。结果在项目的 “Build Chains” 选项卡上可见:

触发构建链

在 TeamCity 中可以为构建配置设置各种触发器。VCS 触发器是对版本控制系统中的更改做出反应的触发器。

在我们的示例中,有两种构建配置,但是我们只需要一个 VCS 触发器。这是因为可以告诉触发器监视依赖项的变化。在配置对话框中,我们必须启用 “Trigger a build on changes in snapshot dependencies” 复选框。

我们可以为链中的每个构建配置安排专用的 VCS 触发器。但是,每个触发器都会产生一些开销:服务器必须分配一些周期来维护触发器。此外,如果您只需要配置一个触发器,则可以更轻松地更改设置。因此,我们只需在构建链中的最后一个配置中添加一个 VCS 触发器即可完成此工作。

重用结果

构建链成功完成。我们可以再次开始构建。但是,TeamCity 这次将变得更加智能,并会在未检测到任何源更改的情况下跳过针对依赖项的构建。

例如,在第一次运行时,两个构建配置的内部版本号均为 1 。现在,我们尝试几次运行 TodoImage 构建配置。由于 TodoApp 的源没有任何更改,因此其构建不会开始, TeamCity 将重新使用第一个构建的结果。现在, TodoImage 内部版本号为 3,因为我们有执行它的打算。

即使没有源更改,也可以强制构建依赖项。为此,请单击构建配置的 “Run” 按钮旁边的省略号。从对话框中,选择 “Dependencies” 选项卡,然后选择运行所需的依赖项。

配置签出规则

当前构建链的设置并没有真正为我们提供很多价值。所有源都位于同一个 GitHub 存储库中,因此,如果我们将触发器配置为在代码更改时触发,则两个构建配置都将运行。

例如,如果我们对 Dockerfile 进行更改,则无需运行该应用程序的构建。但是,在当前设置下,TeamCity 检测到 TodoApp 的源代码控制存储库也发生了变化,并且两个构建配置都将执行递增构建编号的操作。

相反,最好仅在必要时运行构建。在此示例中,如果除 Dockerfile 之外的任何内容发生变化,我们想构建 TodoApp 。而且,我们只想在 Dockerfile 发生更改的情况下构建新映像 – 在这种情况下,无需构建应用程序。

可以相应地为 VCS 根配置签出规则。签出规则会影响代理上源的实际签出。话说回来,如果我们在签出规则中使用过滤器排除存储库中的任何文件夹,则这些文件夹将不会出现在工作空间中。

我们将从 TodoApp 构建配置的签出中排除 docker/ 文件夹。而且,我们只会拉 TodoImage 构建配置中的 docker / 文件夹,而忽略其他所有内容。

现在,如果我们仅更改 Dockerfile,则仅应执行 TodoImage 并重用先前运行的 TodoApp 结果,而无需执行它。

小结

快照依赖项的概念对于配置构建管道(也称为 TeamCity 中的构建链)至关重要。这个功能允许通过重用先前执行的结果来实现增量构建,从而节省了大量时间。在本文中,我们还讨论到了触发和 VCS 根检出规则 – 两者都对使用构建链非常有用。

接下来,我们将介绍所描述的功能还有哪些可能 – 并行运行构建并协调部署过程。

原文发表月 2019 年 9 月 30 日,作者Anton Arhipov

image description

Discover more