In my last post I wrote about Azure Pipelines: Passing Variables Between Jobs, and in this let's see how we can pass variables between stages in Azure Pipelines.
Let's say we need to pass a variable from StageA to StageB.
trigger:
- main
pool:
vmImage: ubuntu-latest
stages:
- stage: StageA
displayName: Stage A
variables:
someVariable: ''
jobs:
- job: JobA
displayName: Job A
steps:
# Create output variable and set value
- script: |
echo "##vso[task.setvariable variable=stageAVariable;isOutput=true]someValue"
name: outputVariable
displayName: Output Variable
- stage: StageB
displayName: Stage B
variables:
# Map the output variable from Stage A into Stage B
stageBVariable: $[ stageDependencies.StageA.JobA.outputs['outputVariable.stageAVariable'] ]
jobs:
- job: JobB
displayName: Job B
steps:
# stageBVariable has the value set in JobA
- script: |
echo $(stageBVariable)
name: printUpdatedVariable
displayName: Print Updated Variable
Note how StageA.JobA.outputVariable is outputting the variable using isOutput=true. And then StageB is getting it mapped via stageDependencies.
When we have multiple stages in a pipeline, by default, they run sequentially in the order in which they are defined in the YAML file. So in the above use case where we have 2 stages, we don't explicitly need to use dependsOn.
Now let's add another Step: StageC.
trigger:
- main
pool:
vmImage: ubuntu-latest
stages:
- stage: StageA
displayName: Stage A
variables:
someVariable: ''
jobs:
- job: JobA
displayName: Job A
steps:
# Create output variable
- script: |
echo "##vso[task.setvariable variable=stageAVariable;isOutput=true]someValue"
name: outputVariable
displayName: Output Variable
- stage: StageB
displayName: Stage B
variables:
# Map the output variable from Stage A into Stage B
stageBVariable: $[ stageDependencies.StageA.JobA.outputs['outputVariable.stageAVariable'] ]
jobs:
- job: JobB
displayName: Job B
steps:
# stageBVariable has the value set in JobA
- script: |
echo $(stageBVariable)
name: printUpdatedVariable
displayName: Print Updated Variable
- stage: StageC
displayName: Stage C
# Need to explictely depend on Stage A
dependsOn:
- StageA
- StageB
variables:
# Map the output variable from Stage A into Stage C
stageCVariable: $[ stageDependencies.StageA.JobA.outputs['outputVariable.stageAVariable'] ]
jobs:
- job: JobC
displayName: Job C
steps:
# stageCVariable has the value set in JobA
- script: |
echo $(stageCVariable)
name: printUpdatedVariable
displayName: Print Updated Variable
Here especially for StageC, we need to explicitly depend on StageA. You might skip it thinking they run sequentially meaning StageA -> StageB -> StageC, so technically StageC is depending on StageA. But unfortunately depending just on the previous stage is not enough. You need to explicitly declare the dependency on the stage from which you are mapping the variable from.
Hope this helps.
Happy Coding.
No comments:
Post a Comment