我正在处理一个Azure DevOps多阶段YAML管道。我在第一阶段设置了一个变量,然后在下一个阶段中,我有一个基于该变量的条件。我还在下一个阶段中检索变量值。显然,在条件和阶段级别上访问阶间变量的语法存在细微差别。我无法弄清楚我需要在条件中使用的语法。我已经尝试了所有可能的变化,但似乎都不起作用。在下面的示例中,我期望lint阶段运行,但它被跳过了。这里的条件应该是确切的语法是什么?
关于这个奇怪的问题,有几点需要注意:
stages:
- stage: build
displayName: build
pool:
name: Azure Pipelines
vmImage: ubuntu-latest
dependsOn: []
jobs:
- deployment: build_job
environment:
name: "test"
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
displayName: "get commitMessage variable"
name: getCommitMessage
inputs:
targetType: inline
pwsh: true
script: |
$commitMessage = "abcd_import/"
echo "setting commitMessage: $commitMessage"
echo "##vso[task.setvariable variable=commitMessage;isOutput=true]$commitMessage"
- stage: lint
displayName: lint
dependsOn:
- 'build'
condition: contains(stageDependencies.build.build_job.outputs['build_job.getCommitMessage.commitMessage'], 'import/')
pool:
name: Azure Pipelines
vmImage: ubuntu-latest
variables:
- name: BUILD_STAGE_GET_COMMIT_MESSAGE
value: $[stageDependencies.build.build_job.outputs['build_job.getCommitMessage.commitMessage']]
jobs:
- deployment: validate
environment:
name: "test"
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
displayName: "commitMessage is empty"
name: fail
inputs:
targetType: inline
pwsh: true
script: "echo $(BUILD_STAGE_GET_COMMIT_MESSAGE)"
更新(答案):我在此事上提出了一个微软支持案例,并得到了解决方案。正确的语法是
condition: contains(dependencies.build.outputs['build_job.build_job.getCommitMessage.commitMessage'], 'import/')
关于这个奇怪的问题,有几点需要注意:
- 使用阶段变量的语法在使用它作为条件和将其传递为另一个变量时是不同的。
- 如果源阶段是作业,则语法与源阶段是部署作业时不同。
- 最重要的是,我无法在 MS 文档中找到正确的语法。
- 我找不到任何方法来诊断问题,例如:在构建日志中查看阶段输出 JSON 将非常有帮助。
- 最后,我认为 Azure DevOps 团队真的搞砸了这个功能。语法应该在作业/部署作业、条件和变量分配之间保持一致。在当前状态下真的很痛苦。