Azure DevOps Pipeline 在部署中定义变量并在后续作业中重用

Azure DevOps Pipeline define variable in deployment and reuse in subsequent job

我正在使用 Azure DevOps 管道部署我的代码,现在我需要将变量值从部署作业传递到依赖它的后续作业。我已经阅读了 this example 但它似乎根本不起作用。

我想要做的是 运行 一个 Azure ARM 部署,它提供了一个 Key Vault。 Key Vault 的名称是从 ARM 部署作业输出的,然后我试图将该名称传递给另一个需要添加特定机密的作业。访问控制已经处理好了,但我仍然需要传递名称。

我已将问题归结为将变量从 deployment 传递到 job 的基础知识。这是我完整的测试管道(几乎完全从 here 复制):

trigger: none

stages:
  - stage: X
    jobs:
      - deployment: A
        pool:
          vmImage: "ubuntu-16.04"
        environment: test
        strategy:
          runOnce:
            deploy:
              steps:
                - script: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the deployment variable value"
                  name: setvarStep
                - script: echo $(setvarStep.myOutputVar)
                  name: echovar

      - job: B
        dependsOn: A
        pool:
          vmImage: "ubuntu-16.04"
        variables:
          myVarFromDeploymentJob: $[ dependencies.A.outputs['deploy.setvarStep.myOutputVar'] ]
        steps:
          - script: "echo $(myVarFromDeploymentJob)"
            name: echovar

一旦我 运行 这个回显值在作业 B 中为空,但在部署 A 中定义。为什么是这样?有没有办法把 dependencies.A.outputs 中的所有东西都弄脏,这样我就可以看到我必须使用的东西?

如何将变量从 runOnce 部署作业传递到常规作业?

我已经解决了。问题是文档 here 指定此架构用于获取 runOnce 部署的变量:

$[dependencies.<job-name>.outputs['<lifecycle-hookname>.<step-name>.<variable-name>']]

这实际上是错误的<lifecycle-hookname> 参数应替换为部署名称,如下所示:

$[dependencies.<job-name>.outputs['<job-name>.<step-name>.<variable-name>']]

this documentation 中的示例(向下滚动一点)是正确的。

我测试过并有效的完整示例管道:

trigger: none

stages:
- stage: X
  jobs:
  - deployment: A # This name is important
    pool:
      vmImage: 'ubuntu-16.04'
    environment: staging
    strategy:
      runOnce:
        deploy:
          steps:
          - script: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the deployment variable value"
            name: setvarStep # This name is also important
          - script: echo $(setvarStep.myOutputVar)
            name: echovar

  - job: B
    dependsOn: A
    pool:
      vmImage: 'ubuntu-16.04'
    variables:
      myVarFromDeploymentJob: $[ dependencies.A.outputs['A.setvarStep.myOutputVar'] ]
    steps:
    - script: "echo $(myVarFromDeploymentJob)"
      name: echovar