# Sample YML pipeline for X++ builds (multi-stage) # https://docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/dev-tools/hosted-build-automation name: $(Date:yy.MM.dd)$(Rev:.r) trigger: - none schedules: - cron: "0 6 * * *" # 8:00 every day displayName: Daily Build at 08:00 branches: include: - main always: false # Global variables stay as-is variables: App1Package: 'Microsoft.Dynamics.AX.Application1.DevALM.BuildXpp' App2Package: 'Microsoft.Dynamics.AX.Application2.DevALM.BuildXpp' AppSuitePackage: 'Microsoft.Dynamics.AX.ApplicationSuite.DevALM.BuildXpp' PlatPackage: 'Microsoft.Dynamics.AX.Platform.DevALM.BuildXpp' ToolsPackage: 'Microsoft.Dynamics.AX.Platform.CompilerPackage' MetadataPath: '$(Build.SourcesDirectory)\Metadata' NugetConfigsPath: '$(Build.SourcesDirectory)\Tools\Build' NugetsPath: '$(Pipeline.Workspace)\NuGets' stages: # ---------- Stage 1: Build ---------- - stage: Build displayName: X++ Build & Package jobs: - job: BuildXpp pool: vmImage: 'windows-latest' demands: - msbuild - visualstudio displayName: Build solution and create deployable package steps: # Install NuGet and use -ExcludeVersion option - task: NuGetCommand@2 displayName: 'NuGet custom install Packages' inputs: command: custom arguments: 'install -Noninteractive $(NugetConfigsPath)\packages.config -ConfigFile $(NugetConfigsPath)\nuget.config -Verbosity Detailed -ExcludeVersion -OutputDirectory "$(NugetsPath)"' # Use the custom build number y.m.d.rev as the model version - task: XppUpdateModelVersion@0 displayName: 'Update Model Version' inputs: XppSourcePath: '$(MetadataPath)' VersionNumber: '$(Build.BuildNumber)' # Build using MSBuild 17 (VS 2022) - task: VSBuild@1 displayName: 'Build solution **\*.sln' inputs: solution: '**/*.sln' vsVersion: '17.0' msbuildArgs: > /p:BuildTasksDirectory="$(NugetsPath)\$(ToolsPackage)\DevAlm" /p:MetadataDirectory="$(MetadataPath)" /p:FrameworkDirectory="$(NuGetsPath)\$(ToolsPackage)" /p:ReferenceFolder="$(NuGetsPath)\$(PlatPackage)\ref\net40;$(NuGetsPath)\$(App1Package)\ref\net40;$(NuGetsPath)\$(App2Package)\ref\net40;$(NuGetsPath)\$(AppSuitePackage)\ref\net40;$(MetadataPath);$(Build.BinariesDirectory)" /p:ReferencePath="$(NuGetsPath)\$(ToolsPackage)" /p:OutputDirectory="$(Build.BinariesDirectory)" # Copy compiler log files to drop - task: CopyFiles@2 displayName: 'Copy X++ Compile Log Files to: $(Build.ArtifactStagingDirectory)\Logs' inputs: SourceFolder: '$(Build.SourcesDirectory)' Contents: | **\Dynamics.AX.*.xppc.* **\Dynamics.AX.*.labelc.* **\Dynamics.AX.*.reportsc.* TargetFolder: '$(Build.ArtifactStagingDirectory)\Logs' condition: succeededOrFailed() # For packaging we need NuGet < 3.4.0 - task: NuGetToolInstaller@0 displayName: 'Use NuGet 3.3.0' inputs: versionSpec: 3.3.0 - task: XppCreatePackage@2 displayName: Create Deployable Package inputs: XppToolsPath: $(NuGetsPath)\$(ToolsPackage) CreateCloudPackage: true CreateRegularPackage: false # Enable to add license file to the package - task: XppAddLicenseToPackage@0 displayName: 'Add Licenses to Deployable Package' enabled: false - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact: drop' inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' condition: succeededOrFailed() # ---------- Stage 2: Deploy UAT ---------- - stage: DeployUAT displayName: Deploy to UAT dependsOn: Build condition: succeeded() jobs: - deployment: DeployToUAT timeoutInMinutes: 360 pool: vmImage: 'windows-latest' displayName: Deploy package to UAT environment: 'D365-UAT' # create this Environment in Azure DevOps and add approvals/checks as needed strategy: runOnce: deploy: steps: - task: PowerPlatformToolInstaller@2 displayName: 'Power Platform Tool Installer ' - task: PowerPlatformWhoAmi@2 displayName: 'Power Platform WhoAmI ' inputs: authenticationType: PowerPlatformSPN PowerPlatformSPN: 'CSNA-UAT' - task: PowerPlatformDeployPackage@2 displayName: 'Power Platform Deploy Package ' inputs: authenticationType: PowerPlatformSPN PowerPlatformSPN: 'CSNA-UAT' PackageFile: '$(Pipeline.Workspace)/drop/CloudDeployablePackage/TemplatePackage.dll' # ---------- Stage 2: Deploy Prod ---------- - stage: DeployProd displayName: Deploy to Production dependsOn: DeployUAT condition: succeeded() jobs: - deployment: DeployToProd timeoutInMinutes: 360 pool: vmImage: 'windows-latest' displayName: Deploy package to Prod environment: 'D365-Prod' # create this Environment in Azure DevOps and add approvals/checks as needed strategy: runOnce: deploy: steps: - task: PowerPlatformToolInstaller@2 displayName: 'Power Platform Tool Installer ' - task: PowerPlatformWhoAmi@2 displayName: 'Power Platform WhoAmI ' inputs: authenticationType: 'PowerPlatformSPN' PowerPlatformSPN: 'CSNA-Prod' - task: PowerPlatformDeployPackage@2 displayName: 'Power Platform Deploy Package ' inputs: authenticationType: 'PowerPlatformSPN' PowerPlatformSPN: 'CSNA-Prod' PackageFile: '$(Pipeline.Workspace)/drop/CloudDeployablePackage/TemplatePackage.dll'