我正在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脚本设置的变量,而不是基于参数。
答案 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将不包含任何dependsOn
或condition
条目,但在其他情况下,它将取决于成功执行JobA
。
我仍然希望有一种更好的方法来实现这一目标,尽管这似乎有点复杂(imo)。
编辑:此解决方案仅适用于静态属性,不适用于动态变量。
答案 2 :(得分:1)
这是我想出的代码示例(您可以看到example)。作业2始终运行,如果作业1运行,则在作业1之后运行。
- 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