TeamCity On-Premises 2024.03 Help

使用 Build Queue 工作

在 TeamCity 中,构建队列是一个列表,列出了已被触发或手动启动且等待开始的构建。 TeamCity 会在它们变为空闲时立即将它们分发给 兼容的 构建代理。 一个排队的构建在其开始在代理上的时刻被指派给一个代理;在构建等待在构建队列中时,不会进行预赋。

队列页面

从顶部导航栏访问 Queue 页面。 这个页面显示了等待运行的构建列表,并为每个构建显示以下信息:

  • 队列中的位置,也同时作为一个链接至 构建结果 页面。

  • 源分支名称(如果可用)。

  • 层次结构中的可链接路径:所有的父子项目和构建配置。

  • 开始时间:预计等待持续时间。 将鼠标悬停在预估时间值上方会显示一个工具提示,其中包含以下信息:

    • 预期的开始/结束时间。

    • 计划代理的链接。

    • 如果当前构建是 构建链 的一部分,并且它依赖的构建尚未完成,则将显示相应的提示。 对于一些构建,例如从未运行过的构建,TeamCity 无法估算可能的持续时间,因此将在工具提示中显示相应的消息。

  • 关于触发构建的 事件 的简短描述。

  • 与此构建配置兼容的代理数量。 您可以点击代理的名称链接以打开 Agents 页面,或使用向下箭头在弹出菜单中快速查看兼容代理的列表。

由 TeamCity 进行的构建队列优化

默认情况下,TeamCity 会按照以下方式优化构建队列:

  • 如果队列中存在类似的构建,则不会添加新的构建(在相同的更改集和具有相同自定义属性)。

  • 如果一个自动触发的构建链有比已经在队列中的构建链更多的更改,后者将被自动触发的构建链替换,如果这样的替换不会延迟获取构建链的结果(基于估计的持续时间)。

  • 当构建链在排队时,TeamCity 会尝试用相等的已开始构建来替换排队的构建。

  • 处于队列中超过15天的构建将自动取消(例如,如果没有兼容的代理)。

排队构建的代理选择

当有几个空闲代理可以运行排队的构建时,TeamCity 会按照以下方式尝试选择最快的一个:

  1. 如果代理上之前没有运行过构建,那么将使用 CPU 排名 来选择一个代理。

  2. 如果构建任务之前已在代理上运行过,那么将会使用给定的构建配置的预计构建时间来选择一个代理。 该估计是基于构建配置历史中最新构建的启发式方法制定的;在估计过程中,较近期构建的执行时间比早期构建的执行时间具有更大的权重。 个人取消 的构建不被考虑在内,同样,与此构建配置的其余构建相比,任何个别构建的持续时间明显不同的也不会被考虑。

构建队列排序

您可以:

  • 将队列中的构建手动重新排序。

  • 从队列中移除构建配置或个人构建。

  • 拥有系统管理员权限后,您可以为构建配置指定不同的优先级,这将影响它们在队列中的位置。

手动重新排序队列中的构建

要在构建队列中重新排序构建,您需要将它们拖到所需的位置。

从构建队列中移除构建

要从队列中移除构建,勾选选定构建旁边的 Remove 框,然后确认删除。 如果要从队列中移除的构建是构建链的一部分,那么 TeamCity 会在注释字段的下方显示相应的信息。 请参阅 Build Chain 文章以获取详细信息。

此外,您可以:

  • 一次性从 Actions 菜单中移除队列中的所有个人构建。

  • 从队列中移除几个 已暂停的构建配置 的版本。

将构建移至顶部

若要将构建移至队列的首位,请执行以下操作之一:

  • Queue 页面,点击构建序列号旁边的箭头按钮。

    移至顶部
  • 在 UI 中的任何位置点击构建编号或构建状态链接,然后,在排队构建的 构建结果 页面上,点击右上角的 操作 菜单。 选择 移至顶部 操作。

