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

时间:2020-05-28 06:21:15

标签: azure-devops azure-pipelines azure-pipelines-yaml

我正在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
如果JobB为true,则

JobA应该在parameters.doJobA之后运行,如果parameters.doJobA为false,则应该立即运行。如果不满足dependsOn条件,仅添加JobB条件将导致JobA被跳过,这是有道理的,但是我希望它可以运行。

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

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

3 个答案:

答案 0 :(得分:2)

来自https://elanderson.net/2020/05/azure-devops-pipelines-depends-on-with-conditionals-in-yaml/的简单解决方案 参数: -名称:doJobA 类型:布尔值

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

答案 1 :(得分:1)

我找到了一个不太优雅的解决方案。通过将表达式与布尔参数组合在一起,我可以执行所需的操作,但这有点棘手:

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为true时,才插入一个从属子句。否则不存在。为了确保JobB仅在JobA成功的情况下运行,我还必须添加一个条件,但前提是存在dependsOn。

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

我仍然希望有一种更好的方法来实现这一目标,尽管这似乎有点复杂(imo)。

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

答案 2 :(得分:1)

这是我想出的代码示例(您可以看到example)。作业2始终运行,如果作业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

希望有帮助。

Wes