任务类型 使用情况

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

注意

在 Microsoft Team Foundation Server (TFS) 2018 和更低版本中,生成和发布管道被称为“定义”,运行被称为“生成”,服务连接被称为“服务终结点”,阶段被称为“环境”,而作业被称为“阶段” 。

任务是在管道中定义自动化的构建基块。 任务只是使用一组输入抽象的打包脚本或过程。

将任务添加到管道时,它还可能会向管道添加一组 需求 。 要求定义必须在 代理 上安装的必备组件才能运行任务。 运行生成或部署时,将选择满足这些需求的代理。

运行 作业时,所有任务都按顺序运行,一个接一个。 若要在多个代理上并行运行同一组任务,或者在不使用代理的情况下运行某些任务,请参阅 作业

默认情况下,所有任务都在同一上下文中运行,无论是在 主机上 还是在 作业容器中。 可以选择使用 步骤目标 来控制单个任务的上下文。

详细了解如何使用 内置任务指定任务的属性。

运行 作业时,所有任务都按顺序运行,一个接一个地在代理上运行。 若要在多个代理上并行运行同一组任务,或者在不使用代理的情况下运行某些任务,请参阅 作业

自定义任务

我们提供一些 内置任务 来启用基本的生成和部署方案。 我们还提供了 创建自己的自定义任务的指南。

此外,Visual Studio市场提供了许多扩展;每个扩展在安装到订阅或集合时,都会使用一个或多个任务扩展任务目录。 此外,可以编写自己的自定义扩展,将任务添加到Azure Pipelines或 TFS。

在 YAML 管道中,按名称引用任务。 如果名称同时与内置任务和自定义任务匹配,则即用任务优先。 可以使用自定义任务的任务 GUID 或完全限定的名称来避免此风险:

steps:
- task: myPublisherId.myExtensionId.myContributionId.myTaskName@1 #format example
- task: qetza.replacetokens.replacetokens-task.replacetokens@3 #working example

若要查找 myPublisherId 并选择 myExtensionId获取 ”市场中的任务。 URL 字符串中的 itemName 值和 myPublisherIdmyExtensionId。 还可以通过在编辑任务时将任务添加到 发布管道 并选择 “查看 YAML ”来查找完全限定的名称。

任务版本

任务已进行版本控制,必须指定管道中使用的任务的主版本。 这有助于防止发布新版本的任务时出现问题。 任务通常向后兼容,但在某些情况下,在自动更新任务时可能会遇到不可预知的错误。

(发布新的次要版本(例如 1.2 到 1.3) )时,生成或发布将自动使用新版本。 但是,如果 (发布新的主版本(例如 2.0) ),则生成或发布将继续使用指定的主版本,直到编辑管道并手动更改为新的主版本。 生成或发布日志将包含一个警报,指出有新的主版本可用。

可以通过在签名 (示例后 @ 指定任务的完整版本号来设置使用哪个次要版本: GoTool@0.3.1) 。 只能使用 组织存在的任务版本。

在 YAML 中,使用任务名称指定主版本 @ 。 例如,若要固定到任务的版本 2 PublishTestResults

steps:
- task: PublishTestResults@2

TFS 中不提供 YAML 管道。

任务控件选项

每个任务都提供一些 控制选项

控件选项作为节上的 task 键提供。

- task: string  # reference to a task and version, e.g. "VSBuild@1"
  condition: expression     # see below
  continueOnError: boolean  # 'true' if future steps should run even if this step fails; defaults to 'false'
  enabled: boolean          # whether or not to run this step; defaults to 'true'
  timeoutInMinutes: number  # how long to wait before timing out the task

控件选项作为节上的 task 键提供。

- task: string  # reference to a task and version, e.g. "VSBuild@1"
  condition: expression     # see below
  continueOnError: boolean  # 'true' if future steps should run even if this step fails; defaults to 'false'
  enabled: boolean          # whether or not to run this step; defaults to 'true'
  timeoutInMinutes: number  # how long to wait before timing out the task
  target: string            # 'host' or the name of a container resource to target

控件选项作为节上的 task 键提供。

- task: string  # reference to a task and version, e.g. "VSBuild@1"
  condition: expression     # see below
  continueOnError: boolean  # 'true' if future steps should run even if this step fails; defaults to 'false'
  enabled: boolean          # whether or not to run this step; defaults to 'true'
  retryCountOnTaskFailure: number # Max number of retries; default is zero
  timeoutInMinutes: number  # how long to wait before timing out the task
  target: string            # 'host' or the name of a container resource to target

