我有一个运行两个阶段的管道。各个阶段基本上是相同的,只是一个阶段相互依赖。他们都引用了包含两个作业的模板,一个作业取决于另一个。第一个作业创建一个输出变量,第二个作业使用它。
问题是有两个JobA和两个JobB,而JobB似乎不知道哪个JobA是正确的。这是YAML:
# azure-pipelines.yaml
stages:
- stage: deployQA
jobs:
- template: stage-template.yaml
parameters:
environment: QA
- stage: deployStaging
dependsOn: deployQA
condition: succeeded()
jobs:
- template: stage-template.yaml
parameters:
environment: STAGING
# stage-template.yaml
parameters:
environment: ''
jobs:
- job: preDeploy
variables:
artifactName: preDeploy-${{ parameters.environment }}
environment: ${{ parameters.environment }}
steps:
- checkout: none
- publish: $(Pipeline.Workspace)
artifact: $(artifactName)
- pwsh: |
echo "##vso[task.setvariable variable=artifactName;isOutput=true]$($env:ARTIFACTNAME)"
name: outputVars
- job: deployment
dependsOn: preDeploy
variables:
artifactName: $[dependencies.preDeploy.outputs['outputVars.artifactName']]
steps:
- checkout: none
- download: current
artifact: $(artifactName)
问题出在该行第二个文件的底部:
artifactName: $[dependencies.preDeploy.outputs['outputVars.artifactName']]
运行QA阶段时,$[dependencies.preDeploy.outputs['outputVars.artifactName']]
解析为preDeploy-QA
,运行过渡阶段时,它也解析为preDeploy-QA
。查看日志,可以看到它们的解析不正确:
// 2_deployment.txt
Variables:
artifactName:
Parsing expression: <dependencies.preDeploy.outputs['outputVars.artifactName']>
Evaluating: dependencies['preDeploy']['outputs']['outputVars.artifactName']
Result: 'preDeploy-QA'
// 2_deployment (1).txt
Variables:
artifactName:
Parsing expression: <dependencies.preDeploy.outputs['outputVars.artifactName']>
Evaluating: dependencies['preDeploy']['outputs']['outputVars.artifactName']
Result: 'preDeploy-QA'
I am doing something wrong here? Or is this a bug?
You can see the YAML and logs [here][1].
[1]: https://dev.azure.com/lolinctest/PublicTest/_build/results?buildId=506&view=results
答案 0 :(得分:1)
我在这里做错了吗?还是这是一个错误?
否,您没有做错任何事情,请参考此问题单,该问题单最近在我们的开发者社区上进行了报告: Setting output variable when multiple stages share a job results in unexpected sharing。当多阶段共享相同的作业(模板)时,该值会令人困惑。
这是产品组已将其确定为由我们方面引起的问题。我们已经完成调查,固定脚本正在等待发布。
但是,为了不影响正常构建,有一种解决方法,我们可以避免使用此问题变量表达式。
只需重建工件名称即可使用另一种方法:
- download: current
artifact: preDeploy-${{ parameters.environment }}
由于从parameters.environment
获取值是正确的,因此我们可以在 Download 任务中使用这些脚本构造工件名称。
在我们的后端,固定代码已提交,PR已完成。只是耐心等待,我们将在最近部署这些固定的。您还可以跟踪开发者社区中报告的ticket。部署后,我们的团队工程师将在第一时间通知它。