---
title: YAML vs Classic Pipelines
description: Learn the basics about Azure Pipelines and explore the different features available for both YAML and Classic pipelines.
ms.topic: overview
ms.author: sdanie
author: steved0x
ms.date: 06/12/2024
monikerRange: '<= azure-devops'
---
# YAML vs Classic Pipelines
[!INCLUDE [version-lt-eq-azure-devops](../../includes/version-lt-eq-azure-devops.md)]
Azure Pipelines enables developers to automate a wide variety of tasks, ranging from executing a batch file to setting up a complete continuous integration (CI) and continuous delivery (CD) solution for their applications.
Azure Pipelines supports a wide range of languages, platforms, and tools, and offers two types of pipelines to choose from: [YAML-based](yaml-pipeline-editor.md) and [Classic pipeline](../release/define-multistage-release-process.md) editors.
> [!NOTE]
> If you are new to Azure Pipelines, it is recommended to start with YAML pipelines. For existing Classic pipelines, you can choose to continue using them or [migrate to YAML pipelines](../migrate/from-classic-pipelines.md).
## Define pipelines using YAML
Your pipeline configuration resides in a YAML file named `azure-pipelines.yml`, alongside your application.
- The YAML file is versioned alongside your application code, adhering to the same branching structure.
- Each branch can customize the pipeline by editing the `azure-pipelines.yml` file.
- Keeping the pipeline configuration in version control ensures that any changes that cause issues or unexpected outcomes can be easily identified within your codebase.
For instructions, see [Create your first pipeline](../create-first-pipeline.md) for a step by step guide to building a sample application from a Git repository.
## Define pipelines using the Classic interface
::: moniker range="<=azure-devops"
Classic pipelines are created in the Azure DevOps web portal with the Classic user interface editor. You can define a *pipeline* to build, test your code, and then publish your artifact (binary). Additionally, you can define a *release pipeline* to consume your binary (artifact) and deploy it to specific targets.
::: moniker-end
For instructions, see [build](../build/ci-build-git.md) and [deploy](../release/define-multistage-release-process.md) for step by step guides to building and deploying your application with Classic Pipelines.
## Feature availability
::: moniker range="azure-devops"
| Feature | Description | YAML | Classic Pipeline | Classic Release |
|-------------------------------------------------------|------------------------------------------------------------------------------------------------|------------------|------------------|-----------------|
| **Agents** | A software component that runs on a virtual machine or a physical machine and is responsible for executing the tasks defined in your Azure Pipelines. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../agents/agents.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../agents/agents.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../agents/agents.md) |
| **Approvals** | Control your deployment workflow by requiring designated approvers to approve before deploying to a stage. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/approvals.md#approvals) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../release/approvals/approvals.md#predeployment-approvals) |
| **Artifacts** | Download and publish your binaries and various types of packages to different destinations. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../artifacts/pipeline-artifacts.md?&tabs=yaml-task) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../artifacts/pipeline-artifacts.md?&tabs=yaml-task) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../release/deploy-multiple-branches.md#create-a-classic-release-pipeline) |
| **Caching** | Reduce build time by caching and reusing dependencies from previous runs. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../release/caching.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../release/caching.md) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: |
| **Conditions** | Specify conditions under which a step, job, or stage should run. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/conditions.md?tabs=yaml) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/conditions.md?tabs=classic) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/conditions.md?tabs=classic) |
| **Container jobs** | Specify jobs to run in a container. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/container-phases.md) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: |
| **Demands** | Ensure that the capabilities your pipeline needs are present on the running agent. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../agents/agents.md#configure-demands) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../agents/agents.md?tabs=classic#configure-demands) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../agents/agents.md?tabs=classic#configure-demands) |
| **Dependencies** | Specify a requirement that must be met in order to run the next stage. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/stages.md?tabs=yaml#specify-dependencies) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/stages.md?tabs=classic#specify-dependencies) |
| **Deployment groups & Environments** | Deployment groups (Classic): Define a set of target machines each equipped with a deployment agent.
Environments (YAML): A collection of resources targeted for deployment. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/environments.md) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../release/deployment-groups/index.md#create-a-deployment-group) |
| **Deployment jobs** | A collection of deployment steps that are run sequentially against the environment. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/deployment-jobs.md) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: |
| **Gates** | Automate release controls by evaluating health signals from external services before completing a deployment. | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../release/deploy-using-approvals.md#set-up-gates) |
| **Jobs** | A series of sequential steps that form the smallest unit of work that can be scheduled to run. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/phases.md?tabs=yaml) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/phases.md?tabs=classic) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/phases.md?tabs=classic) |
| **Library** | A collection of assets that can be used in your Azure Pipelines. The Library contains two types of assets: [Variable groups](../library/variable-groups.md) and [Secure files](../library/secure-files.md). | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/index.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/index.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/index.md) |
| **Service connections** | Enable connection to an external service required to execute tasks in a job. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/service-endpoints.md#create-a-service-connection) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/service-endpoints.md#create-a-service-connection) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/service-endpoints.md#create-a-service-connection) |
| **Service containers** | Enable you to manage the lifecycle of a containerized service. most commonly used with container jobs. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/service-containers.md) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: |
| **Stages** | Organize jobs within a pipeline. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/stages.md?tabs=yaml#specify-stages) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/stages.md?tabs=classic#specify-stages) |
| **Task groups** | Encapsulate a sequence of tasks into a single reusable task. | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/task-groups.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/task-groups.md) |
| **Tasks** | The building blocks that define the steps that make up a pipeline job. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/tasks.md?tabs=yaml) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/tasks.md?tabs=classic) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/tasks.md?tabs=classic) |
| **Templates** | Define reusable content, logic, and parameters. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/templates.md) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: |
| **Triggers** | Define the event that causes a pipeline to run. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/pipeline-triggers.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/pipeline-triggers-classic.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../release/triggers.md) |
| **Variables** | A placeholder for values that can be used throughout your pipeline's execution. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/variables.md?tabs=yaml#set-variables-in-pipeline) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/variables.md?tabs=classic#set-variables-in-pipeline) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/variables.md?tabs=classic#set-variables-in-pipeline) |
| **Variable groups** | Use to store values and secrets that you want to manage and share across multiple pipelines. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/variable-groups.md?tabs=yaml#use-variable-groups-in-pipelines) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/variable-groups.md?tabs=classic#use-variable-groups-in-pipelines) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/variable-groups.md?tabs=classic#use-variable-groups-in-pipelines) |
::: moniker-end
::: moniker range="=azure-devops-2022"
| Feature | Description | YAML | Classic Pipeline | Classic Release |
|-------------------------------------------------------|------------------------------------------------------------------------------------------------|------------------|------------------|-----------------|
| **Agents** | A software component that runs on a virtual machine or a physical machine and is responsible for executing the tasks defined in your Azure Pipelines. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../agents/agents.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../agents/agents.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../agents/agents.md) |
| **Approvals** | Control your deployment workflow by requiring designated approvers to approve before deploying to a stage. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/approvals.md#approvals) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../release/approvals/approvals.md#predeployment-approvals) |
| **Artifacts** | Download and publish your binaries and various types of packages to different destinations. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../artifacts/pipeline-artifacts.md?&tabs=yaml-task) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../artifacts/pipeline-artifacts.md?&tabs=yaml-task) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../release/deploy-multiple-branches.md#create-a-classic-release-pipeline) |
| **Conditions** | Specify conditions under which a step, job, or stage should run. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/conditions.md?tabs=yaml) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/conditions.md?tabs=classic) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/conditions.md?tabs=classic) |
| **Container jobs** | Specify jobs to run in a container. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/container-phases.md) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: |
| **Demands** | Ensure that the capabilities your pipeline needs are present on the running agent. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../agents/agents.md#configure-demands) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../agents/agents.md?tabs=classic#configure-demands) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../agents/agents.md?tabs=classic#configure-demands) |
| **Dependencies** | Specify a requirement that must be met in order to run the next stage. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/stages.md?tabs=yaml#specify-dependencies) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/stages.md?tabs=classic#specify-dependencies) |
| **Deployment groups & Environments** | Deployment groups (Classic): Define a set of target machines each equipped with a deployment agent.
Environments (YAML): A collection of resources targeted for deployment. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/environments.md) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../release/deployment-groups/index.md#create-a-deployment-group) |
| **Deployment jobs** | A collection of deployment steps that are run sequentially against the environment. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/deployment-jobs.md) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: |
| **Gates** | Automate release controls by evaluating health signals from external services before completing a deployment. | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../release/deploy-using-approvals.md#set-up-gates) |
| **Jobs** | A series of sequential steps that form the smallest unit of work that can be scheduled to run. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/phases.md?tabs=yaml) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/phases.md?tabs=classic) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/phases.md?tabs=classic) |
| **Library** | A collection of assets that can be used in your Azure Pipelines. The Library contains two types of assets: [Variable groups](../library/variable-groups.md) and [Secure files](../library/secure-files.md). | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/index.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/index.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/index.md) |
| **Service connections** | Enable connection to an external service required to execute tasks in a job. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/service-endpoints.md#create-a-service-connection) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/service-endpoints.md#create-a-service-connection) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/service-endpoints.md#create-a-service-connection) |
| **Stages** | Organize jobs within a pipeline. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/stages.md?tabs=yaml#specify-stages) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/stages.md?tabs=classic#specify-stages) |
| **Task groups** | Encapsulate a sequence of tasks into a single reusable task. | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/task-groups.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/task-groups.md) |
| **Tasks** | The building blocks that define the steps that make up a pipeline job. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/tasks.md?tabs=yaml) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/tasks.md?tabs=classic) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/tasks.md?tabs=classic) |
| **Templates** | Define reusable content, logic, and parameters. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/templates.md) | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: | :::image type="icon" source="../../media/icons/delete-icon.png" border="false"::: |
| **Triggers** | Define the event that causes a pipeline to run. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/pipeline-triggers.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/pipeline-triggers-classic.md) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../release/triggers.md) |
| **Variables** | A placeholder for values that can be used throughout your pipeline's execution. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/variables.md?tabs=yaml#set-variables-in-pipeline) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/variables.md?tabs=classic#set-variables-in-pipeline) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../process/variables.md?tabs=classic#set-variables-in-pipeline) |
| **Variable groups** | Use to store values and secrets that you want to manage and share across multiple pipelines. | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/variable-groups.md?tabs=yaml#use-variable-groups-in-pipelines) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/variable-groups.md?tabs=classic#use-variable-groups-in-pipelines) | :::image type="icon" source="../../media/icons/checkmark.png" border="false"::: [doc](../library/variable-groups.md?tabs=classic#use-variable-groups-in-pipelines) |
::: moniker-end
## Next steps
> [!div class="nextstepaction"]
> [Sign up for Azure Pipelines](pipelines-sign-up.md)
> [Create your first pipeline](../create-first-pipeline.md)
> [Customize your pipeline](../customize-pipeline.md)