创建构建链
本教程介绍如何创建一个与之前 配置并运行您的第一个构建 演练中创建的管道协同工作的独立管道。

本教程涵盖的主题:
管道依赖项和构建链
构建 Docker 镜像
作业代理要求
构建代理终端
重用上游链构建
发布和交换工件
基本概念
在 TeamCity 中,将独立实体链接到一个工作流主要有两种方法。
- Build chain(构建链)
Build Chain(构建链) 是由多个互相关联的构建配置和管道组成的序列。
这些独立对象之间的关系按照从右到左或下游到上游的顺序进行配置。 例如,要按“Pipeline A → Pipeline B”的顺序运行两个 pipeline,请在 Pipeline B 中添加对 Pipeline A 的依赖项。 换句话说,告诉 TeamCity,B 依赖于 A。
这有两个作用:
Pipeline A 没有依赖项,可以独立运行。 运行它不会触发 Pipeline B。
Pipeline B 依赖于 Pipeline A,因此无法独立运行。 当触发 B 时,需要已完成的 A 运行。 根据链配置,TeamCity 会启动新的 Pipeline A 运行并等待其完成,或重用先前成功的 Pipeline A 运行结果并立即启动 B。
- 完成构建触发器
完成构建触发器是构建链依赖项的相反方式。 它们允许你在构建配置之间建立从左到右的关系(目前不支持 pipeline)。 在这种情况下,“Config A → Config B”顺序会在你触发上游 Config A 时运行。 当其完成后,会自动触发下游 Config B。 在此设置中,Config B 可以单独运行,不会触发任何外部构建。
完成构建触发器通常与常规构建链结合使用。
有关在 TeamCity 实体之间创建关系的更多信息,请参见本节: 设置依赖项。
步骤 1:创建 pipeline。
转到项目的 常规 设置,该项目拥有在 上一个教程 中创建的 pipeline。
点击 创建管道。
由于你已经有一个用于从 GitHub 检出所需项目的管道,可以选择 来自现有 VCS 根 选项。 这样可以立即复用访问仓库所需的所有设置。

添加一个 脚本 构建步,使用
./docker/Dockerfile来构建 Docker 镜像。 如果你不确定如何配置构建步或使用 YAML 编辑器,请参见 上一步。jobs: Job1: name: Docker build steps: - type: script script-content: docker build -f ./docker/Dockerfile -t johndoe/myapp:%build.number% .由于该作业需要构建镜像,因此需让其运行在已安装 Docker 或 Podman的构建代理上。 为避免被分配到没有必需工具的构建代理上,请使用另一个 代理要求 ,并使用 预定义 TeamCity 参数
container.engine。jobs: Job1: ... runs-on: self-hosted: - requirement: exists name: ImageBuilderTool parameter: container.engine运行管道并确保顺利完成。 可以在代理终端中运行
docker image ls来验证镜像是否已构建。
步骤 2:配置构建链。
现在有两个独立的 pipeline:一个负责构建和测试应用,另一个负责生产 Docker 镜像。 要连接它们,请创建构建链。
Docker pipeline 应作为下游,因为镜像应在应用构建和测试后生成。 由于链依赖项是 基本概念 (由下游对象拥有并指向上游对象),你需在 Docker pipeline 添加依赖项。
打开 Docker pipeline 设置,并选择该 pipeline 以视图 其设置 ,而不是单独作业设置。
点击 添加 ,位于 流水线依赖项部分旁边。
从 依赖于 列表中选择另一个管道,然后点击 完成。

在两个管道中禁用所有 作业设置 | 优化 | 重用作业结果 选项。 在实际工作流中,通常会让部分优化项保持启用,但现在我们将其关闭,以便专注于依赖项设置而不增加额外的重用逻辑。
运行你的 Docker 构建配置。 你应该会看到两个管道都在运行。 切换到 Docker pipeline 运行结果页面的 链 选项卡,可以视图链中各部分的详细信息:构建编号、运行时长等。

重新运行 Docker 管道。 由于步骤 3 配置的 pipeline 依赖项已启用 如果有合适的构建,则不要运行新构建 ,TeamCity 会复用上游 pipeline 的前次运行,仅再次运行 Docker pipeline。
你可以在 链 选项卡确认:上游 pipeline 的构建编号应保持不变。
运行你的首个构建/测试管道。 请注意,它会单独运行,不会触发 Docker 管道。
打开 Docker 管道设置并编辑已有依赖项。 禁用 不运行新构建…… 设置。

多次运行 Docker 管道。 由于已关闭重用设置,现在每次都会看到两个管道重新启动。

步骤 3:发布并交换工件。
在 步骤 1 中,你可能遇到 file '/build/libs/todo.jar' not found 错误。 要复现该问题,请在不同代理上分别运行两个管道,并清空 {agent_home}/work 目录,以确保环境干净。
该错误发生的原因是:
Dockerfile 会将
./build/libs/todo.jar复制进镜像。该文件及其父目录是在构建阶段生成的,并不会存储在仓库内。
运行 Docker 管道的代理会检出远程资源并运行
docker build。 由于没有先运行gradle clean build,所以未生成期望的todo.jar文件。
为解决此问题,需要将由构建/测试 pipeline 生成的 ./build/libs/todo.jar 向下传递到链中。
打开上游构建/测试管道的设置,选择构建作业。
在 输出文件 设置部分,添加
./build/libs/todo.jar文件,并同时勾选 共享文件 和 工件 复选框。jobs: Job1: name: Job 1 steps: - type: gradle name: Build app tasks: clean build jdk-home: '%env.JDK_11_0_ARM64%' dependencies: - Job2 - Job3 allow-reuse: false runs-on: self-hosted: - requirement: equals name: Agent name parameter: system.agent.name value: macOS J21 files-publication: - path: ./build/libs/todo.jar share-with-jobs: true publish-artifact: true ...运行此次构建,并确保目标文件已在 工件 选项卡发布。 任何有足够权限的 TeamCity 用户都可以从构建结果页面下载发布的工件。

共享文件 复选框可让文件对此管道内下游作业可用。 外部 pipeline 及链向下的配置不会自动导入共享文件,需要手动导入。
在经典构建配置中,可以通过声明 构件依赖性 ,实现类似你用来连接两条 pipeline 的 pipeline 依赖项的效果。 在管道中,工件依赖项尚未完全支持,只能通过编辑 YAML 配置文件添加。
jobs: Job1: name: Docker build steps: - type: script script-content: docker build -f ./docker/Dockerfile -t johndoe/myapp:%build.number% . ... download-artifacts: - GSFirstBuild_GradleDockerPipelineTeamCitySamples: # same ID as in 'dependencies' block from: dependency artifact-rules: todo.jar=>./build/libs clean-destination: true dependencies: - GSFirstBuild_GradleDockerPipelineTeamCitySamples: reuse: none运行构建链,确保即使每条管道在不同代理处理下,也能顺利完成。