据我所知,这对于 YAML 来说是不可能的,因为没有简单的方法可以在 YAML 中获取可用的标签。你可以尝试的是output variable
jobs:
- job: Foo
steps:
- script: |
echo "This is job Foo."
echo "##vso[task.setvariable variable=doThing;isOutput=true]Yes" #The variable doThing is set to true
name: DetermineResult
- job: Bar
dependsOn: Foo
condition: eq(dependencies.Foo.outputs['DetermineResult.doThing'], 'Yes') #map doThing and check if true
steps:
- script: echo "Job Foo ran and doThing is true."
您也可以尝试使用 workaraund,在这种情况下:
- 在 powershell 脚本中使用 REST API 获取标签
PUT https://dev.azure.com/{organization}/{project}/_apis/build/builds/{buildId}/tags/{tag}?api-version=5.1
- 然后使用日志命令将您的标签分配给输出变量
- 最后在条件中使用输出变量
编辑
因此,目前看来这是不可能的,但应该很快就可以使用。请检查这个GitHub 问题。
现在可以在基于 YAML 的管道中跨阶段使用输出变量。这有助于您将有用的信息从一个阶段传递到下一个阶段,例如通过/不通过决策或生成输出的 ID。前一阶段的结果(状态)及其作业也是可用的。
输出变量仍然由作业内部的步骤产生。不是指dependencies.jobName.outputs['stepName.variableName']
,而是指阶段
stageDependencies.stageName.jobName.outputs['stepName.variableName']
。注意:默认情况下,管道中的每个阶段都依赖于 YAML 文件中它之前的阶段。因此,每个阶段都可以使用前一阶段的输出变量。您可以更改依赖关系图,这也将更改可用的输出变量。例如,如果阶段 3 需要阶段 1 的变量,则需要声明对阶段 1 的显式依赖。
我现在试了一下:
stages:
- stage: A
jobs:
- job: JA
steps:
- script: |
echo "This is job Foo."
echo "##vso[task.setvariable variable=doThing;isOutput=true]Yes" #The variable doThing is set to true
name: DetermineResult
# stage B runs if A fails
- stage: B
condition: eq(stageDependencies.A.JA.outputs['DetermineResult.doThing'], 'Yes') #map doThing and check if true
jobs:
- job: JB
steps:
- bash: echo "Hello world stage B first job"
但我收到了这个错误:
加载 YAML 构建管道时出错。无法识别的值:“stageDependencies”。位于表达式中的第 4 位:eq(stageDependencies.A.JA.outputs['DetermineResult.doThing'], 'Yes')。如需更多帮助,请参阅https://go.microsoft.com/fwlink/?linkid=842996
但是,此功能很快就会出现!