Azure devops Azure Devops YAML管道中的条件相关作业
我正在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
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