Access variable between pipeline jobs

92 views Asked by At

I have a yaml which calls a template to perform a few tasks one of which is to deploy azure infrastructure and another is to run a powershell script to parse output variables.

How do I access these variables in a different job within the yaml?

jobs:
  - deployment: Dep1
    displayName: MyDep1
    pool:
      name:
    variables:
      //some variables
    strategy:
      runOnce:
        deploy:
          steps:
          - download: current
            artifact: drop
          - task: //ignore
           
          - template: mytemplatelocation
            parameters:
              //all template parameters that also runs powershell script to parse output variables

          - task: Powershell@2
            inputs:
              targetType: 'inline'
              script: 'Write-Host "$(myVariable)'

Powershell task is able to print the variable value

But I have another job in this pipeline as below:

- deployment: Dep2
    displayName: MyDep2
    dependsOn: [Dep1]
    pool:
      name: 
    variables: 
      actualVarToUse: $[ dependencies.Dep1.outputs['myVariable'] ]
      actualVarToUseDup: $[dependencies.Dep1.outputs['TaskNameFromTemplate.myVariable']]    
    strategy:
     runOnce:
       deploy:
        steps:
        - download: current
          artifact: check
        - script: echo $(actualVarToUse) //does not work
        - task: Powershell@2
          inputs:
            targetType: 'inline'
            script: 'Write-Host "$(actualVarToUse)"' //does not work
        - task: Powershell@2
          inputs:
            targetType: 'inline'
            script: 'Write-Host "$(actualVarToUseDup)"' //does not work
        - task: Powershell@2
          inputs:
            targetType: 'inline'
            script: 'Write-Host $[dependencies.Dep1.outputs[myVariable]]' //does not work

Please suggest?

Edit 1:

Template yml

parameters:
  - name: outputVariableName
    displayName: ''
    type: string
    default: 'outputvar'
  
steps:
- checkout: git://Scripts
  path: 'Scripts'
- task: AzureResourceManagerTemplateDeployment@3
  displayName: 'Deploy Azure Infra'
  inputs:
    azureResourceManagerConnection: 
    subscriptionId: 
    resourceGroupName: 
    location: 
    csmFile: 
    csmParametersFile: 
    deploymentMode: 
    deploymentOutputs: ${{ parameters.outputVariableName}}

- task: PowerShell@2
  name: 'Create_${{ parameters.outputVariableName}}'
  displayName: ''  
  inputs:
    targetType: 
    filePath: 
    arguments: 

Script which is called above


param(    
    [Parameter(Mandatory=$true, Position=0)][string]$ARMOutput
)

Add-Type -AssemblyName System.Web.Extensions
$JS = New-Object System.Web.Script.Serialization.JavaScriptSerializer

$data = $JS.DeserializeObject($ARMOutput)

$data.GetEnumerator() | foreach {
    Write-Host "##vso[task.setvariable variable=myvar-$($_.key);]$($_.value.value)"   
    Write-Host "##vso[task.setvariable variable=myvar-$($_.key);isOutput=true;]$($_.value.value)"   
    Write-Host "Added variable: myvar-$($_.key)"
}

The above script creates multiple properties assume myvar-varone, myvar-vartwo

- task: Powershell@2
            inputs:
              targetType: 'inline'
              script: 'Write-Host "$(myvar-varone) $(myvar-vartwo)"'

The above successfully prints the values now can you please tell me how do I get these in another job?

1

There are 1 answers

10
wade zhou - MSFT On BEST ANSWER

As you would like to access variable across jobs, please fix as below:

  1. Make sure to use isoutput=true when you set the variable under steps. In my sample, i set variable in template. enter image description here
parameters:
- name: 'var'  # defaults for any parameters that aren't specified
  type: string

steps:
- pwsh: Write-Host "##vso[task.setvariable variable=myVariable;isoutput=true]${{ parameters.var }}"
  name: setvarStep

PS: if you don't set variable in template, in Dep1 job, you need to set variable with isoutput=true so the variable can be used in next job.

  1. In the main yaml, to invoke the variable in same job, you need to add stepname before variable, like $(setvarStep.myVariable).

  2. In the Next Dep2 job, be sure to prefix the job name to the output variables of a deployment job. In this case, the job name is Dep1.

The Main Yaml:

pool:
  vmImage: ubuntu-latest

jobs:
  - deployment: Dep1
    displayName: MyDep1
    variables:
      - name: var1
        value: var1value
    environment: Dep1
    strategy:
      runOnce:
        deploy:
          steps:
          - template: template/azure-devops-template1.yml
            parameters:
              var: "testvar value"
          
          - task: PowerShell@2
            inputs:
              targetType: 'inline'
              script: 'Write-Host $(setvarStep.myVariable)'


  - deployment: Dep2
    displayName: MyDep2
    dependsOn: [Dep1]
    environment: Dep2
    variables: 
      VartoUse: $[ dependencies.Dep1.outputs['Dep1.setvarStep.myVariable'] ]
    strategy:
      runOnce:
        deploy:
          steps:
          - task: Powershell@2
            inputs:
              targetType: 'inline'
              script: 'Write-Host "$(VartoUse)"' 

Check value in pipeline: enter image description here

More details you can refer to the official doc below:

enter image description here