6

我正在 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应该在JobAifparameters.doJobA为 true 之后运行,或者如果parameters.doJobA为 false 则立即运行。如果不满足条件,只需添加dependsOn条件就会JobB跳过JobA这是有道理的,但我希望它无论如何都运行。

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

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

4

3 回答 3

10

来自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
于 2020-09-21T13:11:26.353 回答
2

这是我想出的代码示例(您可以查看示例)。作业 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

希望有帮助。

韦斯

于 2020-05-29T21:51:30.900 回答
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只有当参数为真时,我才插入一个从属子句。否则不存在。为了确保JobB仅在JobA成功时运行,我还必须添加一个条件,但前提是依赖于存在。

结果是如果doJobA为 false 则作业立即运行,因为生成的 yaml 将不包含任何dependsOncondition条目,但在另一种情况下,它将取决于JobA.

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

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

于 2020-05-28T06:45:47.447 回答