Azure DevOps build pipeline for D365 F&O without a build VM
Compile X++ and create the D365 F&O deployable package with Azure Pipelines and hosted agents: NuGet, packages.config, tasks and limits.
The short answer
Today you can compile X++ code and produce a Dynamics 365 Finance & Operations deployable package in Azure DevOps on a Microsoft-hosted Windows agent, with no build virtual machine. The principle: publish Microsoft's NuGet packages (X++ compiler and compiled platform and application references) to an Azure Artifacts feed, declare them in a packages.config file, then chain in the pipeline the NuGet restore, model versioning, MSBuild build and deployable package creation tasks ("Dynamics 365 Finance and Operations Tools" extension).
Important limit: this build only compiles and packages. No SysTest tests, no database synchronisation, nothing that needs the runtime (AOS).
Prerequisites: projects and NuGet packages
- One X++ project per package to build in the repository (a solution can group them and set the order), and each model's descriptor under source control.
- The NuGet packages from the Lifecycle Services shared asset library (or through the Power Platform Visual Studio extension): CompilerPackage, Platform, Application1, Application2 and ApplicationSuite "Build Reference". Their version must be later than or equal to your environment's.
- An Azure Artifacts feed, a nuget.config to reach it and a packages.config listing the versions:
<packages>
<package id="Microsoft.Dynamics.AX.Platform.DevALM.BuildXpp" version="…" targetFramework="net40" />
<package id="Microsoft.Dynamics.AX.Application1.DevALM.BuildXpp" version="…" targetFramework="net40" />
<package id="Microsoft.Dynamics.AX.Application2.DevALM.BuildXpp" version="…" targetFramework="net40" />
<package id="Microsoft.Dynamics.AX.ApplicationSuite.DevALM.BuildXpp" version="…" targetFramework="net40" />
<package id="Microsoft.Dynamics.AX.Platform.CompilerPackage" version="…" targetFramework="net40" />
</packages>To move to a new version, publish the new packages and update packages.config.
Creating the pipeline
Microsoft's recommended method: import the xpp-classic-ci.json pipeline template from the Dynamics365-Xpp-Samples-Tools GitHub repository, pick the windows-latest agent, set the sources (for TFVC, the folder holding Metadata and Projects) and the NugetConfigPath variable. YAML pipelines are only available with Git; TFVC requires classic pipelines.
When building it by hand, the tasks are: install the NuGet packages, update model versions, build the solution, install NuGet on the agent, create the deployable package. The "Dynamics 365 Finance and Operations Tools" Azure DevOps extension provides the specific tasks; with the unified developer experience it can also add ISV licences and apply the package to an environment. See UDE: what changes for an X++ developer.
Common mistakes
- NuGet packages older than the target environment.
- Forgetting a model descriptor in source control.
- An .rnrproj project not created or saved with the Visual Studio tools.
- Relying on this pipeline to run SysTest tests: it does not run them.
- Letting package versions pile up in Azure Artifacts: free storage is limited.
And at Skalp AI?
Skalp does not deploy itself: code arrives as a pull request in your Azure DevOps project, and your pipeline then builds and packages it. Skalp AI writes the specification, generates the X++ code and unit tests, compiles with a best-practice check, then delivers a pull request to your Azure DevOps: nothing is merged without your technical architect's approval. See Azure DevOps integration, the bigger picture in building X++ without a consultant in 2026, and the Basic, Pro and Max plans (1 credit, ≈ €400 on Basic, €200 on Pro, consumed only when the code is generated).
Sources
- Microsoft Learn, "Build automation that uses Microsoft-hosted agents and Azure Pipelines", updated 5 Mar 2026, accessed 18 Oct 2026.
- Microsoft Learn, "Unified developer experience - Frequently asked questions", updated 23 Jul 2026, accessed 18 Oct 2026.
Frequently asked questions
Do you still need a build VM for D365 F&O?
Not to compile and package: a Microsoft-hosted agent is enough with the NuGet packages. You need one, or an environment, to run SysTest tests that require the runtime.
YAML or classic pipeline?
YAML only with a Git repository; a TFVC repository requires a classic pipeline. Microsoft provides a classic template to import.
Where do you get the X++ compiler NuGet packages?
In the Lifecycle Services shared asset library, or through the Power Platform Visual Studio extension; you then publish them to an Azure Artifacts feed.
Ready to transform your D365?
Join the CIOs who develop their D365 tickets in 2–4 h for 1 credit (≈ €400 on Basic, €200 on Pro).