I am working on a azure devops multi stage yaml pipeline. I set a variable in the first stage and then for the next stage, I have a condition based on that variable. I am also retrieving the variable value in the next stage. Apparently there is slight difference between the syntax for accessing inter-stage variables in the condition and at the stage level. I am not able to figure out the syntax I need to use in the condition. I have tried all possible variations but none seems to be working. In the example below, I am expecting the lint stage to run however it gets skipped. What should be exact syntax for the condition here?
stages:
- stage: build
displayName: build
pool:
name: Azure Pipelines
vmImage: ubuntu-latest
dependsOn: []
jobs:
- deployment: build_job
environment:
name: "test"
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
displayName: "get commitMessage variable"
name: getCommitMessage
inputs:
targetType: inline
pwsh: true
script: |
$commitMessage = "abcd_import/"
echo "setting commitMessage: $commitMessage"
echo "##vso[task.setvariable variable=commitMessage;isOutput=true]$commitMessage"
- stage: lint
displayName: lint
dependsOn:
- 'build'
condition: contains(stageDependencies.build.build_job.outputs['build_job.getCommitMessage.commitMessage'], 'import/')
pool:
name: Azure Pipelines
vmImage: ubuntu-latest
variables:
- name: BUILD_STAGE_GET_COMMIT_MESSAGE
value: $[stageDependencies.build.build_job.outputs['build_job.getCommitMessage.commitMessage']]
jobs:
- deployment: validate
environment:
name: "test"
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
displayName: "commitMessage is empty"
name: fail
inputs:
targetType: inline
pwsh: true
script: "echo $(BUILD_STAGE_GET_COMMIT_MESSAGE)"
Update(Answer): I raised a MS support case on this one and got a resolution. The right syntax is
condition: contains(dependencies.build.outputs['build_job.build_job.getCommitMessage.commitMessage'], 'import/')
A few points on this weird issue:
- The syntax for using a stage variable is different for using it in a condition and using it to pass in as another variable.
- Yet again, the syntax is different if the source stage is a job v/s if the source stage is a deployment job.
- Most importantly, I couldn't find the correct syntax anywhere in the MS documentation.
- I couldn't find any way to diagnose the issue for example: it would be really helpful to see the stage output json in the build logs.
- Finally, I believe Azure DevOps team has really messed this feature up. The syntax should be consistent across the jobs/deployment jobs, conditions and variables assignments. It's really a pain in this current state.