对于一个 composite build,整个构建链将会被移动到队列的最前端。 如果正在运行的组合构建有尚未开始的依赖构建,只需在用户界面的任何位置点击构建编号或构建状态链接,然后在运行构建的 构建结果 页面中,点击右上角的 操作 菜单。 选择 将队列依赖项移至顶部 操作。 此构建的所有排队依赖将被移至队列顶部。

管理构建优先级

默认情况下,构建按照触发顺序放置在构建队列中:最近触发的构建被添加到队列的末尾。 可以更改构建的优先级,以便根据其定义的优先级和当前排队构建的等待时间,将构建插入到构建队列的某个位置。

您可以通过创建 Priority Classes 来控制构建优先级。 优先级类是一组具有指定优先级的构建配置(数字越高,优先级越高;例如, priority=2 高于 优先级=1)。 配置的优先级越高,添加到构建队列时其所在的位置就越靠前。

要访问这些设置,您需要在 Queue 页面的右上角点击 Priorities。 请注意,只有系统管理员才能使用此操作。

有两个预定义的优先级类别:个人默认,两者都带有 priority=0

  • 所有个人构建(通过 Remote RunPre-tested Commit 启动)一旦被添加到构建队列,将被分配到 Personal 优先级类别。 您可以更改个人构建的优先级。

  • Default 类包含了所有未与其他类关联的构建。 这允许创建一个优先级低于默认级别的类,并将一些构建置于队列的末尾。

要创建新的优先级类别:

  1. 单击 创建新的优先级类别

  2. 指定其名称,优先级(在 -100..100 范围内),以及其他描述。 点击 Create

  3. 点击 Add configurations 并指定在此类中应具有优先级的构建配置。

仅当构建添加到队列时,此设置才会被考虑。 为了确保较低优先级的构建始终有机会运行,TeamCity 也会考虑每个构建在队列中的停留时间。 这使得长时间等待的构建可以在最近添加的高优先级构建之前以较低的优先级运行。 请参阅下方的算法详细解释。

构建优先级算法

每次将新的构建添加到队列中时,都会重新计算所有构建的优先级,并将新构建放置在位置 我先 ,使得 位于 i-1 位置的构建优先级 >= 新构建的优先级 > 位于 i+1 位置的构建优先级i = 0 位于队列的顶部)。

我们使用以下公式来重新计算队列中构建的优先级:

buildPriority = (timeSpentInTheQueue / estimatedBuildDuration) + buildConfigurationPriority

所以,当构建在队列中等待的时间等于预估的构建时长时,其优先级将提高一级。 这有助于让优先级较低的构建最终开始。

暂停和恢复构建队列

构建队列可以手动或自动暂停。 在这种情况下,构建仍然会被添加到队列中,但是只有队列恢复运行时,才会分配给代理。

拥有 启用/禁用代理 权限的用户(默认包含在 代理管理器 角色中)可以手动暂停/恢复构建队列(因为暂停队列等同于禁用服务器上的所有代理)。 这个操作可以在 Queue 页面的右上角找到。

如果 TeamCity 服务器磁盘空间不足,构建队列可以自动暂停 TeamCity 磁盘空间监视器。 当有足够的空间可用时,队列将会自动恢复。

当队列被暂停时,TeamCity 中的每一个页面都将包含一条关于暂停原因的信息。

限制构建队列的最大大小

可以限制队列中的最大构建数量。 默认情况下,构建的限制是 6000 次。 默认值可以通过配置 teamcity.buildTriggersChecker.queueSizeLimit 内部属性 来更改。

当队列大小达到限制时,TeamCity将暂停 自动构建触发。 一旦队列大小低于限制,它将会再次启用。 在触发器暂停期间,所有用户都会显示警告信息。
然而,即使队列已达到限制并且自动触发已暂停,仍然可以手动向队列添加构建。

最后修改日期: 16日 7月 2024年