管道运行

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

本文介绍 Azure Pipelines 管道运行中的活动序列。 运行表示管道的一次执行。 持续集成(CI)和持续交付(CD)管道由运行组成。 在运行期间,Azure Pipelines 处理管道, 代理 处理一个或多个 作业、步骤和任务

显示管道概述的关系图。

对于每次运行,Azure Pipelines:

  • 处理管道。
  • 请求一个或多个代理来运行作业。
  • 将作业移交给代理并收集结果。

对于每个作业,一个代理:

  • 准备作业。
  • 运行作业中的每个步骤。
  • 报告结果。

作业可能会成功、失败、取消或未完成。 了解这些结果有助于排查问题。

以下部分详细介绍了管道运行过程。

管道处理

显示扩展 YAML 模板的关系图。

若要处理运行管道,请先使用 Azure Pipelines:

  1. 展开模板并计算模板表达式
  2. 评估阶段级别的依赖项以选择要运行的第一个阶段。

对于选择运行的每个阶段,Azure Pipelines:

  1. 收集和验证要运行授权的所有作业资源
  2. 评估作业级别的依赖项以选择要运行的第一个作业。

Azure Pipelines 针对它选择运行的每个作业执行以下操作:

  1. 将 YAML strategy: matrixstrategy: parallel多配置扩展到多个运行时作业。
  2. 评估条件以确定作业是否有资格运行。
  3. 请求每个符合条件的作业的代理。

当运行时作业完成时,Azure Pipelines 会检查是否有新作业有资格运行。 同样,随着阶段的完成,Azure Pipelines 会检查是否有更多阶段。

变量

了解处理顺序阐明了为何无法在模板参数中使用某些变量。 第一个模板扩展步骤仅在 YAML 文件的文本上运行。 在该步骤中尚不存在运行时变量。 完成此步骤后,模板参数已解析。

也不能使用 变量 解析服务连接或环境名称,因为管道在阶段开始运行之前授权资源。 暂存和作业级变量尚不可用。 变量组本身是受授权约束的资源,因此在检查资源授权时,其数据不可用。

可以使用管道资源定义中显式包含的管道级变量。 有关详细信息,请参阅作为预定义变量的管道资源元数据

代理

当 Azure Pipelines 需要运行作业时,它会从请求代理。 此过程对于 Microsoft托管 的代理池和 自承载 代理池的工作方式不同。

注意

服务器作业 不使用池,因为它们在 Azure Pipelines 服务器本身上运行。

显示池选择的示意图。

并行作业

首先,Azure Pipelines 会检查组织的 并行作业。 该服务在所有代理上添加所有正在运行的作业,并将其与授予或购买的并行作业数进行比较。

如果没有可用的并行槽,作业必须等待某个槽释放。 并行槽可用后,作业会路由到相应的代理类型。

Microsoft 托管代理

从概念上讲,Microsoft托管池是一个全局计算机池,尽管它在物理上是许多不同的池,按地理位置和操作系统类型拆分。 Azure Pipelines 根据请求的 YAML vmImage 或经典编辑器池名称选择代理。

Microsoft池中的所有代理都是从未运行任何管道的新虚拟机(VM)。 作业完成后,将丢弃代理 VM。

自托管代理

并行槽可用后,Azure Pipelines 会检查自承载池中是否具有兼容的代理。 自承载代理提供 的功能,指示安装了特定软件或配置了设置。 管道有某些需求,也就是运行作业所需的功能。

如果 Azure Pipelines 找不到功能与管道需求匹配的免费代理,该作业将继续等待。 如果池中没有与需求匹配的代理,作业将失败。

自托管代理通常在不同运行中重复使用。 对于自承载代理,管道作业可能会产生副作用,例如预热缓存或在本地存储库中已提供大多数提交。

作业准备

代理接受作业后,它会执行以下准备工作:

  1. 下载运行作业所需的所有任务,并缓存这些任务以供将来使用。
  2. 在磁盘上创建工作空间,用于保存运行中使用的源代码、项目和输出。

步骤执行

代理按顺序运行步骤。 在步骤开始之前,必须完成或跳过所有以前的步骤。

显示运行每个任务的关系图。

步骤由 任务实现,这些任务可以是Node.js、PowerShell 或其他脚本。 任务系统将输入和输出路由到支持脚本。 任务还提供常见服务,例如更改系统路径和创建新的 管道变量

每个步骤在其自己的进程中运行,将环境与前面的步骤隔离开来。 由于这种按步骤执行的进程模型,不会跨步骤步骤保留环境变量。 但是,任务和脚本可以使用称为 日志记录命令 的机制来与代理通信。 当任务或脚本将日志记录命令写入标准输出时,代理将执行命令请求的任何操作。

可以使用日志记录命令创建新的管道变量。 下一步中,管道变量会自动转换为环境变量。 脚本可以设置值myValue如下的新变量myVar

echo '##vso[task.setVariable variable=myVar]myValue'
Write-Host "##vso[task.setVariable variable=myVar]myValue"

结果报告和集合

