ALbuild for Azure DevOps
Granular, composable Azure DevOps pipeline tasks for Microsoft Dynamics 365 Business Central AL
development — by 365 business development.
ALbuild is built on the
businessdev.ALbuild PowerShell
module. Every task is a thin wrapper that imports the module and calls a single cmdlet, so the same
behaviour runs locally and in CI — with no dependency on BcContainerHelper.
Highlights
- Granular, composable tasks. The monolithic Create Build Container of the previous generation
is split into small, reusable steps you arrange freely: Get BC Artifact → Create BC Container →
Resolve Dependencies → Compile → Sign → Publish → Run Tests → Remove BC Container.
- BcContainerHelper-free. The container stack is reimplemented inside the module; the extension
depends only on
businessdev.ALbuild.
- Reproducible dependency resolution. Transitive resolution across NuGet v3 feeds, Azure DevOps
Universal Packages and committed local
.app files, captured in a dependencies.lock.json.
- Run pipelines locally. Reproduce a CI run on a developer machine with
Invoke-ALbuildPipeline.
- Generous free tier. Every build, compile, test, sign and NuGet-publish task is free of
license. Only the deployment tasks require a subscription — see Pricing.
Supported environments
- Microsoft Dynamics 365 Business Central On-Premises
- Microsoft Dynamics 365 Business Central Online (SaaS)
- Microsoft Dynamics 365 Business Central on Docker
Getting started
- Open the Azure DevOps Marketplace and search for ALbuild for Azure DevOps.
- Select the extension and choose Get it free to install it into your organization.
- Add the tasks to your build and release pipelines.
The free-of-license tasks work immediately — no license key required. To use the licensed
deployment tasks, acquire a license for your Azure DevOps organization at
365businessdev.com. Licensing is verified automatically per
organization, and a free trial is available.
For detailed guidance, see the documentation and the ready-to-use
pipeline templates.
Example pipeline
A minimal build pipeline that resolves the BC artifact, creates a container, restores dependencies,
compiles, signs, installs, runs the tests, and removes the container:
trigger:
- main
- master
pool:
name: Self Hosted
steps:
- checkout: self
persistCredentials: true
- task: GetBcArtifact@0
displayName: 'Get BC Artifact'
inputs:
type: 'sandbox'
version: 'latest'
country: 'w1'
- task: StampBuildVersion@0
displayName: 'Set Version Number'
inputs:
versioningSchema: 'major.minor.build.no-of-commits'
onlyUpdateOnChangedSource: true
env:
AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
- task: CreateBcContainer@0
displayName: 'Create BC Container'
- task: ResolveDependencies@0
displayName: 'Resolve Dependencies'
env:
AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
- task: CompileApp@0
displayName: 'Compile'
inputs:
createNuGetPackage: true
- task: SignBcApp@0
displayName: 'Sign'
inputs:
signingAzureKeyVaultUrl: '$(SigningAzureKeyVaultUrl)'
signingAzureKeyVaultTenantId: '$(SigningAzureKeyVaultTenantId)'
signingAzureKeyVaultClientId: '$(SigningAzureKeyVaultClientId)'
signingAzureKeyVaultClientSecret: '$(SigningAzureKeyVaultClientSecret)'
signingCertName: '$(SigningCertName)'
- task: PublishApp@0
displayName: 'Publish & Install'
inputs:
schemaUpdateMode: 'Synchronize'
- task: RunBcTests@0
displayName: 'Run Tests'
- task: PublishTestResults@2
displayName: 'Publish Test Results'
inputs:
testResultsFormat: XUnit
testResultsFiles: TestResults.xml
failTaskOnFailedTests: true
- task: RemoveBcContainer@0
displayName: 'Remove BC Container'
condition: always()
Tasks
Each task wraps exactly one businessdev.ALbuild cmdlet.
Free-of-license tasks
Available to everyone — no license required.
Task (name@version) |
Purpose |
Cmdlet |
GetBcArtifact@0 |
Resolve the BC artifact URL |
Find-BcArtifactUrl |
StampBuildVersion@0 |
Version app.json and claim a build branch (parallel-safe) |
Invoke-BcBuildVersionStamp |
CreateBcContainer@0 |
Create the build container |
New-BcContainer |
CreateBcContainerUser@0 |
Create a container user |
New-BcContainerUser |
InstallTestToolkit@0 |
Install the test toolkit |
Install-BcContainerTestToolkit |
ResolveDependencies@0 |
Resolve dependencies to .alpackages (NuGet / Universal / local) |
Resolve-BcDependencies |
GetUniversalPackage@0 |
Download a named Universal-feed package |
Get-BcUniversalPackage |
ImportConfigPackage@0 |
Import a .rapidstart configuration package |
Import-BcConfigurationPackage |
InstallBc365App@0 |
Install 365 business development app(s) |
Install-Bc365App |
CompileApp@0 |
Compile the AL app (container or container-less) |
Invoke-BcCompiler |
CheckTranslations@0 |
Validate XLIFF translations |
Test-BcTranslation |
SignBcApp@0 |
Sign the .app via Azure Key Vault |
Invoke-BcAppSigning |
PublishApp@0 |
Publish, sync and install the app to a container |
Publish-BcContainerApp |
RunBcTests@0 |
Run AL tests and emit JUnit / XUnit results |
Invoke-BcContainerTest |
PublishTestinyResults@0 |
Push test results to testiny.io |
Publish-BcTestinyResult |
RemoveBcContainer@0 |
Remove the build container |
Remove-BcContainer |
PublishPackage@0 |
Push a NuGet package to a feed |
Publish-BcPackage |
Licensed tasks
Deployment tasks that require a valid ALbuild license for your Azure DevOps organization — see
Pricing.
Task (name@version) |
Purpose |
Cmdlet |
PublishPerTenantExtension@0 |
Deploy a Per-Tenant Extension (PTE) to BC online |
Publish-BcPerTenantExtension |
PublishOnPremApp@0 |
Publish and install on a Business Central On-Premises environment |
Publish-BcOnPremApp |
PublishDevExtension@0 |
Publish an app to a development (Dev) endpoint |
Publish-BcDevExtension |
SubmitMarketplace@0 |
Submit an app to Microsoft Marketplace (AppSource) |
Submit-BcMarketplaceApp |
BuildRuntimePackages@0 |
Build runtime packages per platform version |
Build-BcRuntimePackages |
The license check runs only on entry to a licensed task. If no valid license is found, the task
fails with clear remediation guidance. Free-of-license tasks never perform a license check.
Migrating from ALbuild V1
To keep existing pipelines running, the extension also ships the ALbuild V1 tasks
(CreateBuildContainer, Compile, Install, AppVersioning, SignApp, ReleaseAppSource, …).
They keep their original name, version and inputs, reproduce the V1 behaviour on top of the
businessdev.ALbuild module, and emit a deprecation warning while still succeeding.
The V1 tasks are frozen — they will not receive new features or fixes. Migrate to the new tasks
at your own pace to benefit from ongoing improvements.
Support
For questions, issues, or contributions, visit our
GitHub repository.
Thank you for choosing ALbuild for your AL development and build pipelines.