AL.build for Azure DevOps
AL.build is an Azure DevOps extension designed to streamline AL development and build pipelines, making it easier for developers to automate and manage their workflows in Azure DevOps environments. This extension is brought to you by 365 business development, aiming to enhance productivity and efficiency in AL projects.
Supported Environments
- Microsoft Dynamics 365 Business Central On-Premise
- Microsoft Dynamics 365 Business Central Online (SaaS)
- Microsoft Dynamics 365 Business Central on Docker
Getting Started
To get started with AL.build, first ensure you have an Azure DevOps account and the necessary permissions to install extensions. Follow these steps to install AL.build:
- Navigate to the Azure DevOps Marketplace.
- Search for AL.build for Azure DevOps.
- Select the extension and click on Get it.
- Follow the installation instructions.
Once installed, you can start configuring your AL build and release pipelines using the tasks provided by AL.build.
Example
The following example shows a simple AL.build Build Pipeline, in yaml format. The pipeline is building an AL application, based on Azure DevOps Repo, by creating a Build Container, Install dependent apps from Azure Feed, Compile, Sign and Install the application into to Build Container and finally run the automated tests.
trigger:
- master
- main
pool:
name: Self Hosted
parameters:
- name: stages
type: object
default:
- stage: Current
bcVersion: latest
- stage: NextMajor
bcVersion: nextMinor
- stage: NextMinor
bcVersion: nextMajor
stages:
- ${{ each stage in parameters.stages }}:
- stage: Build${{ stage.stage }}
displayName: "Build ${{ stage.stage }}"
dependsOn: []
variables:
- name: bcVersion
value: ${{ stage.bcVersion }}
jobs:
- job:
displayName: "${{ stage.stage }}"
steps:
- checkout: self
persistCredentials: true
- task: InstallBcContainerHelper@1
displayName: 'Install BC Container Helper'
- task: AppVersioning@1
displayName: 'Set Version Number'
condition: succeeded()
inputs:
onlyUpdateOnChangedSource: true
versioningSchema: major.minor.build.no-of-commits
env:
AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
- task: CreateBuildContainer@1
displayName: 'Create Build Container'
condition: succeeded()
inputs:
bcType: 'sandbox'
bcVersion: ${{ stage.bcVersion }}
bcCountryVersion: 'w1'
- task: DownloadDependenciesUniversalFeed@1
displayName: 'Download Dependencies'
condition: succeeded()
inputs:
organization: '$(System.TeamFoundationCollectionUri)'
feed: '$(AzureFeedArtifactsName)'
env:
AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
- task: Compile@1
displayName: 'Compile'
condition: succeeded()
inputs:
createNugetPackage: true
- task: SignApp@1
displayName: 'Sign'
condition: succeeded()
inputs:
artifactsDirectory: '$(Build.ArtifactStagingDirectory)'
signingAzureKeyVaultUrl: '$(SigningAzureKeyVaultUrl)'
signingAzureKeyVaultTenantId: '$(SigningAzureKeyVaultTenantId)'
signingAzureKeyVaultClientId: '$(SigningAzureKeyVaultClientId)'
signingAzureKeyVaultClientSecret: '$(SigningAzureKeyVaultClientSecret)'
signingCertName: '$(SigningCertName)'
- task: Install@1
displayName: 'Install'
condition: succeeded()
inputs:
schemaUpdateMode: 'Synchronize'
- task: RunTests@1
displayName: 'Run Tests'
condition: succeeded()
- task: PublishTestResults@2
displayName: 'Publish Test Results'
condition: succeeded()
inputs:
testResultsFormat: XUnit
testResultsFiles: TestResults.xml
failTaskOnFailedTests: true
- task: RemoveBuildContainer@1
displayName: 'Remove Build Container'
condition: always()
- ${{ if eq(stage.bcVersion, 'latest') }}:
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifacts'
condition: and(succeeded(), eq(variables.isPullRequestBuild, true))
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: output
- task: NuGetCommand@2
displayName: 'Publish Artifacts to NuGet feed'
continueOnError: true
condition: and(succeeded(), eq(variables.isPullRequestBuild, true))
inputs:
command: 'push'
packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg;!$(Build.ArtifactStagingDirectory)/**/*.symbols.nupkg'
nuGetFeedType: 'internal'
publishVstsFeed: '$(AzureDevOpsNuGetFeed)'
allowPackageConflicts: true
- task: UniversalPackages@0
displayName: 'Publish Artifacts to Azure Feed (Universal)'
continueOnError: true
condition: and(succeeded(), eq(variables.isPullRequestBuild, true))
inputs:
command: publish
publishDirectory: '$(Build.ArtifactStagingDirectory)'
vstsFeedPublish: '$(AzureDevOpsUniversalPackageFeed)'
vstsFeedPackagePublish: '$(appName)'
packagePublishDescription: '$(appDescription)'
versionOption: custom
versionPublish: '$(appVersion).$(appBuild)'
For further guidance please visit our GitHub repository for AL.build template or our AL.build documentation.
Build Tasks
The AL.build extension provides various tasks to support the build process of AL projects. These tasks can be added to your Azure DevOps pipelines to automate the compilation, testing, and packaging of your AL applications.
Currently the following tasks are supported by AL.build:
Task |
Link |
AppVersioning@1 Update application version in app.json manifest. |
Coming soon ... |
CreateBuildContainer@1 Create docker container with Microsoft Dynamics 365 Business Central installed. |
Coming soon ... |
CheckXliffTranslation@1 Check translation files in XLIFF format for completeness. |
Coming soon ... |
DownloadArtifactsUniversalFeed@1 Downloads the specified artifacts from the Universal Feed, extracts them to the specified folder and installs them in the build container. |
Coming soon ... |
DownloadDependenciesUniversalFeed@1 Downloads the app dependencies from the Universal Feed, extracts them to the specified folder and installs them in the build container. |
Coming soon ... |
DownloadArtifactsNuGet@1 Downloads the specified artifacts from the NuGet Feed, extracts them to the specified folder and installs them in the build container. |
Coming soon ... |
Compile@1 Compile AL applications in build container, to create runtime packages, NuGet packages or regular app files. |
Coming soon ... |
SignApp@1 Sign app using AzureSignTool. |
Coming soon ... |
Install@1 Publish and install AL applications to build container. |
Coming soon ... |
Install365App@1 Publish and install 365 business development applications to on-premise build container. |
Coming soon ... |
RunTests@1 Run tests in build container. |
Coming soon ... |
PublishTestResultsTestiny@1 Publish test results to testiny.io |
Coming soon ... |
RemoveBuildContainer@1 Removes the docker container created for compiling the code. |
Coming soon ... |
Release Tasks
In addition to build automation, AL.build offers tasks tailored for the release process, facilitating the deployment of AL applications to different environments.
Task |
Link |
ReleaseAppSource@1 Release AL application to Microsoft AppSource Marketplace. |
Coming soon ... |
ReleaseOnPrem@1 Publish Per Tenant Extension to Microsoft Dynamics 365 Business Central On-Premise Environment. |
Coming soon ... |
ReleaseDevExtension@1 Publish App to Microsoft Dynamics 365 Business Central Environment in development (Dev) scope. |
Coming soon ... |
ReleasePTE@1 Release Per Tenant Extension (PTE) in Tenant or Development (Sandbox environment only) scope to Microsoft Dynamics 365 Business Central Cloud Sandbox or Production Environment. |
Coming soon ... |
Support and Contributions
For support questions, issues, or contributions, please refer to our service desk at http://servicedesk.365businessdev.com/.
Thank you for choosing AL.build for your AL development and build pipelines.
We hope this extension accelerates your AL projects and enhances your Azure DevOps experience.