【发布时间】:2022-09-23 19:17:33
【问题描述】:
我正在开发一个 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 团队真的把这个功能搞砸了。作业/部署作业、条件和变量分配的语法应该是一致的。目前的状态真的很痛苦。
标签: azure-devops azure-pipelines-yaml multistage-pipeline