添加阶段、依赖项、 & 条件

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

注意

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

阶段的概念因使用 YAML 管道还是经典发布管道而异。

可以将管道作业组织成阶段。 阶段是管道中的主要部门:“生成此应用”、“运行这些测试”和“部署到预生产”是阶段的良好示例。 它们是管道中的逻辑边界,可在其中暂停管道并执行各种检查。

即使未显式定义管道,每个管道至少有一个阶段。 还可以将阶段排列为依赖项图,以便一个阶段在另一个阶段之前运行。 阶段的作业限制为 256 个。

注意

Azure DevOps Server 2019.1 中添加了对阶段的支持。

此版本的 TFS 不支持 YAML。

指定阶段

注意

Azure DevOps Server 2019.1 中添加了对阶段的支持。

最简单的情况是,管道中不需要任何逻辑边界。 在这种情况下,无需显式使用 stage 关键字。 可以直接在 YAML 文件中指定作业。

# this has one implicit stage and one implicit job
pool:
  vmImage: 'ubuntu-latest'
steps:
- bash: echo "Hello world"
# this pipeline has one implicit stage
jobs:
- job: A
  steps:
  - bash: echo "A"

- job: B
  steps:
  - bash: echo "B"

如果将管道组织到多个阶段,请使用 stages 关键字。

stages:
- stage: A
  jobs:
  - job: A1
  - job: A2

- stage: B
  jobs:
  - job: B1
  - job: B2

如果选择在阶段级别指定某个 pool 作业,则在该阶段中定义的所有作业都将使用该池,除非在作业级别另有指定。

注意

在 Azure DevOps Server 2019 中,只能在作业级别指定池。

stages:
- stage: A
  pool: StageAPool
  jobs:
  - job: A1 # will run on "StageAPool" pool based on the pool defined on the stage
  - job: A2 # will run on "JobPool" pool
    pool: JobPool

指定阶段的完整语法为:

stages:
- stage: string  # name of the stage, A-Z, a-z, 0-9, and underscore
  displayName: string  # friendly name to display in the UI
  dependsOn: string | [ string ]
  condition: string
  pool: string | pool
  variables: { string: string } | [ variable | variableReference ] 
  jobs: [ job | templateReference]

此版本的 TFS 不支持 YAML 管道。

指定依赖项

注意

Azure DevOps Server 2019.1 中添加了对阶段的支持。

在管道中定义多个阶段时,默认情况下,它们按在 YAML 文件中定义它们的顺序按顺序运行。 例外情况是添加依赖项时。 通过依赖项,阶段按 dependsOn 要求顺序运行。

管道必须至少包含一个没有依赖项的阶段。

定义多个阶段及其依赖项的语法为:

stages:
- stage: string
  dependsOn: string
  condition: string

按顺序运行的示例阶段:

# if you do not use a dependsOn keyword, stages run in the order they are defined
stages:
- stage: QA
  jobs:
  - job:
    ...

- stage: Prod
  jobs:
  - job:
    ...

并行运行的示例阶段:

stages:
- stage: FunctionalTest
  jobs:
  - job:
    ...

- stage: AcceptanceTest
  dependsOn: []    # this removes the implicit dependency on previous stage and causes this to run in parallel
  jobs:
  - job:
    ...

扇出和扇入示例:

stages:
- stage: Test

- stage: DeployUS1
  dependsOn: Test    # this stage runs after Test

- stage: DeployUS2
  dependsOn: Test    # this stage runs in parallel with DeployUS1, after Test

- stage: DeployEurope
  dependsOn:         # this stage runs after DeployUS1 and DeployUS2
  - DeployUS1
  - DeployUS2

此版本的 TFS 不支持 YAML 管道。

条件

可以指定每个阶段运行的条件。 默认情况下,如果阶段不依赖于任何其他阶段,或者它依赖的所有阶段已完成并成功,则运行阶段。 可以强制某个阶段运行此行为,即使上一阶段失败,也可以通过指定自定义条件来自定义此行为。

如果为阶段自定义上述步骤的默认条件,请删除完成和成功的条件。 因此,如果使用自定义条件,通常用于 and(succeeded(),custom_condition) 检查上一阶段是否成功运行。 否则,无论上一阶段的结果如何,阶段都会运行。

注意

失败 (“JOBNAME/STAGENAME”) 和成功 (“JOBNAME/STAGENAME”) 的条件,如以下示例中所示,仅适用于 YAML 管道

注意

Azure DevOps Server 2019.1 中添加了对阶段的支持。

基于运行上一阶段的状态运行阶段的示例:

stages:
- stage: A

# stage B runs if A fails
- stage: B
  condition: failed()

# stage C runs if B succeeds
- stage: C
  dependsOn:
  - A
  - B
  condition: succeeded('B')

使用 自定义条件的示例:

stages:
- stage: A

- stage: B
  condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/main'))

此版本的 TFS 不支持 YAML 管道。

指定队列策略

YAML 管道不支持排队策略。 管道的每个运行都独立于其他运行且不知道其他运行。 换句话说,两个连续提交可能会触发两个管道,两个管道将执行相同的阶段序列,而无需等待彼此。 虽然我们努力将排队策略引入 YAML 管道,但我们建议使用 手动审批 ,以便手动排序和控制执行顺序(如果这一点很重要)。

此版本的 TFS 不支持 YAML 管道。

指定审批

可以使用审批检查手动控制阶段何时应运行。 这通常用于控制部署到生产环境的部署。 检查是 资源所有者 可用的机制,用于控制管道中的阶段是否可以使用资源。 作为资源的所有者(如环境),可以定义在使用该资源的阶段开始之前必须满足的检查。

目前,环境支持手动审批检查。 有关详细信息,请参阅 审批

此版本的 Azure DevOps Server 尚不支持 YAML 管道中的审批。

此版本的 TFS 不支持 YAML 管道。