Azure Devops YAML 管道中的条件依赖作业

Conditional dependent job in Azure Devops YAML pipelines

我正在 yaml 中构建一个复杂的管道,我正在尝试在两个作业之间创建依赖关系,以便后一个作业 运行 在前一个作业之后,但前提是前一个作业设置为 运行 基于一个参数。我似乎无法理解这是否可行。

我有一个这样定义的管道:

parameters:
- name: doJobA
  type: boolean

stages:
  jobs:
  - job: JobA
    condition: eq('${{ parameters.doJobA }}', true)
    # ... details removed for brevity

  - job: JobB
    dependsOn: JobA
    # ... details removed for brevity
如果 parameters.doJobA 为真,

JobB 应该在 JobA 之后 运行,如果 parameters.doJobA 为假,则立即。如果不满足 JobA 条件,只需添加 dependsOn 条件即可跳过 JobB,这是有道理的,但无论如何我都希望它成为 运行。

是否可以用这种方式定义条件dependsOn

编辑:我 运行 遇到了另一个问题,导致下面的解决方案无法使用。我需要条件取决于早期 运行ning PowerShell 脚本设置的变量,而不是基于参数。

我找到了一个稍微不雅致的解决方案。通过将表达式与布尔参数结合起来,我可以做我需要的,但这有点棘手:

parameters:
- name: doJobA
  type: boolean

stages:
  jobs:
  - job: JobA
    condition: eq('${{ parameters.doJobA }}', true)
    # ... details removed for brevity

  - job: JobB
    ${{ if eq(parameters.doJobA, true) }}:
      dependsOn: JobA
      condition: succeeded()
    # ... details removed for brevity

这里我只在参数doJobA为真时才插入一个从属子句。否则它不存在。为了确保 JobB 仅在 JobA 成功时运行,我还必须添加一个条件,但前提是 dependsOn 存在。

结果是,如果 doJobA 为假,作业会立即运行,因为生成的 yaml 将不包含任何 dependsOncondition 条目,但在其他情况下,它将取决于关于成功执行 JobA.

我仍然希望有更好的方法来实现这一点,因为这看起来有点复杂 (imo)。

编辑:此解决方案仅适用于静态属性,不适用于动态变量。

这是我想出的代码示例(你可以看到example)。作业 2 总是 运行,如果作业 1 运行s.

,作业 1 在作业 1 之后 运行

更新 YAML

- job: One
  condition: eq('${{ parameters.DoJobOne }}', true)
  pool:
    vmImage: 'windows-2019'
  steps:
  - powershell: |
      throw "simulate Job One failing"
      echo "##vso[task.setvariable variable=JobOneRan;isOutput=true]true"
    name: setvarStep
  - script: |
      echo $(setvarStep.JobOneRan)          
    name: echovariable


- job: Two
  condition: and(always(), eq('${{ parameters.DoJobOne }}', eq(dependencies.One.outputs['setvarStep.JobOneRan'], true)))
  dependsOn: One
  pool:
    vmImage: 'windows-2019'
  variables:
    myVariableFromJobOne: $[ dependencies.One.outputs['setvarStep.JobOneRan'] ]
  steps:
  - script: echo $(myVariableFromJobOne)
    name: echovariable

希望对您有所帮助。

韦斯

来自 https://elanderson.net/2020/05/azure-devops-pipelines-depends-on-with-conditionals-in-yaml/

的更简单的解决方案
parameters:
- name: doJobA
  type: boolean

stages:
  jobs:
  - job: JobA
    condition: eq('${{ parameters.doJobA }}', true)
    # ... details removed for brevity

  - job: JobB
    dependsOn: JobA
    condition: in(dependencies.JobA.result, 'Succeeded', 'Skipped')
    # ... details removed for brevity