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

会有一股神秘感。 提交于 2020-05-14 14:37:06

问题


I'm using an Azure DevOps pipeline to deploy my code and now I'm in need of passing a variable value from a deployment job to a subsequent job that depends on it. I've read up on this example but it does not seem to work at all.

What I'm trying to do is run an Azure ARM Deployment that provisions a Key Vault. The name of the key vault is outputted from the ARM deployment job and I'm then trying to pass that name to another job which needs to add specific secrets. Access control is taken care of, but I still need to pass the name.

I've boiled the problem down to the basics of passing a variable from a deployment to a job. Here is my complete test pipeline (almost entirely copied from 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

Once I run this the echoed value is blank in job B, but defined in deployment A. Why is this? And is there a way to dum everything in dependencies.A.outputs so that I can see what I have to work with?

How can I pass a variable from a runOnce deployment job to a regular job?


回答1:


I've solved it. The problem is that the documentation here specifies this schema for fetching the variable for a runOnce deployment:

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

This is in fact WRONG. The <lifecycle-hookname> parameter should be replaced with the name of the deployment like this:

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

The example from this documentation (scroll down a bit) is correct.

A full example pipeline that I've tested and works:

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


来源:https://stackoverflow.com/questions/61476512/azure-devops-pipeline-define-variable-in-deployment-and-reuse-in-subsequent-job

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!