In this article, we are going to learn about executing a particular Pipeline Task based on conditions.
Introduction
Azure DevOps – Pipelines support conditional execution of a Task. It means we can control the execution of the task based on a condition and decide if we want to execute it. Azure DevOps supports the below types of conditions
- Built-In Condition
- Custom Condition
Scenario
An Azure DevOps Pipeline is a set of Tasks which are executed in a sequence by the Agent. Sometimes, it may be required to execute a particular task based on some logical condition. Below are some scenarios.
Built-In Conditions
- Execute one of the Pipeline tasks (say AuditLog) only when the rest of ALL pipeline Tasks fail. The AuditLog task could log some details about the failure of all tasks.
- Execute one of the Pipeline Tasks only when its dependent task(s) fails.
You can also have your own custom conditions to control the execution of the Tasks. Below are a few examples.
Custom Conditions
- Execute one of the Pipeline Tasks ONLY if the value of a variable is true.
- Execute one of the Pipeline Task ONLY if the current branch is develop.
- Execute the Pipeline ONLY if the pipeline is executed automatically (Continuous Integration).
Solution
Let’s first see how to leverage the built-in conditions and learn how to control them based on the built-in conditions. Below are the built-in conditions and their usage.
Note. By default, each Task (Jobs and Stages) has a built-in dependency on the previous Task, which means, that if the previous task fails, then the current task will not be executed.
Built-In Conditions
Below are the built-in conditions that can be used to control the execution of tasks.
Condition Criteria |
Description |
succeeded() |
Runs ONLY when its dependent task is Succeeded. It’s the default behavior. |
failed() |
Runs ONLY when its dependency has failed. |
succeeded or failed() |
Runs when its previous depended task is succeeded of failed. It won’t run when pipeline execution is cancelled. |
always() |
Runs ALL the time irrespective of the status of the previous dependent tasks or even if the pipeline execution is cancelled forcefully. |
Below is an example of the usage of the failed() condition at a Job level. Similarly, it could be used at individual Tasks or even Stage levels.
The above screenshot is a pipeline with two jobs where the 1st job has an error which is created intentionally. Below are the points to note from the above pipeline.
- Job1 fails as there is a typo in Line: 17. It should be Write-Host instead of Write-Hosts
- Job2 gets executed even though Job1 fails because it is dependent on Job1 and a condition failed() is specified.
Let’s now learn how to use custom conditions to control the execution of Tasks. In this scenario, you may want to execute a Task / Job / Stage when the value of a variable is set to true. Let's see how to configure it.
Create a variable as shown below and set it to true.
In the pipeline, add the condition as shown below to control the execution only when the variable ExecuteTaskBasedonCondtion is set to true.
In the above screenshot, a condition is used to control the execution of the Task based on the value of a variable.
If the value of the variable ExecuteTaskBasedonCondition is set to true then the Task will execute otherwise it will be skipped. Below is a screenshot which shows that the task is skipped when the value of the variable is set to false.
More above the Condition Expression
- Here the variable is referred to using the Variables construct instead of regular $(variable name) syntax.
- eq is a function that takes two parameters and returns true if both of the inputs are the same. Otherwise, returns false.
In this Tip, we have learnt how to add a very simple condition. For various scenarios, refer to the official documentation here.
Summary
In this Tip, we have learnt how to control the execution of a Task / Job / Stage based on the conditions.
Feel free to share your feedback in the comments section. Thanks for reading.