Dependent Build(依赖构建)
在 TeamCity 中,一个构建配置可以依赖于一个或多个配置。 可以指定两种类型的依赖项:
一个 工件依赖项 只是一种将一个构建产生的制品引入另一个构建的方式。 没有相应的 快照依赖,主要用于构建配置在源码方面无关联的情况。 例如,一个构建为其他人提供了一个可重用的组件。
快照依赖影响构建的处理方式,并意味着这些构建之间有深厚的关系,一个构建是另一个的逻辑部分。
Snapshot dependency(快照依赖项)
快照依赖关系 是一个强大的概念,允许在 TeamCity 中表达构建配置之间的源级依赖性。 主要目标是通过创建与快照依赖关联的不同构建配置,允许复杂的构建过程。 这种方式允许我们将一个单一的巨型构建分割成一系列相互关联的构建(Build Chain),并具有灵活的重用规则。 TeamCity 遵循在此级别定义构建结构的声明式风格(声明依赖关系,而不是添加构建触发器),因为它允许更灵活和强大的功能。
查看 构建依赖设置,了解典型的快照依赖用法及相关博客文章: 2019年9月、 2016年3月、 2012年4月。
构建配置A对构建配置B的快照依赖确保了在每次A的构建开始之前,都已经有了一次B的 "合适的" 构建。 A 和 B 的构建都使用相同的源代码快照(如果 VCS 根目录不同,则源代码的修订版本相同或在同一时间取得),当它们属于同一链并且强制执行修订版本同步时。 如果未执行修订版本的同步,则构建 A 可以在将完成的构建 B 提升至 A 时使用最新的修订版本(在 Build Chain 中了解更多信息)。
具有快照依赖关系的构建的构建结果页面允许查看所有依赖构建及其错误(如果有的话)。
快照依赖会以以下方式改变构建的行为:
当构建进入队列时,所有其快照依赖的构建配置也会进入队列,这是传递性的;TeamCity 然后确定构建使用的修订版本("检查更改"的过程)。
如果某些构建配置已经开始了具有匹配更改("适合的构建")的构建,并且快照依赖项已打开 "如果存在适合的构建,则不运行新构建" 选项,那么 TeamCity 会通过使用已经完成的构建来优化队列中的构建,而不是使用队列中的构建。 相应的排队构建随后会被静默移除。 这个程序可以多次执行,因为,当链的构建仍在队列中时,新的构建可能开始并完成;
所有通过快照依赖关系连接的构建都由 TeamCity 启动,并明确指定了源代码的修订版。 修订版本的计算方式是以它能对应相同的时间点(对于相同的 VCS 根目录来说,它是相同的修订版本号)。 对于一个排队的构建链(所有与快照依赖关联的构建),在把构建添加到队列后确定要使用的修订版本。 在此时,链中的所有 VCS 根都会检查是否有更改,当前的版本会在构建中进行固定;
如果在指向同一构建配置的 来自同一链的构建 上存在快照依赖和工件依赖,TeamCity 确保从同一源构建中下载工件。
默认情况下,构建链中的构建会被保留,不会被清理,但这可以在每个构建配置的基础上进行切换。 参阅 清理 描述以获取更多详情。
根据依赖关系,拓扑构建可以顺序执行或并行执行。
在构建失败的情况下,可以通过快照依赖项选项自定义构建链继续的行为。 对于每一个失败或启动失败的依赖项,您可以选择以下四种选项之一:
运行构建,但添加问题:将运行依赖的构建,并将问题添加到其中,改变其状态为失败(如果问题之前没有被静音)
运行构建,但不添加问题:依赖的构建将被运行,且不会添加任何问题
将构建标记为无法启动:依赖的构建将不会运行,并将被标记为“无法启动”
取消构建:依赖的构建将不会运行,并会被标记为“已取消”。
一个链的构建可以通过 dep.<configurationId>.<parameterName>
语法从前面的构建中 引用参数。
当触发具有快照依赖项的构建时,存在一种 特殊支持 用于将参数推向链下方。 这是通过定义一个带有 reverse.dep.<configurationId>.<parameterName>
名称的参数来完成的。
在为链中的构建设置 触发器 时,推荐的方法是:考虑结果—— 您希望在过程结束时获得的构建,并在其对应的 "顶部" 构建配置中配置触发器。 在这个顶级的构建配置所依赖的配置中,不需要任何触发器,因为当顶级配置被触发时,它们的构建会自动被放入队列中。
请参见相关的“在快照依赖关系中变更触发器” 设置 ,以及“版本控制设置”配置部分中的“显示快照依赖关系的变更” 复选框。
让我们举一个例子来说明快照依赖是如何工作的。
假设我们有两个构建配置,A 和 B,配置 A 依赖于配置 B 的快照,且已强制进行修订同步。
当触发配置A的构建时,它将自动触发配置B的构建,两者的构建将被放置到构建队列中。 构建 B 首先开始,构建 A 将在队列中等待,直到构建 B 完成(如果没有设置其他特定选项)。
当构建 B 和 A 被添加到队列中时,TeamCity 会调整这些构建中包含的源代码。 所有构建都将在将构建添加到队列的那一刻获取源代码进行运行。
当构建 B 完成,且成功完成时,TeamCity 将开始运行构建 A。
以上示例展示了快照依赖的核心基础,这是一个没有任何额外选项的直接过程。 关于快照依赖项选项,请参考 快照 页面。
构件依赖
构件依赖性为您提供了一种方便的手段,可以在另一建构中使用一个建构的输出(artifacts)。 当配置了工件依赖性后,在构建开始前,所需的工件会被下载到代理。 您可以查看构建中使用了哪些构件,或者哪次构建使用了当前构建的构件,只需使用构建结果的 依赖关系 标签页即可。
要创建和配置构件依赖性,请使用 依赖 构建配置设置页面。 如果您需要在构建脚本中或本地下载制品,可以使用 REST API 或 Ivy Ant 任务 来执行此操作。
清理工件的注意事项
如果其他构建下载了工件,并且这些构建尚未清理,那么可能无法清理这些构件。 对于具有配置的工件依赖关系的构建配置,您可以指定此配置从其他构建下载的工件是否可以被清理。 这个设置可以在 清理策略 页面上找到。