每个步骤都可能会报告警告、错误和失败。 该步骤通过将任务标记为问题成功来报告管道摘要页上的错误和警告,或者通过将任务标记为失败来报告失败。 如果步骤使用 ##vso 命令显式报告失败,或者以非零退出代码结束脚本,则步骤将失败。

随着步骤的运行,代理会不断将输出行发送到 Azure Pipelines,以便可以看到控制台的实时源。 在每个步骤结束时,该步骤的整个输出将作为日志文件上传。 管道完成后,可以下载日志。

显示日志和结果如何从代理流向服务的关系图。

代理还可以上传项目和测试结果,这些项目在管道完成后也可用。

状态和条件

代理跟踪每个步骤成功还是失败。 随着步骤成功并出现问题或失败,作业的状态将更新。 该作业始终反映每个步骤中最差的结果。 如果步骤失败,作业也会失败。

在代理运行步骤之前,它会检查该步骤 的条件 以确定该步骤是否应运行。 默认情况下,仅当作业的状态成功或出现问题时,才会运行一个步骤,但可以设置其他条件。

许多作业都有清理步骤,无论发生什么情况,都需要运行,因此它们可以指定条件 always()。 清理或其他步骤也可以设置为仅在取消时运行。

成功的清理步骤无法保存作业失败。 进入失败后,作业永远无法恢复成功。

超时和断开连接

每个作业都有一个超时。 如果作业未在指定时间内完成,服务器将取消该作业。 服务器尝试向代理发出停止信号,并将作业标记为已取消。 在代理端,取消意味着取消所有剩余步骤并上传所有剩余的结果。

作业的宽限期称为取消超时,用于完成任何取消工作。 还可以标记即使在取消时运行的步骤。 作业超时加上取消超时后,如果代理未报告工作已停止,服务器会将作业标记为失败。

如果代理的主机断电或已关闭,或者出现网络故障,代理计算机可能会停止响应服务器。 为了帮助检测这些情况,代理每分钟发送一次检测信号消息,让服务器知道它仍在运行。

如果服务器连续五分钟未收到检测信号,则假定代理不会返回。 作业标记为失败,则应告知用户应重试管道。

通过 Azure DevOps CLI 管理运行

可以使用 Azure DevOps CLI 中的 az pipelines 运行来管理管道运行。 若要开始,请参阅 Azure DevOps CLI 入门。 有关完整的命令参考,请参阅 Azure DevOps CLI 命令参考

以下示例演示如何使用 Azure DevOps CLI 列出项目中的管道运行、查看有关特定运行的详细信息以及管理管道运行的标记。

先决条件

  • 安装 Azure DevOps CLI 扩展的 Azure CLI,如 Azure DevOps CLI 入门中所述。 使用 az login.
  • 使用 az devops configure --defaults organization=<YourOrganizationURL>.. 设置的默认组织。

列出管道运行

使用 az pipelines runs list 命令列出项目中的管道运行。

以下命令列出状态为“已完成”和“成功”的前三个管道运行,并返回表格式的结果。

az pipelines runs list --status completed --result succeeded --top 3 --output table

Run ID    Number      Status     Result     Pipeline ID    Pipeline Name               Source Branch    Queued Time                 Reason
--------  ----------  ---------  ---------  -------------  --------------------------  ---------------  --------------------------  ------
125       20200124.1  completed  succeeded  12             Githubname.pipelines-java  master           2020-01-23 18:56:10.067588  manual
123       20200123.2  completed  succeeded  12             Githubname.pipelines-java  master           2020-01-23 11:55:56.633450  manual
122       20200123.1  completed  succeeded  12             Githubname.pipelines-java  master           2020-01-23 11:48:05.574742  manual

显示管道运行详细信息

使用 az pipelines run show 命令显示项目中管道运行的详细信息。

以下命令显示 ID 为 123 的管道运行的详细信息,以表格式返回结果,并将 Web 浏览器打开到 Azure Pipelines 生成结果页。

az pipelines runs show --id 122 --open --output table

Run ID    Number      Status     Result     Pipeline ID    Pipeline Name               Source Branch    Queued Time                 Reason
--------  ----------  ---------  ---------  -------------  --------------------------  ---------------  --------------------------  --------
123       20200123.2  completed  succeeded  12             Githubname.pipelines-java  master           2020-01-23 11:55:56.633450  manual

将标记添加到管道运行

使用 az pipelines run tag add 命令将标记添加到项目中的管道运行。

以下命令将标记 YAML 添加到 ID 为 123 的管道运行,并返回 JSON 格式的结果。

az pipelines runs tag add --run-id 123 --tags YAML --output json

[
  "YAML"
]

列出管道运行标记

使用 az pipelines run tag list 命令列出项目中管道运行的标记。 以下命令列出 ID 为 123 的管道运行的标记,并返回表格式的结果。

az pipelines runs tag list --run-id 123 --output table

Tags
------
YAML

从管道运行中删除标记

使用 az pipelines run tag delete 命令从项目中的管道运行中删除标记。 以下命令从 ID 123 的管道运行中删除 YAML标记。

az pipelines runs tag delete --run-id 123 --tag YAML