---
title: Create a YAML build pipeline
description: "To follow this example for the Unified Experience, you need to [download the template from Microsoft's repo on GitHub](https://github.com/microsoft/Dynamics365-Xpp-Samples-Tools/tree/master/CI-CD/Pipeline-Samples). As a prerequisite, you have to [add the NuGet packages to your artifacts](http://ariste.info/dynamics365almguide/azure-devops-artifacts/). If you want to use classic pipelines Let's…"
url: "https://ariste.info/dynamics365almguide/create-a-yaml-build-pipeline/"
updated: "2025-10-28"
category: Unified experience ALM / Pipelines
---

# Create a YAML build pipeline

To follow this example for the Unified Experience, you need to [download the template from Microsoft's repo on GitHub](https://github.com/microsoft/Dynamics365-Xpp-Samples-Tools/tree/master/CI-CD/Pipeline-Samples).

As a prerequisite, you have to [add the NuGet packages to your artifacts](http://ariste.info/dynamics365almguide/azure-devops-artifacts/).

If you want to use classic pipelines

Let's learn how to create the **build pipeline** using YAML templates.

## Prepare YAML file

Download the latest file with a .yml extension.

First, if you haven't, take a look at this section of the documentation: [Configure your Git Repository](http://ariste.info/dynamics365almguide/configure-your-git-repository/). This is important because I'll use that folder structure on the repo.

Upload the file to the Tools\\Pipeline folder:

![Add YAML file to Pipelines](http://ariste.info/wp-content/uploads/2025/10/image-3.png)
Add YAML file to Pipelines

Rename it if you like, and now we must change it a bit:

- In the `trigger` section make sure that it matches the branch you want to build. Add [triggers or schedules](http://ariste.info/dynamics365almguide/understanding-yaml-triggers/) as needed.
- In the `pool` section, under `vmImage` you will see **windows-2019**. This image will be retired. Replace it with **windows-latest** or **windows-2025**.
- In the `variables` section, change the **NugetConfigsPath** variable to '$(Build.SourcesDirectory)\\Tools\\Build'. This points the build process to look for the .config files in that folder. If you have them somewhere else, change it to fit your setup.
- In the **VSBuild@1** task, replace the vsVersion value with **17.0** to run using the latest Visual Studio version.

Click the **Commit** button, and wait a second!

## Update XppCreatePackage

I want to have a section for this because it's VERY important for our Unified Experience ALM.

Change the XppCreatePackage@0 task to XppCreatePackage@2, and now click its Settings link:

![XppCreatePackage@2 settings](http://ariste.info/wp-content/uploads/2025/10/image-10.png)
XppCreatePackage@2 settings

Why is it so important? Look at the highlighted fields on the right. We've got something new here!

- **Create Lifecycle Services Software Deployable Package**: if this option is selected, the build will produce a software deployable package for LCS. What we've used until now.
- **Create Power Platform Unified Package**: if this option is selected, the build process creates a Dataverse managed solution with our X++ code! This is what we're going to use in our release pipeline.

You can use one, the other, or both. But to follow this guide, make sure to select the **Create Power Platform Unified Package** one.

## Create new pipeline

Go to the **Pipelines** section and click the **New pipeline** button.

Next, select Azure Repos Git:

![Select Azure Repos Git](http://ariste.info/wp-content/uploads/2025/10/image-4.png)
Select Azure Repos Git

Select your repo:

![Select yours, this is mine :)](http://ariste.info/wp-content/uploads/2025/10/image-5.png)
Select yours, this is mine 🙂

Select **Existing Azure Pipelines YAML file**:

![Select Existing Azure Pipelines YAML file:](http://ariste.info/wp-content/uploads/2025/10/image-6.png)
Select Existing Azure Pipelines YAML file

Select the branch and YAML file that contains the pipeline definition, and click **Continue**:

![Select your YAML file](http://ariste.info/wp-content/uploads/2025/10/image-7.png)
Select your YAML file

Now you will see your pipeline definition. Here you could modify it too, and the changes will be saved in the repo. We already did the changes we needed, so just click the **Run** button.

## Editing the steps

While the pipeline runs, let's take a look at the steps. If you look closely, you will see that for each task in the steps, there's a **Settings** link:

![Settings in tasks](http://ariste.info/wp-content/uploads/2025/10/image-8.png)
Settings in tasks

If you click this link, you'll get a side pane on the right that displays the value of the **inputs** for each task:

![Inputs on YAML pipeline](http://ariste.info/wp-content/uploads/2025/10/image-9.png)
Inputs on YAML pipeline

So, if you're a bit allergic to the pipeline as code, you still have some graphical help 😉

Like in classic pipelines, it's possible to remove the tasks that you don't need; just delete them from the file.

## Check your pipeline run

If everything is fine, you will see something like this:

![Successful pipeline run](http://ariste.info/wp-content/uploads/2025/10/image-11.png)
Successful pipeline run

You can see that it's ended with no errors, and there's 1 published artifact. If you click it and open the folders, you'll see this:

![Unified solution for X++](http://ariste.info/wp-content/uploads/2025/10/image-12.png)
Unified solution for X++

You can see the DLL file that we'll deploy later in the release pipeline and the model that's been built.

And just like that, we've got a build pipeline running.

#### Subscribe!

Receive an email when a new post is published
