管道运行顺序

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

运行表示管道的一次执行。 在运行期间,将处理管道,代理处理一个或多个作业。 管道运行包括 作业、步骤和任务。 运行持续集成 (CI) 和持续交付 (CD) 管道。

管道概述

运行管道时,许多事情都会在幕后发生。 虽然你通常不需要了解它们,但有时了解大局会很有用。 在高级别,Azure Pipelines 将:

在代理端,对于每个作业,代理将:

作业可能会 成功、失败或被取消。 在某些情况下,作业 可能无法完成。 了解这种情况的发生方式有助于排查问题。

让我们逐个细分每个操作。

处理管道

展开 YAML 模板

若要将管道转换为运行,Azure Pipelines 按以下顺序执行几个步骤:

  1. 首先,展开 模板 并计算 模板表达式
  2. 接下来,在 阶段 级别评估依赖项,以选择要运行的第一个阶段 () 。
  3. 对于选择运行的每个阶段,会发生两种情况:
  4. 对于选择运行的每个作业,将 yamL (strategy: matrixstrategy: parallel 中的多配置) 展开为多个运行时作业。
  5. 对于每个运行时作业,请评估 条件 以确定该作业是否有资格运行。
  6. 为每个符合条件的运行时作业请求代理

运行时作业完成后,Azure Pipelines 将查看是否有新作业有资格运行。 如果是这样,步骤 4 - 6 将重复执行新作业。 同样,随着阶段的完成,任何新阶段都将重复步骤 2 - 6。

此排序有助于回答一个常见问题:为什么无法在 模板参数中使用某些变量? 第 1 步是模板扩展,它仅对 YAML 文档的文本进行操作。 在该步骤中不存在运行时变量。 在第 1 步之后,模板参数已解析,不复存在。

它还回答了另一个常见问题:为什么无法使用 变量 解析服务连接/环境名称? 资源在阶段开始运行之前已获得授权,因此阶段和作业级别的变量不可用。 可以使用管道级变量,但只能使用这些显式包含在管道中的变量。 变量组本身就是需要授权的资源,因此在检查资源授权时,它们的数据同样不可用。

请求代理

每当 Azure Pipelines 需要运行作业时,它都会向 请求 代理。 (服务器作业 是一个例外,因为它们在 Azure Pipelines 服务器本身上运行。) Microsoft 托管自承载 代理池的工作方式略有不同。

Microsoft 托管的代理池请求

首先,服务会检查组织的并行作业。 它将所有 Microsoft 托管代理上正在运行的所有作业相加,并将其与购买的并行作业数进行比较。 如果没有可用的并行槽,作业必须等待某个槽释放。

