Azure devops Azure Devops YAML管道中的条件相关作业

Azure devops Azure Devops YAML管道中的条件相关作业,azure-devops,azure-pipelines,azure-pipelines-yaml,Azure Devops,Azure Pipelines,Azure Pipelines Yaml,我正在yaml中构建一个复杂的管道,并试图在两个作业之间创建一个依赖关系,以便后一个作业在前一个作业之后运行,但前提是前一个作业设置为基于参数运行。我似乎不知道这是否可行 我有一个定义如下的管道: parameters: - name: doJobA type: boolean stages: jobs: - job: JobA condition: eq('${{ parameters.doJobA }}', true) # ... details removed

我正在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
如果
parameters.doJobA
为true,则应在
JobA
之后运行,如果
parameters.doJobA
为false,则应立即运行。如果不满足
JobA
条件,简单地添加
dependsOn
条件会导致跳过
JobB
,这是有意义的,但我希望它无论如何都能运行

是否可以用这种方式定义一个有条件的
dependsOn


编辑:我遇到了另一个问题,使得下面的解决方案无法使用。我需要条件依赖于早期运行的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
为true时插入一个dependent子句。否则它就不存在了。为了确保
JobB
仅在
JobA
成功时运行,我还必须添加一个条件,但前提是dependsOn存在

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

我仍然希望有一个更好的方法来实现这一点,虽然这似乎有点复杂(国际海事组织)


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

这是我提供的代码示例(您可以看到)。作业2始终运行,如果作业1运行,则在作业1之后运行

更新的YAML 希望有帮助

Wes


我不认为这解决了让作业2仅基于作业1运行的条件运行的原始问题。即使作业1失败,它也不会始终运行作业2吗?是的,如果作业1失败,作业2将运行。我对该要求的理解是:“如果parameters.doJobA为true,则JobB应在JobA之后运行,如果parameters.doJobA为false,则应立即运行。”感谢Wes的更新。虽然答案要求每个作业通过脚本设置一个变量,但我认为它相当优雅。在查找此问题时,我看到现在有一个更简单的解决方案:感谢在此处共享您的解决方案,请接受您的解决方案作为答案?因此,它将有助于其他成员谁得到同样的问题,找到解决办法容易。祝你有一个愉快的一天:)不幸的是,正如我在对最初问题的编辑中所写,这并不能解决我的问题。此解决方案仅适用于静态属性,而不动态设置变量,我需要这些变量才能使模板正常工作。如果你有任何建议,我将不胜感激!这种方法对我来说很成功,我做的唯一更改是定义doJobA为false时的表达式
- 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
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