依赖工作从上一阶段获得价值

时间:2019-08-22 21:55:05

标签: azure-pipelines

我有一个运行两个阶段的管道。各个阶段基本上是相同的,只是一个阶段相互依赖。他们都引用了包含两个作业的模板,一个作业取决于另一个。第一个作业创建一个输出变量,第二个作业使用它。

问题是有两个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

1 个答案:

答案 0 :(得分:1)

  

我在这里做错了吗?还是这是一个错误?

否,您没有做错任何事情,请参考此问题单,该问题单最近在我们的开发者社区上进行了报告:  Setting output variable when multiple stages share a job results in unexpected sharing。当多阶段共享相同的作业(模板)时,该值会令人困惑。

这是产品组已将其确定为由我们方面引起的问题。我们已经完成调查,固定脚本正在等待发布。

但是,为了不影响正常构建,有一种解决方法,我们可以避免使用此问题变量表达式。

只需重建工件名称即可使用另一种方法:

  - download: current
    artifact: preDeploy-${{ parameters.environment }}

enter image description here

由于从parameters.environment获取值是正确的,因此我们可以在 Download 任务中使用这些脚本构造工件名称。

在我们的后端,固定代码已提交,PR已完成。只是耐心等待,我们将在最近部署这些固定的。您还可以跟踪开发者社区中报告的ticket。部署后,我们的团队工程师将在第一时间通知它。