并行槽可用后,作业将路由到请求的代理类型。 从概念上讲,Microsoft 托管的池是一个巨大的全局计算机池。 (实际上,它是按地理位置和操作系统类型拆分的许多不同的物理池。) 根据 vmImage YAML) 中的 (或经典编辑器中) 请求的池名称 (,选择了代理。

池选择

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

自承载代理池请求

Microsoft 托管的池类似,该服务首先检查组织的并行作业。 它将所有自承载代理上运行的所有作业相加,并将其与购买的并行作业数进行比较。 如果没有可用的并行槽,作业必须等待某个槽释放。

并行槽可用后,将检查自承载池以查找兼容的代理。 自承载代理提供 的功能是表示已安装特定软件或配置设置的字符串。 管道有 需求,即运行作业所需的功能。 如果找不到功能与管道需求匹配的自由代理,作业将继续等待。 如果池中没有其功能与需求匹配的代理,则作业将失败。

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

准备运行作业

代理接受作业后,需要执行一些准备工作。 代理下载 (和缓存,下次) 运行作业所需的所有 任务 。 它在磁盘上创建工作区,用于保存运行中使用的源代码、项目和输出。 然后,它开始 运行步骤

运行每个步骤

步骤按顺序运行,一个接一个。 必须先完成上述所有步骤 (或跳过) 步骤,然后才能开始步骤。

运行每个任务

步骤由 任务实现。 任务本身作为Node.js或 PowerShell 脚本实现。 任务系统将输入和输出路由到支持脚本。 它还提供一些常见服务,例如更改系统路径和创建新的 管道变量

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

有一个用于创建新管道变量的代理命令。 在下一步中,管道变量将自动转换为环境变量。 若要设置值为 myValue的新变量myVar,脚本可以执行此操作:

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

报告和收集结果

每个步骤都可以报告警告、错误和失败。 错误和警告将报告到管道摘要页,将任务标记为“成功且出现问题”。 失败也会报告到摘要页,但它们会将任务标记为“失败”。 如果步骤使用 ##vso 命令) 显式报告失败 (或以非零退出代码结束脚本,则为失败。

日志和结果从代理流向服务

步骤运行时,代理会不断向服务发送输出行。 这就是你可以看到主机的实时源的原因。 在每个步骤结束时,步骤的整个输出也会作为日志文件上传。 管道完成后,可以下载日志。 代理可以上传的其他项包括 项目测试结果。 管道完成后,也可使用它们。

状态和条件

代理跟踪每个步骤的成功或失败。 当步骤成功并出现问题或失败时,作业的状态将更新。 作业始终反映其每个步骤的“最差”结果:如果某个步骤失败,作业也会失败。

在运行步骤之前,代理将检查该步骤的条件,以确定它是否应运行。 默认情况下,仅当作业的状态为成功或成功且出现问题时,步骤才会运行。 许多作业都有清理步骤,无论发生其他什么情况都需要运行,因此它们可以将条件指定为“always () ”。 清理步骤也可能设置为仅在 取消时运行。 成功的清理步骤无法避免作业失败;进入失败后,作业永远无法恢复成功。

超时和断开连接

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

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

由于 Azure Pipelines 不时地将工作分发到代理计算机,因此代理可能会停止响应服务器。 如果代理的主机 (断电、VM 关闭) 或网络故障,则可能会发生这种情况。 为了帮助检测这些情况,代理每分钟发送一次检测信号消息,让服务器知道它仍在运行。 如果服务器连续五分钟未收到检测信号,则假定代理不会返回。 作业标记为失败,让用户知道他们应该重试管道。

通过 CLI 管理运行

使用 Azure DevOps CLI,可以列出项目中的管道运行,并查看有关特定运行的详细信息。 还可以在管道运行中添加和删除标记。

先决条件

  • 必须已安装 Azure DevOps CLI 扩展,如 Azure DevOps CLI 入门中所述。
  • 使用 az login 登录到 Azure DevOps。
  • 对于本文中的示例,请使用 az devops configure --defaults organization=YourOrganizationURL 设置默认组织。

列出管道运行

使用 az pipelines runs list 命令列出项目中的管道运行。 要入门学习,请参阅 Azure DevOps CLI 入门

az pipelines runs list [--branch]
                       [--org]
                       [--pipeline-ids]
                       [--project]
                       [--query-order {FinishTimeAsc, FinishTimeDesc, QueueTimeAsc, QueueTimeDesc, StartTimeAsc, StartTimeDesc}]
                       [--reason {all, batchedCI, buildCompletion, checkInShelveset, individualCI, manual, pullRequest, schedule, triggered, userCreated, validateShelveset}]
                       [--requested-for]
                       [--result {canceled, failed, none, partiallySucceeded, succeeded}]
                       [--status {all, cancelling, completed, inProgress, none, notStarted, postponed}]
                       [--tags]
                       [--top]

可选参数

  • 分支:按此分支的内部版本进行筛选。
  • org:Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=ORG_URL 配置默认组织。 如果未配置为默认值或通过 git config 选取,则此参数是必需的。 示例:--org https://dev.azure.com/MyOrganizationName/
  • pipeline-ids:要列出其生成的定义的空格分隔 ID。
  • project:项目的名称或 ID。 可以使用 az devops configure -d project=NAME_OR_ID 配置默认项目。 如果未配置为默认或通过 git config 进行选取,则为必需。
  • query-order:定义列出管道运行的顺序。 接受的值为 FinishTimeAscFinishTimeDescQueueTimeAscQueueTimeDescStartTimeAscStartTimeDesc
  • reason:仅列出出于此指定原因的生成。 接受的值为 batchedCIbuildCompletioncheckInShelvesetindividualCImanualpullRequestscheduletriggereduserCreatedvalidateShelveset
  • requested-for:限制为指定用户或组请求的版本。
  • result:限制为具有指定结果的生成。 接受的值是 取消失败部分成功和 成功
  • status:限制为具有指定状态的生成。 接受的值为 allcancellingcompletedinProgressnonenotStartedpostponed
  • 标记:限制为具有每个指定标记的生成。 空格分隔。
  • top:要列出的最大生成数。

示例

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

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 runs show 命令显示项目中管道运行的详细信息。 要入门学习,请参阅 Azure DevOps CLI 入门

az pipelines runs show --id
                       [--open]
                       [--org]
                       [--project]

参数

  • id:必需。 管道运行的 ID。
  • open:可选。 在 Web 浏览器中打开生成结果页。
  • org:Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=ORG_URL 配置默认组织。 如果未配置为默认值或通过 git config 选取,则此参数是必需的。 示例:--org https://dev.azure.com/MyOrganizationName/
  • project:项目的名称或 ID。 可以使用 az devops configure -d project=NAME_OR_ID 配置默认项目。 如果未配置为默认值或通过 git config 选取,则此参数是必需的。

示例

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

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 runs tag add 命令将标记添加到项目中的管道运行。 要入门学习,请参阅 Azure DevOps CLI 入门

az pipelines runs tag add --run-id
                          --tags
                          [--org]
                          [--project]

参数

  • run-id:必需。 管道运行的 ID。
  • tags:必需。 要添加到管道运行的标记 () 逗号分隔的值。
  • org:Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=ORG_URL 配置默认组织。 如果未配置为默认值或通过 git config 选取,则此参数是必需的。 示例:--org https://dev.azure.com/MyOrganizationName/
  • project:项目的名称或 ID。 可以使用 az devops configure -d project=NAME_OR_ID 配置默认项目。 如果未配置为默认值或通过 git config 选取,则此参数是必需的。

示例

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

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

[
  "YAML"
]

列出管道运行标记

使用 az pipelines runs tag list 命令列出项目中管道运行的标记。 要入门学习,请参阅 Azure DevOps CLI 入门

az pipelines runs tag list --run-id
                           [--org]
                           [--project]

参数

  • run-id:必需。 管道运行的 ID。
  • org:Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=ORG_URL 配置默认组织。 如果未配置为默认值或通过 git config 选取,则此参数是必需的。 示例:--org https://dev.azure.com/MyOrganizationName/
  • project:项目的名称或 ID。 可以使用 az devops configure -d project=NAME_OR_ID 配置默认项目。 如果未配置为默认值或通过 git config 选取,则此参数是必需的。

示例

以下命令列出 ID 为 123 的管道运行的标记,并返回表格式的结果。

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

Tags
------
YAML

从管道运行中删除标记

使用 az pipelines runs tag delete 命令从项目中的管道运行中删除标记 。 要入门学习,请参阅 Azure DevOps CLI 入门

az pipelines runs tag delete --run-id
                             --tag
                             [--org]
                             [--project]

参数

  • run-id:必需。 管道运行的 ID。
  • 标记:必需。 要从管道运行中删除的标记。
  • org:Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=ORG_URL 配置默认组织。 如果未配置为默认值或通过 git config 选取,则此参数是必需的。 示例:--org https://dev.azure.com/MyOrganizationName/
  • project:项目的名称或 ID。 可以使用 az devops configure -d project=NAME_OR_ID 配置默认项目。 如果未配置为默认值或通过 git config 选取,则此参数是必需的。

示例

以下命令从 ID 为 123 的管道运行中删除 YAML 标记。

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