管道运行顺序
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
运行表示管道的一次执行。 在运行期间,将处理管道,代理处理一个或多个作业。 管道运行包括 作业、步骤和任务。 运行持续集成 (CI) 和持续交付 (CD) 管道。
运行管道时,许多事情都会在幕后发生。 虽然你通常不需要了解它们,但有时了解大局会很有用。 在高级别,Azure Pipelines 将:
- 处理管道
- 请求一个或多个代理运行作业
- 将作业移交给代理并收集结果
在代理端,对于每个作业,代理将:
作业可能会 成功、失败或被取消。 在某些情况下,作业 可能无法完成。 了解这种情况的发生方式有助于排查问题。
让我们逐个细分每个操作。
处理管道
若要将管道转换为运行,Azure Pipelines 按以下顺序执行几个步骤:
- 首先,展开 模板 并计算 模板表达式。
- 接下来,在 阶段 级别评估依赖项,以选择要运行的第一个阶段 () 。
- 对于选择运行的每个阶段,会发生两种情况:
- 所有作业中使用的所有资源都会收集并验证 以运行授权 。
- 在作业级别评估依赖项,选取要运行的第一个作业 () 。
- 对于选择运行的每个作业,将 yamL (
strategy: matrix
或strategy: parallel
中的多配置) 展开为多个运行时作业。 - 对于每个运行时作业,请评估 条件 以确定该作业是否有资格运行。
- 为每个符合条件的运行时作业请求代理。
运行时作业完成后,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:定义列出管道运行的顺序。 接受的值为 FinishTimeAsc、 FinishTimeDesc、 QueueTimeAsc、 QueueTimeDesc、 StartTimeAsc 和 StartTimeDesc。
- reason:仅列出出于此指定原因的生成。 接受的值为 batchedCI、 buildCompletion、 checkInShelveset、 individualCI、 manual、 pullRequest、 schedule、 triggered、 userCreated 和 validateShelveset。
- requested-for:限制为指定用户或组请求的版本。
- result:限制为具有指定结果的生成。 接受的值是 取消、 失败、 无、 部分成功和 成功。
- status:限制为具有指定状态的生成。 接受的值为 all、 cancelling、 completed、 inProgress、 none、 notStarted 和 postponed。
- 标记:限制为具有每个指定标记的生成。 空格分隔。
- 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
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