注意

给定的任务或作业不能单方面决定作业/阶段是否继续。 它可以执行的操作是提供 成功失败的状态,下游任务/作业都有一个条件计算,允许他们决定是否运行。 如果处于成功状态,则有效运行的默认条件。

继续错误 会以微妙的方式更改这一点。 它有效地“欺骗”所有下游步骤/作业,将任何结果视为“成功”,以便做出该决定。 或者说另一种方式,它说“当你决定包含结构的条件时,不要考虑此任务的失败”。

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

在此 YAML 中, PublishTestResults@2 即使上一步由于 成功OrFailed () 条件而失败,也会运行。

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

条件

  • 仅当具有相同代理池的所有以前的依赖项都成功时。 如果你有不同的代理池,这些阶段或作业将同时运行。 如果 YAML 中没有条件集,则这是默认值。

  • 即使以前的依赖项失败,除非运行已取消。 在此 succeededOrFailed() 条件的 YAML 中使用。

  • 即使以前的依赖项失败,即使运行已取消。 在此 always() 条件的 YAML 中使用。

  • 仅当以前的依赖项失败时。 在此 failed() 条件的 YAML 中使用。

步骤目标

任务在执行上下文中运行,该上下文是代理主机或容器。 单个步骤可以通过指定 a target. 可用选项是面向代理主机以及管道中定义的任何容器的单词 host 。 例如:

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

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

在这里,在 SampleTask 主机上运行并在 AnotherTask 容器中运行。

如果任务失败,重试次数

用于 retryCountOnTaskFailure 指定任务失败时的重试次数。 默认值为零。

- task: <name of task>
   retryCountOnTaskFailure: <max number of retries>
   ...

注意

  • 需要代理版本 2.194.0 或更高版本。 不支持无代理任务
  • 将立即重试失败的任务。
  • 没有关于任务的幂等性的假设。 例如,如果任务 (有副作用,如果它) 部分创建了外部资源,则它可能会在第二次运行时失败。
  • 没有有关任务可用的重试计数的信息。
  • 将警告添加到任务日志中,指示在重试之前失败。
  • 重试任务的所有尝试都显示在 UI 中,作为同一任务节点的一部分。

TFS 中不提供 YAML 管道。

环境变量

Azure DevOps Server 2019 及更高版本支持 YAML 管道。

每个任务都有一个 env 属性,该属性是表示映射到任务进程的环境变量的字符串对的列表。

task: AzureCLI@2
displayName: Azure CLI
inputs: # Specific to each task
env:
  ENV_VARIABLE_NAME: value
  ENV_VARIABLE_NAME2: value
  ...

以下示例运行 script 步骤,该步骤是 命令行任务的快捷方式,后跟等效的任务语法。 此示例向环境变量分配一个值AZURE_DEVOPS_EXT_PAT,该变量用于使用 Azure DevOps CLI 进行身份验证。

# Using the script shortcut syntax
- script: az pipelines variable-group list --output table
  env:
    AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
  displayName: 'List variable groups using the script step'

# Using the task syntax
- task: CmdLine@2
  inputs:
    script: az pipelines variable-group list --output table
  env:
    AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
  displayName: 'List variable groups using the command line task'

生成工具安装程序 (Azure Pipelines)

工具安装程序使生成管道能够安装和控制依赖项。 具体而言,您可以:

  • (实时安装工具或运行时,即使在 Microsoft 托管的代理 上) 恰时进行 CI 生成。

  • 针对多个版本的依赖项(例如Node.js)验证应用或库。

例如,可以设置生成管道来运行和验证应用的多个版本的Node.js。

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

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

pool:
  vmImage: 'Ubuntu 16.04'

steps:
# Node install
- task: NodeTool@0
  displayName: Node install
  inputs:
    versionSpec: '6.x' # The version we're installing
# Write the installed version to the command line
- script: which node

创建新的生成管道 并运行它。 观察生成是如何运行的。 Node.js工具安装程序下载Node.js版本(如果尚未在代理上)。 命令行脚本记录磁盘上Node.js版本的位置。

TFS 中不提供 YAML 管道。

工具安装程序任务

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

禁用内置任务和市场任务

在组织设置页上,可以禁用市场任务、现装任务或两者。 禁用市场任务有助于提高管道 的安全性 。 如果同时禁用内置任务和市场任务,则只能使用 tfx 安装的任务。

帮助和支持