任务类型和使用情况

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

Azure Pipelines 作业由步骤组成,可以是任务或脚本。 任务是预打包的脚本或过程,用于执行作或使用一组输入来定义管道自动化。 本文介绍管道任务以及如何使用它们。 有关架构信息,请参阅 steps.task 定义。

Azure Pipelines 包括许多内置任务,这些任务可实现基本生成和部署方案。 有关可用的内置 Azure Pipelines 任务的列表,请参阅 Azure Pipelines 任务参考。 还可以从 Visual Studio Marketplace 安装任务或 创建自定义任务

默认情况下,作业中的所有步骤都在同一上下文中按顺序运行,无论是在主机上还是在 作业容器中。 可以选择使用 步骤目标 来控制各个任务的上下文。 若要在多个代理上并行运行某些任务,或者不使用代理,请参阅 管道中的“指定作业”。

任务管理

任务在 Azure DevOps 组织 级别可用并安装。 只能使用组织存在的任务和任务版本。

可以在“任务限制”下禁用“组织设置>>”中的内置任务、市场任务或两者。 如果同时禁用内置任务和市场任务,则只能使用 适用于 Azure DevOps 的 Node CLI 安装的任务。

禁用市场任务有助于提高管道安全性。 在大多数情况下,不应禁用内置任务。 有关详细信息,请参阅 “控制可用任务”。

自定义任务

Visual Studio Marketplace 提供了许多可以安装的扩展来扩展 Azure Pipelines 任务目录。 还可以创建自定义任务。 有关详细信息,请参阅 添加自定义管道任务扩展

在 YAML 管道中,可以按名称引用任务。 如果自定义任务名称与内置任务名称匹配,则管道将使用内置任务。 为了避免这种情况,可以使用创建任务时分配的唯一任务 GUID 来引用自定义任务。 有关详细信息,请参阅 了解 task.json 组件

任务版本

任务经过版本控制,必须指定管道中使用的任务的主要版本。 指定版本有助于防止在发布新版本的任务时出现问题。

管道自动更新以使用新的次要任务版本,例如 1.2 到 1.3。 次要任务版本通常向后兼容,但在某些情况下,当任务自动更新时,可能会遇到不可预知的错误。

如果新的主任务版本(如 2.0 版本),则管道将继续使用指定的主版本,直到编辑管道以手动更改为新的主版本。 当有新的主要版本可用时,生成日志会提供警报。 只能使用你的组织中存在的任务版本。

在 YAML 中,可以在任务名称中使用指定主版本 @ 。 例如,若要使用任务版本 2 PublishTestResults ,请指定 PublishTestResults@2。 可以通过在后面提供完整的任务版本号 @来指定要使用的次要版本,例如 GoTool@0.3.1

任务选项

以下属性可用于 YAML 管道 task 步骤。 有关详细信息,请参阅 steps.task 定义。

资产 类型 Description
task 字符串 必需为第一个属性。 要运行的任务的名称。
inputs 字符串 任务的输入,使用名称/值对。
condition 字符串 任务运行的条件。
continueOnError 布尔 是否在失败时继续运行。
displayName 字符串 任务的可读名称。
enabled 布尔 作业运行时是否运行此任务。
env 字符串 使用名称/值对映射到进程环境的变量。
name 字符串 步骤的 ID。
retryCountOnTaskFailure 字符串 如果任务失败,则重试次数。
target 字符串 要在其中运行此任务的环境。
timeoutInMinutes 字符串 任务在自动取消之前可以运行的最长时间。

条件

任务无法确定任务完成后是否继续管道作业,仅提供结束状态,例如 succeededfailed。 然后,下游任务和作业可以基于该状态设置, condition 以确定是否要运行。

conditions 属性指定运行此任务的条件。 默认情况下,如果作业中没有任何内容失败,并且紧靠在作业完成前的步骤,则步骤将运行。

你可以通过设置要运行的步骤来替代或自定义这些默认值,即使以前的依赖项失败或有另一个结果也是如此。 还可以定义由表达式组成的自定义条件

注意

条件适用于具有相同代理池的所有以前的直接和间接依赖项。 不同代理池中的阶段或作业同时运行。

基于以前的依赖项状态的条件包括:

  • 成功:仅当所有以前的依赖项都成功时运行。 如果未在 YAML 中设置任何条件,则此行为是默认值。 若要应用此条件,请指定 condition: succeeded()
  • 成功或失败:即使以前的依赖项失败,也运行,除非取消运行。 若要应用此条件,请指定 condition: succeededOrFailed()
  • 始终:即使以前的依赖项失败,运行也会失败,即使已取消运行。 若要应用此条件,请指定 condition: always()
  • 失败:仅在以前的依赖项失败时运行。 若要应用此条件,请指定 condition: failed()

在以下 YAML 示例中, PublishTestResults@2 即使上一步失败,也因 其成功OrFailed 条件而运行。

steps:
- task: UsePythonVersion@0
  inputs:
    versionSpec: '3.x'
    architecture: 'x64'
