In a CI/CD pipeline, managing how jobs run in order is key to building reliable automation. You can control the flow between jobs using if conditions, which let you decide what happens next based on whether a previous step succeeded or failed. For example, a logical expression like @or(equals(activity('ActivityFailed').Status, 'Failed'), equals(activity('ActivitySucceeded').Status, 'Failed')) tells the pipeline to run an error-handling step whenever any prior activity fails. Similarly, you can use conditions that let the pipeline continue when at least one parallel activity succeeds, giving you flexibility in how failures are handled.
Pipeline stages act as major checkpoints in your automation workflow, and you can connect them using conditions like Upon Completion. When you link stages this way, the next stage only runs if the previous stage finishes with the result you expect. You can make these connections more complex by requiring all preceding actions to succeed before moving forward, or by mixing different conditions together to match your specific workflow needs. This control over stage flow ensures that your pipeline stops early if something critical fails, rather than wasting time on steps that cannot succeed.
Running multiple jobs at the same time, called parallel task execution, reduces the total time your pipeline needs to complete. You can achieve this by using job matrices and setting resource limits that allow several activities to run on different agents simultaneously. A common pattern called Try-Catch-Proceed lets your pipeline handle errors without stopping everything—subsequent jobs continue running even if an earlier job encounters a problem. For steps that must always run regardless of other jobs' results, you connect them through UponFailure or UponSkip paths, making your pipeline resilient even when things go wrong.
Building robust pipelines means planning for unexpected errors that you cannot predict. You should place generic error-handling jobs at the end of your pipeline to catch any issues that slip past specific checks. When a sequential task fails, a logging job or cleanup script should automatically run to record what happened and clean up any temporary resources. By connecting the failure path of any activity directly to an error-handling job, you ensure your pipeline stays maintainable and leaves no orphaned resources behind. This approach creates a safety net that keeps your CI/CD process reliable across complex workflows.
Seeking the thrill of transformative tech? Explore the art of designing and implementing DevOps solutions on Azure. Master the shift towards CI/CD, testing, and delivery, while preparing for the Designing and Implementing Microsoft DevOps Solutions exam!
Prepare and test your skills

Prepare and test your skills

You can control the flow between jobs using if conditions, which let you decide what happens next based on whether a previous step succeeded or failed, such as running an error-handling step when a prior activity fails.
Parallel task execution reduces the total time your pipeline needs to complete by allowing multiple jobs to run on different agents simultaneously, which you can achieve by using job matrices and setting resource limits.
You connect pipeline stages using conditions like Upon Completion, which ensures the next stage only runs if the previous stage finishes with the expected result, allowing you to stop early if something critical fails.
A common pattern called Try-Catch-Proceed lets your pipeline handle errors without stopping everything, allowing subsequent jobs to continue running even if an earlier job encounters a problem.