我正在开发一个 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)"
更新(答案):我为此提出了一个 MS 支持案例并得到了解决方案。正确的语法是
condition: contains(dependencies.build.outputs['build_job.build_job.getCommitMessage.commitMessage'], 'import/')
关于这个奇怪问题的几点:
- 使用阶段变量的语法对于在条件中使用它和使用它作为另一个变量传入是不同的。
- 同样,如果源阶段是作业,则语法是不同的,而如果源阶段是部署作业,则语法是不同的。
- 最重要的是,我在 MS 文档的任何地方都找不到正确的语法。
- 例如,我找不到任何诊断问题的方法:在构建日志中查看阶段输出 json 真的很有帮助。
- 最后,我相信 Azure DevOps 团队真的把这个功能搞砸了。作业/部署作业、条件和变量分配的语法应该是一致的。在这种状态下真的很痛苦。