Skip to content
| Marketplace
Sign in
Azure DevOps>Azure Pipelines>AL.build for Azure DevOps
AL.build for Azure DevOps

AL.build for Azure DevOps

365 business development

|
22 installs
| (0) | Paid
Azure DevOps extension for AL development and build pipelines.
Get30 days free trial

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:

  1. Navigate to the Azure DevOps Marketplace.
  2. Search for AL.build for Azure DevOps.
  3. Select the extension and click on Get it.
  4. 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.

  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
© 2025 Microsoft