Azure Devops YAML 管道中的条件依赖作业
Conditional dependent job in Azure Devops YAML pipelines
我正在 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
如果 parameters.doJobA
为真,JobB
应该在 JobA
之后 运行,如果 parameters.doJobA
为假,则立即。如果不满足 JobA
条件,只需添加 dependsOn
条件即可跳过 JobB
,这是有道理的,但无论如何我都希望它成为 运行。
是否可以用这种方式定义条件dependsOn
?
编辑:我 运行 遇到了另一个问题,导致下面的解决方案无法使用。我需要条件取决于早期 运行ning 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
为真时才插入一个从属子句。否则它不存在。为了确保 JobB
仅在 JobA
成功时运行,我还必须添加一个条件,但前提是 dependsOn 存在。
结果是,如果 doJobA
为假,作业会立即运行,因为生成的 yaml 将不包含任何 dependsOn
或 condition
条目,但在其他情况下,它将取决于关于成功执行 JobA
.
我仍然希望有更好的方法来实现这一点,因为这看起来有点复杂 (imo)。
编辑:此解决方案仅适用于静态属性,不适用于动态变量。
这是我想出的代码示例(你可以看到example)。作业 2 总是 运行,如果作业 1 运行s.
,作业 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
希望对您有所帮助。
韦斯
来自 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
我正在 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
如果 parameters.doJobA
为真,JobB
应该在 JobA
之后 运行,如果 parameters.doJobA
为假,则立即。如果不满足 JobA
条件,只需添加 dependsOn
条件即可跳过 JobB
,这是有道理的,但无论如何我都希望它成为 运行。
是否可以用这种方式定义条件dependsOn
?
编辑:我 运行 遇到了另一个问题,导致下面的解决方案无法使用。我需要条件取决于早期 运行ning 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
为真时才插入一个从属子句。否则它不存在。为了确保 JobB
仅在 JobA
成功时运行,我还必须添加一个条件,但前提是 dependsOn 存在。
结果是,如果 doJobA
为假,作业会立即运行,因为生成的 yaml 将不包含任何 dependsOn
或 condition
条目,但在其他情况下,它将取决于关于成功执行 JobA
.
我仍然希望有更好的方法来实现这一点,因为这看起来有点复杂 (imo)。
编辑:此解决方案仅适用于静态属性,不适用于动态变量。
这是我想出的代码示例(你可以看到example)。作业 2 总是 运行,如果作业 1 运行s.
,作业 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
希望对您有所帮助。
韦斯
来自 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