The goal of this post is to demo from start to finish the automated build and test of an AL solution for Microsoft Dynamics 365 Business Central.
About the build steps
All build steps are execute in the same way. In the folder ‘C:\AdvaniaGIT\Scripts’ the script ‘Start-CustomAction.ps1’ is executed with parameters.
param ( [Parameter(Mandatory=$False, ValueFromPipelineByPropertyname=$true)] [String]$Repository = (Get-Location).Path, [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName=$true)] [String]$ScriptName, [Parameter(Mandatory=$False, ValueFromPipelineByPropertyName=$true)] [String]$InAdminMode='$false', [Parameter(Mandatory=$False, ValueFromPipelineByPropertyName=$true)] [String]$Wait='$false', [Parameter(Mandatory=$False, ValueFromPipelineByPropertyName=$true)] [HashTable]$BuildSettings )
The AdvaniaGIT custom action is executed in the same way from a build machine and from a development machine.
When we created the container in our last post from Visual Studio Code with the command (Ctrl+Shift+P) ‘Build NAV Environment’, Visual Studio Code executed
Start-AdvaniaGITAction -Repository c:\Users\navlightadmin\businesscentral -ScriptName "Build-NavEnvironment.ps1" -Wait $false
From the build task we execute ‘C:\AdvaniaGIT\Scripts\Start-CustomAction.ps1’ with these parameters
-ScriptName Build-NavEnvironment.ps1 -Repository $(System.DefaultWorkingDirectory) -BuildSettings @{BuildMode=$true}
We can see that these commands are almost the same. We have the one additional parameter in the build script to notify the scripts that we are in Build Mode.
Each AdvaniaGIT build or development machine has a ‘C:\AdvaniaGIT\Data\GITSettings.Json’ configuration file.
When the scripts are started this file is read and all the settings imported. Then the repository setup file is imported. The default repository setup file is ‘setup.json’ as stated in GIT settings. If the same parameters are in both the machine settings and in the repository settings then the repository settings are used.
The same structure is used for the ‘BuildSettings’ parameter that can be passed to the custom action. The build settings will overwrite the same parameter in both the machine settings and the repository settings.
The default settings are built around the folder structure that I like to use. For example, we have our C/AL objects in the ‘Objects’ folder. Microsoft has their objects in then ‘BaseApp’ folder. Just by adding the ‘objectsPath’ parameter to the repository settings for the Microsoft repository I can use their structure without problems.
If I wan’t to execute the same exact functionality in Visual Studio Code as I expect to get from my build script I can add the ‘BuildSettings’ parameter to the command.
Start-AdvaniaGITAction -Repository c:\Users\navlightadmin\businesscentral -ScriptName "Build-NavEnvironment.ps1" -Wait $false -BuildSettings @{BuildMode=$true}
The folder structure
The structure is defined in settings files. By default I have the ‘AL’ folder for the main project and the ‘ALTests’ folder for the test project. Example can be seen in the G/L Source Names repository.
In C/AL we are using deltas and using the build server to merge our solutions to a single solution. Therefore we have a single repository for a single NAV version and put our solutions and customization into branches.
In AL this is no longer needed. We can have a dedicated repository for each solution if we like to, since the scripts will not be doing any merge between branches.