- task: PublishTestResults@2
  inputs:
    testResultsFiles: "**/TEST-*.xml"
  condition: succeededOrFailed()

出错时继续

continueOnError 属性告知任务是否继续运行并报告成功,而不考虑失败。 如果设置为 />,则此属性指示任务忽略 状态并继续运行。 下游步骤和作业在做出运行决策时将任务结果视为这些结果 success

已启用

默认情况下,每当作业运行时,任务将运行。 可以设置为enabledfalse禁用任务。 暂时禁用该任务对于出于测试目的或特定部署从流程中删除任务非常有用。

任务失败的重试计数

retryCountOnTaskFailure 属性指定在任务失败时重试任务的次数。 默认值为零个条目。

  • 允许的最大重试次数为 10。
  • 每次尝试失败后,重试前的等待时间都会增加,遵循指数退避策略。 第一次重试发生在 1 秒后,第二次重试 4 秒,第 1 次重试后为 100 秒。
  • 重试任务不提供幂等性。 第一次尝试的副作用(例如部分创建外部资源)可能会导致重试失败。
  • 没有有关任务可用的重试次数的信息。
  • 任务失败会向任务日志添加警告,指示在重试任务之前失败。
  • 所有重试尝试都显示在 UI 中,作为同一任务节点的一部分。

注意

retryCountOnTaskFailure 属性需要代理版本 2.194.0 或更高版本。 在 Azure DevOps Server 2022 上, 无代理任务不支持重试。 有关详细信息,请参阅 2021 年 11 月 16 日 Azure DevOps 服务更新 - 自动重试任务Azure DevOps 服务更新 2025 年 6 月 14 日 - 服务器任务的重试

目标

任务在执行上下文中运行,所谓的执行上下文是指代理主机或容器。 任务可以通过指定 < a0 /a0> 来替代其上下文。 可用选项是 host 针对代理主机,以及管道中定义的任何容器。 在以下示例中, SampleTask@1 在主机上运行并在 AnotherTask@1 容器中运行。

resources:
  containers:
  - container: pycontainer
    image: python:3.11

steps:
- task: SampleTask@1
  target: host
- task: AnotherTask@1
  target: pycontainer

超时

超时期限从任务开始运行时开始,不包括任务排队或正在等待代理的时间。

注意

除了任务级别超时之外,管道还可以指定作业级别超时。 如果作业级别超时间隔在任务完成之前已过,则运行作业将终止,即使任务配置了更长的超时间隔。 有关详细信息,请参阅超时

环境变量

可以使用环境变量将系统或用户定义的信息映射到任务进程。

YAML 管道任务可以指定一个 env 属性,该属性列出表示环境变量的名称/值字符串。

- task: AzureCLI@2
  env:
    ENV_VARIABLE_NAME: value
    ENV_VARIABLE_NAME2: value
  ...

可以使用步骤或命令行、Bash 或 PowerShell 任务中的脚本来设置环境变量 script

以下示例运行一个 script 步骤,该步骤将值 ENV_VARIABLE_NAME 分配给环境变量并回显该值。

- script: echo "This is " $ENV_VARIABLE_NAME
  env:
    ENV_VARIABLE_NAME: value
  displayName: 'echo environment variable'

上述脚本在功能上与使用输入运行 Bash@3 任务 script 相同。 以下示例使用 task 语法。

- task: Bash@3
  inputs:
    script: echo "This is " $ENV_VARIABLE_NAME
  env:
    ENV_VARIABLE_NAME: value
  displayName: 'echo environment variable'

生成工具安装程序任务

生成工具安装程序任务使生成管道能够安装和控制依赖项。 可以使用生成工具安装程序任务:

  • 为生成安装工具或运行时,包括 Microsoft托管代理
  • 针对依赖项的多个版本(例如 Node.js)验证应用或库。

有关工具安装程序任务的列表,请参阅 工具任务

示例:在多个版本的 Node.js 上测试和验证应用

以下示例设置一个生成管道,用于在多个版本的 Node.js上运行和验证应用。

在项目的基目录中创建 包含以下内容的azure-pipelines.yml 文件。

pool:
  vmImage: 'windows-latest'

jobs:
- job: NodeJS
  strategy:
    matrix:
      node14:
        nodeVersion: '14.x'
      node16:
        nodeVersion: '16.x'
    maxParallel: 2
  steps:
    - task: NodeTool@0
      displayName: 'Install Node.js $(nodeVersion)'
      inputs:
        versionSpec: '$(nodeVersion)'
        checkLatest: true

    - script: |
        echo Using Node version $(nodeVersion)
        node --version
      displayName: 'Verify Node Installation'

保存并运行管道。 作业运行两次,每个版本的变量中 nodeVersion 指定的 Node.js 各运行一个。

Node.js 工具安装程序可下载 Node.js 版本(如果尚未安装在代理上)。 命令行脚本将已安装的版本写入命令行。

帮助和支持