Azure Pipeline Conditions

Typical task condition statements look like this PowerShell task:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
- task: PowerShell@2
displayName: Rename output spspkg files to add version information.
condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
...
- task: PowerShell@2 displayName: Rename output spspkg files to add version information. condition: eq(variables['Build.SourceBranch'], 'refs/heads/main') ...
- task: PowerShell@2
  displayName: Rename output spspkg files to add version information.
  condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
  ...

Below are example condition statements. Note that you cannot use macro variable format such as $(Build.SourceBranch). Case is ignored on the variable names.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
condition: eq(variables.CG_TARGET_FORTIFY, 'true')
condition: eq(variables['CG_TARGET_FORTIFY'], 'true')
condition: eq(variables['CG_TARGET_fortify'], 'true')
# Multiline conditions
condition: >
and (
succeeded(),
or (
eq( variables['Build.SourceBranch'], 'refs/heads/main'),
eq( variables['Build.SourceBranch'], 'refs/heads/dev')
)
)
condition: eq(variables.CG_TARGET_FORTIFY, 'true') condition: eq(variables['CG_TARGET_FORTIFY'], 'true') condition: eq(variables['CG_TARGET_fortify'], 'true') # Multiline conditions condition: > and ( succeeded(), or ( eq( variables['Build.SourceBranch'], 'refs/heads/main'), eq( variables['Build.SourceBranch'], 'refs/heads/dev') ) )
condition: eq(variables.CG_TARGET_FORTIFY, 'true')
condition: eq(variables['CG_TARGET_FORTIFY'], 'true')
condition: eq(variables['CG_TARGET_fortify'], 'true')

# Multiline conditions
condition: >
    and (
      succeeded(),
      or (
        eq( variables['Build.SourceBranch'], 'refs/heads/main'),
        eq( variables['Build.SourceBranch'], 'refs/heads/dev')
      )
    )

Other useful conditions are available from Microsoft.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Run if the source branch is main and the parent or preceding stage, job, or step succeeded.
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
# Run if the source branch isn't main, and the parent or preceding stage, job, or step succeeded.
and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main'))
# Run if a variable is set to true, even if the parent or preceding stage, job, or step failed or was canceled.
eq(variables['System.debug'], true)
# Run if the source branch is main and the parent or preceding stage, job, or step succeeded. condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main')) # Run if the source branch isn't main, and the parent or preceding stage, job, or step succeeded. and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main')) # Run if a variable is set to true, even if the parent or preceding stage, job, or step failed or was canceled. eq(variables['System.debug'], true)
# Run if the source branch is main and the parent or preceding stage, job, or step succeeded.
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))

# Run if the source branch isn't main, and the parent or preceding stage, job, or step succeeded.
and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main'))

# Run if a variable is set to true, even if the parent or preceding stage, job, or step failed or was canceled.
eq(variables['System.debug'], true)

Template Parameter Conditions

(From Microsoft documents) Parameter expansion happens before conditions are considered. Therefore, when you declare a parameter in the same pipeline as a condition, you can embed the parameter inside the condition. The script in the following YAML runs because parameters.doThing is true.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
parameters:
- name: doThing
default: true
type: boolean
steps:
- script: echo I did a thing
condition: and(succeeded(), ${{ eq(parameters.doThing, true) }})
parameters: - name: doThing default: true type: boolean steps: - script: echo I did a thing condition: and(succeeded(), ${{ eq(parameters.doThing, true) }})
parameters:
- name: doThing
  default: true
  type: boolean

steps:
- script: echo I did a thing
  condition: and(succeeded(), ${{ eq(parameters.doThing, true) }})

However, this is a questionable example on their part since if you pass a variable to this template, it will fail since variables ARE ALWAYS STRINGS. It will not do an implicit conversion from string to boolean so it is better to do your own manual conversion.

In the following example, the attempt to pass anything other than “true” or “false” will generate an error:

/azure-pipelines.yml (Line: 134, Col: 24): The 'force_fortify' parameter value '$(TargetFortify)' is not a valid Boolean.
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Calling YAML file...
- template: Devops/Generate-FullVersionInfoV1.yml@CustomBuildResources
parameters:
ver_mmb: $(CG_VERSION)
revision: $(CG_REVISION)
force_fortify: $(TargetFortify)
# Template File...
- name: force_fortify
type: boolean
default: false
# Calling YAML file... - template: Devops/Generate-FullVersionInfoV1.yml@CustomBuildResources parameters: ver_mmb: $(CG_VERSION) revision: $(CG_REVISION) force_fortify: $(TargetFortify) # Template File... - name: force_fortify type: boolean default: false
# Calling YAML file...

    - template: Devops/Generate-FullVersionInfoV1.yml@CustomBuildResources 
      parameters:
        ver_mmb: $(CG_VERSION)
        revision: $(CG_REVISION)
        force_fortify: $(TargetFortify)

# Template File...
- name: force_fortify
  type: boolean
  default: false