创建管道
构建链或管道是一系列连续运行的构建配置。 在 TeamCity 中,这些配置可以属于不同的项目,并且可以从一个构建传递文件(工件)到另一个构建。
这个教程将带您设置以下项目:
上述管道会循环执行以下阶段:
1 - 构建示例 Spring Boot 应用程序 2 - 为此应用程序创建 Docker 镜像 3 和 4 - 运行两组并行测试
导入样本项目
这个教程使用了一个样本项目,该项目有五个单独的构建配置,我们即将进行连接。 要按照教程进行操作,您可以使用示例库并在您的 TeamCity 服务器上重复以下步骤。
要导入样本项目:
前往 Administration | Projects 并点击 Create project。
在 Repository URL 字段中,输入 示例仓库 URL,然后点击 继续。
TeamCity 将检测到
.teamcity/settings.kts
文件,该文件对应于以 Kotlin 格式 保存的 TeamCity 项目设置。 保持默认设置并继续。TeamCity 将导入示例项目的设置,并将您重定向到其 一般设置 页面。 在这里,您可以稍微滚动一下,看到 TodoBackend 子项目。 点击它以查看所有创建的构建配置。
现在我们可以开始链式调用了!
配置快照依赖性
TodoApp的构建配置会编译一个 .jar
应用,并将其发布到 build/libs/
目录。 TodoImage 的配置必须从这个 .jar
构建一个 Docker 镜像。
要创建一个同步的管道,或者链,您需要用 快照依赖 连接这些构建。 我们使用单词 snapshot 来描述项目源的特定状态,或基本上是一个特定的提交。 如果您将多个构建与快照依赖关联起来,他们保证处理相同的源代码。
依赖性决定了一个构建如何依赖于另一个构建,因此在依赖构建的设置中创建。 在我们的情况下,它是 TodoImage。 让我们进入其设置并添加一个快照依赖:
打开 Dependencies 设置选项卡(可能需要点击 显示更多 来显示此项),然后点击 添加新的快照依赖项。
选择 TodoApp 作为需要依赖的构建配置。
保留默认设置并保存该依赖项。
配置工件依赖性
要将 .jar
从一个配置传递到另一个配置,我们需要在它们之间创建一个 构建依赖。 因此,当每个新的 TodoApp 构建完成并产生一个构件时,TeamCity 将会在接下来的 TodoImage 构建中使用这个构件。
在 TodoImage 中添加一个工件依赖:
打开 Dependencies 设置选项卡,然后点击 添加新的构件依赖。
选择 TodoApp 作为需要依赖的构建配置。
选择从同一链中获取构建的工件。
在 构建工件规则中,指定我们希望将特定的构建工件导入为
todo.jar
——输入todo.jar => build/libs/todo.jar
。
您可以在这里阅读关于构建工件规则的模式以及与构建工件依赖性相关的其他细节。
请务必注意,构建链是通过快照依赖关系连接的一系列构建。 某些构建可能还与构件依赖关联,但这并不是必须的条件。
运行简单链
在此阶段,前两个构建已经链接在一起,您可以运行您的第一个链。 请注意,要构建一个 Docker 镜像,TeamCity 代理 需要在其机器上安装并运行 Docker ,因此,请确保提前安装。
当您从链中运行任何构建,无论是最后一个还是中间的一个,TeamCity 都会根据它们的依赖关系,将所有其他的链式构建整合到一个序列中。 如您在我们的样本链路图中所见,TodoImage 总是在 TodoApp 之后运行;只有在 TodoImage 完成后,Test1 和 Test2 才开始运行,并且它们是并行运行的。
让我们使用Run按钮来运行TodoImage的构建。 前往 项目首页 ,可以查看 TeamCity 如何自动首先运行一个新的 TodoApp 构建,然后在其完成后,启动后续的 TodoImage 构建。 由于这个链条的结果,TeamCity 将根据 Dockerfile
生产一个 Docker 镜像。
要查看所有链式构建的状态,请转到任何链式构建的 构建配置首页 ,并打开 构建结果 的 依赖性 标签:
Sakura UI 提供了三种表示依赖关系的模式:时间线、列表和链。 当您创建更高级的链时,尝试使用这些模式中的每一个进行监控,并为您的任务选择最方便的模式。
配置触发器和签出规则
您已经了解在 TeamCity 中创建链或管道的基础知识。 然而,为了变得高效而且可以投入生产,链需要进一步实现自动化。
添加 VCS 触发器
正如我们在 首个构建指南 中解释的,TeamCity 提供了多种构建触发器。 如果满足某些条件,触发器将自动运行构建。 最受欢迎的触发器类型是 VCS 触发器,这就是我们在本教程中将要使用的触发器。
当 VCS 触发器检测到项目源代码中的更改时,它会启动新的构建。 您可以定义要监控的仓库,甚至可以精确定义要监控的文件。 让我们在 TodoImage 设置中添加一个触发器:
打开 Triggers 页面并点击 添加新的触发器。
打开高级选项,然后启用 在快照依赖关系中的更改上触发构建 的选项。 以这种方式,此触发器也会对与 TodoApp 配置相关的变化做出反应。
在链的末尾添加一个触发器,并启用此选项以考虑前序构建,这通常是方便的。 无论何时您想要更改触发设置,您都能在一个地方完成。将其他设置保持默认,然后保存触发器。
现在,如果您更改示例项目的代码,TeamCity 将会检测到并运行该链。
限制签出范围
每个链条阶段都负责自己的任务。 在某些情况下,不同的构建配置需要监视源项目的不同部分。 您可以为配置设置自定义的 checkout 规则,只有满足这些规则的更改才会触发其构建。
例如,让我们从 TodoApp 的签出范围中排除 Dockerfile
。 这样,当您更改 Docker 设置时,只有 TodoImage 会被触发。 如果没有这样的限制,TeamCity 会在源代码库中的任何更改都启动这两个构建,这将浪费资源并可能造成混乱。
您可以在构建配置的 版本控制设置 中定义监视源的范围:
在我们唯一的 VCS 根目录对面,点击 编辑签出规则。
输入
-:docker
规则,将docker
目录排除在签出范围之外。 在未来,请使用 此语法 来指定这些规则。保存规则。
完整链条与测试
链中的构建可以并行运行。 让我们通过测试的例子来探讨这个问题。
该项目的 常规设置 列出了另外三种构建配置:Test1、Test2 和 TestReport。 根据我们的目标方案,Test1 和 Test2 应该依赖于 TodoImage,这意味着您需要在这两个构建中创建一个对它的快照依赖。 如果您的服务器上至少有两个适合的构建代理,TeamCity 将能够并行运行这些构建;否则,它将依次启动。
正如您可能记得的,我们在 TodoImage 中的 VCS 触发器只考虑前面的构建(即 TodoApp),无法启动测试。 我们可以在两个测试构建中添加触发器,但 TeamCity 提供了一个更直接的选项 —— 创建一个额外的 组合构建,即 TestReport。 组合构建可以在没有代理的情况下运行,并累积前面构建链中的结果。 此外,它会在一个地方汇总和报告 Test1 和 Test2 的结果。 正是我们所需要的。
所以,要完成这个教程:
将快照依赖项从 Test1 和 Test2 添加到 TodoImage,并从 TestReport 添加到 Test1 和 Test2。
在 TestReport 中添加一个 VCS 触发器,类似于我们对 TodoImage 所做的操作。 之后,您可以安全地从 TodoImage 中移除触发器,因为新的触发器会触发整个链。
由于 Test2 包含一个失败的测试,您将会看到 TestReport 也会失败。 展开任何测试或构建问题,快速预览构建日志的相关部分。
TeamCity 中的构建链机制非常灵活,旨在满足每个项目的需求。 您也会注意到,相比分散的构建过程,监控构建链要容易得多。 所有链接构建的详细状态都会在 构建结果 的 依赖关系 选项卡中显示。
按照我们的入门教程继续学习,了解另一种构建配置类型 ——部署构建。
要点
构建链是一系列通过快照依赖关联的构建。 快照对应于源代码中的某个提交。
在链中的构建可以彼此传递工件,如果您在它们之间配置了工件依赖性。
链中的构建可以顺序运行,也可以并行运行。 您可以创建包含数十个构建的链,而只有可用的构建代理的数量限制了它们可以同时运行的数量。
当触发任何链接构建时,TeamCity 会从头到尾组成并运行整个链路。 由于触发器只能考虑之前的构建,因此在链的最后一个构建中添加一个 VCS 触发器非常方便。
您可以限制源项目的哪些范围对每个构建配置是相关的。 这可以防止过度的构建运行。
您可以创建一个逻辑复合配置,以收集多个依赖构建的结果。 此类配置不需要构建代理,仅作为聚合器使用。