In preparation for a What’s New webinar (organized by COSMO CONSULT) I wanted to compare the code of BC19 with BC20. This task is a challenge for most comparison tools. However, not for the GIT comparison tools which are integrated in Azure DevOps.
I had the idea to generate a pipeline which copies the current code from BC into a GIT repo.
Get the current code of Business Central
The first challenge was to find a way to access the current code via Powershell.
For this challenge I used the Get-ArtifactUrl function of Azure DevOps
- task: PowerShell@2 inputs: targetType: 'inline' script: | $artifact = Get-BCArtifactUrl -type $(type) -country $(country) -select $(select) Write-Host Download Artifact $artifact $ProgressPreference = 'SilentlyContinue' Invoke-WebRequest -Uri $artifact -OutFile artifact.zip Write-Host Expand Archive $artifact Expand-Archive -Path artifact.zip -DestinationPath $(Pipeline.Workspace)\artifact displayName: Get BC Artifact - task: PowerShell@2 inputs: targetType: 'inline' script: | Write-Host Expand Archive $artifact Expand-Archive -Path "$(Pipeline.Workspace)\artifact\Applications\BaseApp\Source\Base Application.Source.zip" -DestinationPath $(Pipeline.Workspace)\BC\BaseApp displayName: Expand Base App
Commit the code to a GIT repo
To commit the code you need to first check it out with
- checkout: BC clean: true path: BC persistCredentials: true
And then add all files and commit
- task: PowerShell@2 inputs: targetType: 'inline' script: | Write-Host Update Repo BCVersion Comparison $artifact $appJson = Get-Content $(Pipeline.Workspace)\BC\BaseApp\app.json | ConvertFrom-Json cd $(Pipeline.Workspace)\BC git config --global user.email "pipeline@cosmoconsult.com" git config --global user.name "CI Test Pipeline" git add * git commit -m "Update Version $appJson.Version" git push -u origin master git tag $appJson.Version git push -u origin $appJson.Version displayName: Update Repo
Compare the Version
Using the Pipeline now we have created a tag for the current BC Version

The whole pipeline
The pipeline also includes a schedule and a job to start my build agent via Azure API. For security reasons I removed the subscription ID and the name of the virtual machine. To use the API you also need to add a service connection
schedules: - cron: 0 0 * * Sun branches: include: - master trigger: none variables: - name: country value: at - name: type value: OnPrem - name: select value: latest resources: repositories: - repository: BC type: git name: BCVersionComparison jobs: - job: StartVM pool: server steps: - task: InvokeRESTAPI@1 inputs: connectionType: "connectedServiceNameARM" azureServiceConnection: "Azure" method: "POST" urlSuffix: "subscriptions/{subscriptionid}/resourceGroups/AzureDevOps/providers/Microsoft.Compute/virtualMachines/{VMName}/start?api-version=2020-12-01" waitForCompletion: "false" displayName: Start Agent - job: UpdateRepo pool: default workspace: clean: all steps: - checkout: self clean: true path: CI persistCredentials: true - checkout: BC clean: true path: BC persistCredentials: true - task: PowerShell@2 inputs: targetType: 'inline' script: | Install-Module BCContainerHelper -Scope CurrentUser -Force Import-Module BCContainerHelper -Force displayName: Import BCContainerHelper - task: PowerShell@2 inputs: targetType: 'inline' script: | $artifact = Get-BCArtifactUrl -type $(type) -country $(country) -select $(select) Write-Host Download Artifact $artifact $ProgressPreference = 'SilentlyContinue' Invoke-WebRequest -Uri $artifact -OutFile artifact.zip Write-Host Expand Archive $artifact Expand-Archive -Path artifact.zip -DestinationPath $(Pipeline.Workspace)\artifact displayName: Get BC Artifact - task: PowerShell@2 inputs: targetType: 'inline' script: | cd $(Pipeline.Workspace)\BC git checkout master Remove-Item -Recurse $(Pipeline.Workspace)\BC\* -Exclude .git displayName: Cleanup Repo - task: PowerShell@2 inputs: targetType: 'inline' script: | Write-Host Expand Archive $artifact Expand-Archive -Path "$(Pipeline.Workspace)\artifact\Applications\BaseApp\Source\Base Application.Source.zip" -DestinationPath $(Pipeline.Workspace)\BC\BaseApp displayName: Expand Base App - task: PowerShell@2 inputs: targetType: 'inline' script: | Write-Host Update Repo BCVersion Comparison $artifact $appJson = Get-Content $(Pipeline.Workspace)\BC\BaseApp\app.json | ConvertFrom-Json cd $(Pipeline.Workspace)\BC git config --global user.email "pipeline@cosmoconsult.com" git config --global user.name "CI Test Pipeline" git add * git commit -m "Update Version $appJson.Version" git push -u origin master git tag $appJson.Version git push -u origin $appJson.Version displayName: Update Repo