├── .AL-Go ├── cloudDevEnv.ps1 ├── localDevEnv.ps1 └── settings.json ├── .github ├── AL-Go-Settings.json ├── RELEASENOTES.copy.md ├── Test Current.settings.json ├── Test Next Major.settings.json ├── Test Next Minor.settings.json └── workflows │ ├── AddExistingAppOrTestApp.yaml │ ├── CICD.yaml │ ├── CreateApp.yaml │ ├── CreateOnlineDevelopmentEnvironment.yaml │ ├── CreatePerformanceTestApp.yaml │ ├── CreateRelease.yaml │ ├── CreateTestApp.yaml │ ├── Current.yaml │ ├── DeployReferenceDocumentation.yaml │ ├── IncrementVersionNumber.yaml │ ├── NextMajor.yaml │ ├── NextMinor.yaml │ ├── PublishToAppSource.yaml │ ├── PublishToEnvironment.yaml │ ├── PullRequestHandler.yaml │ ├── Troubleshooting.yaml │ ├── UpdateGitHubGoSystemFiles.yaml │ └── _BuildALGoProject.yaml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── SECURITY.md ├── SUPPORT.md └── al.code-workspace /.AL-Go/cloudDevEnv.ps1: -------------------------------------------------------------------------------- 1 | # 2 | # Script for creating cloud development environment 3 | # Please do not modify this script as it will be auto-updated from the AL-Go Template 4 | # Recommended approach is to use as is or add a script (freddyk-devenv.ps1), which calls this script with the user specific parameters 5 | # 6 | Param( 7 | [string] $environmentName = "", 8 | [bool] $reuseExistingEnvironment, 9 | [switch] $fromVSCode, 10 | [switch] $clean 11 | ) 12 | 13 | $errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 14 | 15 | function DownloadHelperFile { 16 | param( 17 | [string] $url, 18 | [string] $folder 19 | ) 20 | 21 | $prevProgressPreference = $ProgressPreference; $ProgressPreference = 'SilentlyContinue' 22 | $name = [System.IO.Path]::GetFileName($url) 23 | Write-Host "Downloading $name from $url" 24 | $path = Join-Path $folder $name 25 | Invoke-WebRequest -UseBasicParsing -uri $url -OutFile $path 26 | $ProgressPreference = $prevProgressPreference 27 | return $path 28 | } 29 | 30 | try { 31 | Clear-Host 32 | Write-Host 33 | Write-Host -ForegroundColor Yellow @' 34 | _____ _ _ _____ ______ 35 | / ____| | | | | __ \ | ____| 36 | | | | | ___ _ _ __| | | | | | _____ __ |__ _ ____ __ 37 | | | | |/ _ \| | | |/ _` | | | | |/ _ \ \ / / __| | '_ \ \ / / 38 | | |____| | (_) | |_| | (_| | | |__| | __/\ V /| |____| | | \ V / 39 | \_____|_|\___/ \__,_|\__,_| |_____/ \___| \_/ |______|_| |_|\_/ 40 | 41 | '@ 42 | 43 | $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" 44 | New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null 45 | $GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder 46 | $ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder 47 | DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null 48 | 49 | Import-Module $GitHubHelperPath 50 | . $ALGoHelperPath -local 51 | 52 | $baseFolder = GetBaseFolder -folder $PSScriptRoot 53 | $project = GetProject -baseFolder $baseFolder -projectALGoFolder $PSScriptRoot 54 | 55 | Write-Host @' 56 | 57 | This script will create a cloud based development environment (Business Central SaaS Sandbox) for your project. 58 | All apps and test apps will be compiled and published to the environment in the development scope. 59 | The script will also modify launch.json to have a "Cloud Sandbox ()" configuration point to your environment. 60 | 61 | '@ 62 | 63 | if (Test-Path (Join-Path $PSScriptRoot "NewBcContainer.ps1")) { 64 | Write-Host -ForegroundColor Red "WARNING: The project has a NewBcContainer override defined. Typically, this means that you cannot run a cloud development environment" 65 | } 66 | 67 | Write-Host 68 | 69 | if (-not $environmentName) { 70 | $environmentName = Enter-Value ` 71 | -title "Environment name" ` 72 | -question "Please enter the name of the environment to create" ` 73 | -default "$($env:USERNAME)-sandbox" ` 74 | -trimCharacters @('"',"'",' ') 75 | } 76 | 77 | if ($PSBoundParameters.Keys -notcontains 'reuseExistingEnvironment') { 78 | $reuseExistingEnvironment = (Select-Value ` 79 | -title "What if the environment already exists?" ` 80 | -options @{ "Yes" = "Reuse existing environment"; "No" = "Recreate environment" } ` 81 | -question "Select behavior" ` 82 | -default "No") -eq "Yes" 83 | } 84 | 85 | CreateDevEnv ` 86 | -kind cloud ` 87 | -caller local ` 88 | -environmentName $environmentName ` 89 | -reuseExistingEnvironment:$reuseExistingEnvironment ` 90 | -baseFolder $baseFolder ` 91 | -project $project ` 92 | -clean:$clean 93 | } 94 | catch { 95 | Write-Host -ForegroundColor Red "Error: $($_.Exception.Message)`nStacktrace: $($_.scriptStackTrace)" 96 | } 97 | finally { 98 | if ($fromVSCode) { 99 | Read-Host "Press ENTER to close this window" 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /.AL-Go/localDevEnv.ps1: -------------------------------------------------------------------------------- 1 | # 2 | # Script for creating local development environment 3 | # Please do not modify this script as it will be auto-updated from the AL-Go Template 4 | # Recommended approach is to use as is or add a script (freddyk-devenv.ps1), which calls this script with the user specific parameters 5 | # 6 | Param( 7 | [string] $containerName = "", 8 | [ValidateSet("UserPassword", "Windows")] 9 | [string] $auth = "", 10 | [pscredential] $credential = $null, 11 | [string] $licenseFileUrl = "", 12 | [switch] $fromVSCode, 13 | [switch] $accept_insiderEula, 14 | [switch] $clean 15 | ) 16 | 17 | $errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 18 | 19 | function DownloadHelperFile { 20 | param( 21 | [string] $url, 22 | [string] $folder 23 | ) 24 | 25 | $prevProgressPreference = $ProgressPreference; $ProgressPreference = 'SilentlyContinue' 26 | $name = [System.IO.Path]::GetFileName($url) 27 | Write-Host "Downloading $name from $url" 28 | $path = Join-Path $folder $name 29 | Invoke-WebRequest -UseBasicParsing -uri $url -OutFile $path 30 | $ProgressPreference = $prevProgressPreference 31 | return $path 32 | } 33 | 34 | try { 35 | Clear-Host 36 | Write-Host 37 | Write-Host -ForegroundColor Yellow @' 38 | _ _ _____ ______ 39 | | | | | | __ \ | ____| 40 | | | ___ ___ __ _| | | | | | _____ __ |__ _ ____ __ 41 | | | / _ \ / __/ _` | | | | | |/ _ \ \ / / __| | '_ \ \ / / 42 | | |____ (_) | (__ (_| | | | |__| | __/\ V /| |____| | | \ V / 43 | |______\___/ \___\__,_|_| |_____/ \___| \_/ |______|_| |_|\_/ 44 | 45 | '@ 46 | 47 | $tmpFolder = Join-Path ([System.IO.Path]::GetTempPath()) "$([Guid]::NewGuid().ToString())" 48 | New-Item -Path $tmpFolder -ItemType Directory -Force | Out-Null 49 | $GitHubHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Github-Helper.psm1' -folder $tmpFolder 50 | $ALGoHelperPath = DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1' -folder $tmpFolder 51 | DownloadHelperFile -url 'https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/Packages.json' -folder $tmpFolder | Out-Null 52 | 53 | Import-Module $GitHubHelperPath 54 | . $ALGoHelperPath -local 55 | 56 | $baseFolder = GetBaseFolder -folder $PSScriptRoot 57 | $project = GetProject -baseFolder $baseFolder -projectALGoFolder $PSScriptRoot 58 | 59 | Write-Host @' 60 | 61 | This script will create a docker based local development environment for your project. 62 | 63 | NOTE: You need to have Docker installed, configured and be able to create Business Central containers for this to work. 64 | If this fails, you can setup a cloud based development environment by running cloudDevEnv.ps1 65 | 66 | All apps and test apps will be compiled and published to the environment in the development scope. 67 | The script will also modify launch.json to have a Local Sandbox configuration point to your environment. 68 | 69 | '@ 70 | 71 | $settings = ReadSettings -baseFolder $baseFolder -project $project -userName $env:USERNAME -workflowName 'localDevEnv' 72 | 73 | Write-Host "Checking System Requirements" 74 | $dockerProcess = (Get-Process "dockerd" -ErrorAction Ignore) 75 | if (!($dockerProcess)) { 76 | Write-Host -ForegroundColor Red "Dockerd process not found. Docker might not be started, not installed or not running Windows Containers." 77 | } 78 | if ($settings.keyVaultName) { 79 | if (-not (Get-Module -ListAvailable -Name 'Az.KeyVault')) { 80 | Write-Host -ForegroundColor Red "A keyvault name is defined in Settings, you need to have the Az.KeyVault PowerShell module installed (use Install-Module az) or you can set the keyVaultName to an empty string in the user settings file ($($ENV:UserName).settings.json)." 81 | } 82 | } 83 | 84 | Write-Host 85 | 86 | if (-not $containerName) { 87 | $containerName = Enter-Value ` 88 | -title "Container name" ` 89 | -question "Please enter the name of the container to create" ` 90 | -default "bcserver" ` 91 | -trimCharacters @('"',"'",' ') 92 | } 93 | 94 | if (-not $auth) { 95 | $auth = Select-Value ` 96 | -title "Authentication mechanism for container" ` 97 | -options @{ "Windows" = "Windows Authentication"; "UserPassword" = "Username/Password authentication" } ` 98 | -question "Select authentication mechanism for container" ` 99 | -default "UserPassword" 100 | } 101 | 102 | if (-not $credential) { 103 | if ($auth -eq "Windows") { 104 | $credential = Get-Credential -Message "Please enter your Windows Credentials" -UserName $env:USERNAME 105 | $CurrentDomain = "LDAP://" + ([ADSI]"").distinguishedName 106 | $domain = New-Object System.DirectoryServices.DirectoryEntry($CurrentDomain,$credential.UserName,$credential.GetNetworkCredential().password) 107 | if ($null -eq $domain.name) { 108 | Write-Host -ForegroundColor Red "Unable to verify your Windows Credentials, you might not be able to authenticate to your container" 109 | } 110 | } 111 | else { 112 | $credential = Get-Credential -Message "Please enter username and password for your container" -UserName "admin" 113 | } 114 | } 115 | 116 | if (-not $licenseFileUrl) { 117 | if ($settings.type -eq "AppSource App") { 118 | $description = "When developing AppSource Apps for Business Central versions prior to 22, your local development environment needs the developer licensefile with permissions to your AppSource app object IDs" 119 | $default = "none" 120 | } 121 | else { 122 | $description = "When developing PTEs, you can optionally specify a developer licensefile with permissions to object IDs of your dependant apps" 123 | $default = "none" 124 | } 125 | 126 | $licenseFileUrl = Enter-Value ` 127 | -title "LicenseFileUrl" ` 128 | -description $description ` 129 | -question "Local path or a secure download URL to license file " ` 130 | -default $default ` 131 | -doNotConvertToLower ` 132 | -trimCharacters @('"',"'",' ') 133 | } 134 | 135 | if ($licenseFileUrl -eq "none") { 136 | $licenseFileUrl = "" 137 | } 138 | 139 | CreateDevEnv ` 140 | -kind local ` 141 | -caller local ` 142 | -containerName $containerName ` 143 | -baseFolder $baseFolder ` 144 | -project $project ` 145 | -auth $auth ` 146 | -credential $credential ` 147 | -licenseFileUrl $licenseFileUrl ` 148 | -accept_insiderEula:$accept_insiderEula ` 149 | -clean:$clean 150 | } 151 | catch { 152 | Write-Host -ForegroundColor Red "Error: $($_.Exception.Message)`nStacktrace: $($_.scriptStackTrace)" 153 | } 154 | finally { 155 | if ($fromVSCode) { 156 | Read-Host "Press ENTER to close this window" 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /.AL-Go/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "country": "us", 3 | "appSourceCopMandatoryAffixes": [ 4 | "" 5 | ], 6 | "appFolders": [], 7 | "testFolders": [], 8 | "bcptTestFolders": [] 9 | } 10 | -------------------------------------------------------------------------------- /.github/AL-Go-Settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "AppSource App", 3 | "templateUrl": "https://github.com/microsoft/AL-Go-AppSource@preview", 4 | "templateSha": "1cd8a0d944c5c5e40d954f2d807a55deb375afc4" 5 | } 6 | -------------------------------------------------------------------------------- /.github/RELEASENOTES.copy.md: -------------------------------------------------------------------------------- 1 | ## preview 2 | 3 | Note that when using the preview version of AL-Go for GitHub, we recommend you Update your AL-Go system files, as soon as possible when informed that an update is available. 4 | 5 | ### Issues 6 | 7 | - Issue 1241 Increment Version Number might produce wrong app.json 8 | - `deployTo` now has an additional property called DependencyInstallMode, which determines how dependencies are deployed if GenerateDependencyArtifact is true. Default value is `install` to install dependencies if not already installed. Other values are `ignore` for ignoring dependencies, `upgrade` for upgrading dependencies if possible and `forceUpgrade` for force upgrading dependencies. 9 | 10 | ### New Project Settings 11 | 12 | - `pageScriptingTests` should be an array of page scripting test file specifications, relative to the AL-Go project. Examples of file specifications: `recordings/my*.yml` (for all yaml files in the recordings subfolder matching my\*.yml), `recordings` (for all \*.yml files in the recordings subfolder) or `recordings/test.yml` (for a single yml file) 13 | - `doNotRunPageScriptingTests` can force the pipeline to NOT run the page scripting tests specified in pageScriptingTests. Note this setting can be set in a [workflow specific settings file](#where-are-the-settings-located) to only apply to that workflow 14 | - `restoreDatabases` should be an array of events, indicating when you want to start with clean databases in the container. Possible events are: `BeforeBcpTests`, `BeforePageScriptingTests`, `BeforeEachTestApp`, `BeforeEachBcptTestApp`, `BeforeEachPageScriptingTest` 15 | 16 | ### New Repository Settings 17 | 18 | - `trustedSigning` is a structure defining `Account`, `EndPoint` and `CertificateProfile` if you want to use trusted signing. Note that your Azure_Credentials secret (Microsoft Entra ID App or Managed identity) still needs to provide access to your azure subscription and be assigned the `Trusted Signing Certificate Profile Signer` role in the Trusted Signing Account. 19 | 20 | ### Support for Azure Trusted Signing 21 | 22 | Read https://learn.microsoft.com/en-us/azure/trusted-signing/ for more information about Trusted Signing and how to set it up. After setting up your trusted signing account and certificate profile, you need to create a setting called [trustedSigning](https://aka.ms/algosettings#trustedSigning) for AL-Go to sign your apps using Azure Trusted Signing. 23 | 24 | ### Support for Page Scripting Tests 25 | 26 | Page Scripting tests are now supported as part of CI/CD. By specifying pageScriptingTests in your project settings file, AL-Go for GitHub will automatically run these page scripting tests as part of your CI/CD workflow, generating the following build artifacts: 27 | 28 | - `PageScriptingTestResults` is a JUnit test results file with all results combined. 29 | - `PageScriptingTestResultDetails` are the detailed test results (including videos) when any of the page scripting tests have failures. If the page scripting tests succeed - the details are not published. 30 | 31 | ## v6.0 32 | 33 | ### Issues 34 | 35 | - Issue 1184 Publish to Environment fails on 'Permission Denied' 36 | - AL Language extension in 25.0 doesn't contain the linux executable, use dotnet to invoke the dll instead. 37 | 38 | ### New Settings 39 | 40 | - `deliverTo` now has an additional property called `ContinuousDelivery`, indicating whether or not to run continuous delivery to this deliveryTarget. Default is true. 41 | - `trustMicrosoftNuGetFeeds` Unless this setting is set to false, AL-Go for GitHub will trust the NuGet feeds provided by Microsoft. The feeds provided by Microsoft contains all Microsoft apps, all Microsoft symbols and symbols for all AppSource apps. 42 | - `trustedNuGetFeeds` - can be an array of NuGet feed specifications, which AL-Go for GitHub will use for dependency resolution. Every feed specification must include a URL property and can optionally include a few other properties: 43 | - url - The URL of the feed (examples: https://pkgs.dev.azure.com/myorg/apps/\_packaging/myrepo/nuget/v3/index.json or https://nuget.pkg.github.com/mygithuborg/index.json"). 44 | - patterns - AL-Go for GitHub will only trust packages, where the ID matches this pattern. Default is all packages (\*). 45 | - fingerprints - If specified, AL-Go for GitHub will only trust packages signed with a certificate with a fingerprint matching one of the fingerprints in this array. 46 | - authTokenSecret - If the NuGet feed specified by URL is private, the authTokenSecret must be the name of a secret containing the authentication token with permissions to search and read packages from the NuGet feed. 47 | 48 | ### Support for delivering to GitHub Packages and NuGet 49 | 50 | With this release the implementation for delivering to NuGet packages (by adding the NuGetContext secret), is similar to the functionality behind delivering to GitHub packages and the implementation is no longer in preview. 51 | 52 | ### Allow GitHubRunner and GitHubRunnerShell as project settings 53 | 54 | Previously, AL-Go required the GitHubRunner and GitHubRunnerShell settings to be set on repository level. This has now been changed such that they can be set on project level. 55 | 56 | ## v5.3 57 | 58 | ### Issues 59 | 60 | - Issue 1105 Increment Version Number - repoVersion in .github/AL-Go-Settings.json is not updated 61 | - Issue 1073 Publish to AppSource - Automated validation: failure 62 | - Issue 980 Allow Scope to be PTE in continuousDeployment for PTE extensions in Sandbox (enhancement request) 63 | - Issue 1079 AppSource App deployment failes with PerTenantExtensionCop Error PTE0001 and PTE0002 64 | - Issue 866 Accessing GitHub Environment Variables in DeployToCustom Scenarios for PowerShell Scripts 65 | - Issue 1083 SyncMode for custom deployments? 66 | - Issue 1109 Why filter deployment settings? 67 | - Fix issue with github ref when running reusable workflows 68 | - Issue 1098 Support for specifying the name of the AZURE_CREDENTIALS secret by adding a AZURE_CREDENTIALSSecretName setting 69 | - Fix placeholder syntax for git ref in PullRequestHandler.yaml 70 | - Issue 1164 Getting secrets from Azure key vault fails in Preview 71 | 72 | ### Dependencies to PowerShell modules 73 | 74 | AL-Go for GitHub relies on specific PowerShell modules, and the minimum versions required for these modules are tracked in [Packages.json](https://raw.githubusercontent.com/microsoft/AL-Go/main/Actions/Packages.json) file. Should the installed modules on the GitHub runner not meet these minimum requirements, the necessary modules will be installed as needed. 75 | 76 | ### Support managed identities and federated credentials 77 | 78 | All authentication context secrets now supports managed identities and federated credentials. See more [here](Scenarios/secrets.md). Furthermore, you can now use https://aka.ms/algosecrets#authcontext to learn more about the formatting of that secret. 79 | 80 | ### Business Central Performance Toolkit Test Result Viewer 81 | 82 | In the summary after a Test Run, you now also have the result of performance tests. 83 | 84 | ### Support Ubuntu runners for all AL-Go workflows 85 | 86 | Previously, the workflows "Update AL-Go System Files" and "TroubleShooting" were hardcoded to always run on `windows-latest` to prevent deadlocks and security issues. 87 | From now on, `ubuntu-lates` will also be allowed for these mission critical workflows, when changing the `runs-on` setting. Additionally, only the value `pwsh` for `shell` setting is allowed when using `ubuntu-latest` runners. 88 | 89 | ### Updated AL-Go telemetry 90 | 91 | AL-Go for GitHub now includes a new telemetry module. For detailed information on how to enable or disable telemetry and to see what data AL-Go logs, check out [this article](https://github.com/microsoft/AL-Go/blob/main/Scenarios/EnablingTelemetry.md). 92 | 93 | ### New Settings 94 | 95 | - `deployTo`: is not really new, but has a new property: 96 | 97 | - **Scope** = specifies the scope of the deployment: Dev, PTE. If not specified, AL-Go for GitHub will always use the Dev Scope for AppSource Apps, but also for PTEs when deploying to sandbox environments when impersonation (refreshtoken) is used for authentication. 98 | - **BuildMode** = specifies which buildMode to use for the deployment. Default is to use the Default buildMode. 99 | - **\** = custom properties are now supported and will be transferred to a custom deployment script in the hashtable. 100 | 101 | - `bcptThresholds` is a JSON object with properties for the default thresholds for the Business Central Performance Toolkit 102 | 103 | - **DurationWarning** - a warning is issued if the duration of a bcpt test degrades more than this percentage (default 10) 104 | - **DurationError** - an error is issued if the duration of a bcpt test degrades more than this percentage (default 25) 105 | - **NumberOfSqlStmtsWarning** - a warning is issued if the number of SQL statements from a bcpt test increases more than this percentage (default 5) 106 | - **NumberOfSqlStmtsError** - an error is issued if the number of SQL statements from a bcpt test increases more than this percentage (default 10) 107 | 108 | > \[!NOTE\] 109 | > Duration thresholds are subject to varying results depending on the performance of the agent running the tests. Number of SQL statements executed by a test is often the most reliable indicator of performance degredation. 110 | 111 | ## v5.2 112 | 113 | ### Issues 114 | 115 | - Issue 1084 Automatic updates for AL-Go are failing when main branch requires Pull Request 116 | 117 | ### New Settings 118 | 119 | - `PowerPlatformSolutionFolder`: Contains the name of the folder containing a PowerPlatform Solution (only one) 120 | - `DeployTo` now has two additional properties `companyId` is the Company Id from Business Central (for PowerPlatform connection) and `ppEnvironmentUrl` is the Url of the PowerPlatform environment to deploy to. 121 | 122 | ### New Actions 123 | 124 | - `BuildPowerPlatform`: to build a PowerPlatform Solution 125 | - `DeployPowerPlatform`: to deploy a PowerPlatform Solution 126 | - `PullPowerPlatformChanges`: to pull changes made in PowerPlatform studio into the repository 127 | - `ReadPowerPlatformSettings`: to read settings and secrets for PowerPlatform deployment 128 | - `GetArtifactsForDeployment`: originally code from deploy.ps1 to retrieve artifacts for releases or builds - now as an action to read apps into a folder. 129 | 130 | ### New Workflows 131 | 132 | - **Pull PowerPlatform Changes** for pulling changes from your PowerPlatform development environment into your AL-Go for GitHub repository 133 | - **Push PowerPlatform Changes** for pushing changes from your AL-Go for GitHub repository to your PowerPlatform development environment 134 | 135 | > \[!NOTE\] 136 | > PowerPlatform workflows are only available in the PTE template and will be removed if no PowerPlatformSolutionFolder is defined in settings. 137 | 138 | ### New Scenarios (Documentation) 139 | 140 | - [Connect your GitHub repository to Power Platform](https://github.com/microsoft/AL-Go/blob/main/Scenarios/SetupPowerPlatform.md) 141 | - [How to set up Service Principal for Power Platform](https://github.com/microsoft/AL-Go/blob/main/Scenarios/SetupServicePrincipalForPowerPlatform.md) 142 | - [Try one of the Business Central and Power Platform samples](https://github.com/microsoft/AL-Go/blob/main/Scenarios/TryPowerPlatformSamples.md) 143 | - [Publish To AppSource](https://github.com/microsoft/AL-Go/blob/main/Scenarios/PublishToAppSource.md) 144 | 145 | > \[!NOTE\] 146 | > PowerPlatform functionality are only available in the PTE template. 147 | 148 | ## v5.1 149 | 150 | ### Issues 151 | 152 | - Issue 1019 CI/CD Workflow still being scheduled after it was disabled 153 | - Issue 1021 Error during Create Online Development Environment action 154 | - Issue 1022 Error querying artifacts: No such host is known. (bcartifacts-exdbf9fwegejdqak.blob.core.windows.net:443) 155 | - Issue 922 Deploy Reference Documentation (ALDoc) failed with custom 156 | - ContainerName used during build was invalid if project names contained special characters 157 | - Issue 1009 by adding a includeDependencies property in DeliverToAppSource 158 | - Issue 997 'Deliver to AppSource' action fails for projects containing a space 159 | - Issue 987 Resource not accessible by integration when creating release from specific version 160 | - Issue 979 Publish to AppSource Documentation 161 | - Issue 1018 Artifact setting - possibility to read version from app.json 162 | - Issue 1008 Allow PullRequestHandler to use ubuntu or self hosted runners for all jobs except for pregateCheck 163 | - Issue 962 Finer control of "shell"-property 164 | - Issue 1041 Harden the version comparison when incrementing version number 165 | - Issue 1042 Downloading artifacts from GitHub doesn't work with branch names which include forward slashes 166 | 167 | ### Better artifact selection 168 | 169 | The artifact setting in your project settings file can now contain a `*` instead of the version number. This means that AL-Go for GitHub will determine the application dependency for your projects together with the `applicationDependency` setting and determine which Business Central version is needed for the project. 170 | 171 | - `"artifact": "//*//latest"` will give you the latest Business Central version, higher than your application dependency and with the same major.minor as your application dependency. 172 | - `"artifact": "//*//first"` will give you the first Business Central version, higher than your application dependency and with the same major.minor as your application dependency. 173 | 174 | ### New Settings 175 | 176 | - `deliverToAppSource`: a JSON object containing the following properties 177 | - **productId** must be the product Id from partner Center. 178 | - **mainAppFolder** specifies the appFolder of the main app if you have multiple apps in the same project. 179 | - **continuousDelivery** can be set to true to enable continuous delivery of every successful build to AppSource Validation. Note that the app will only be in preview in AppSource and you will need to manually press GO LIVE in order for the app to be promoted to production. 180 | - **includeDependencies** can be set to an array of file names (incl. wildcards) which are the names of the dependencies to include in the AppSource submission. Note that you need to set `generateDependencyArtifact` in the project settings file to true in order to include dependencies. 181 | - Add `shell` as a property under `DeployTo` structure 182 | 183 | ### Deprecated Settings 184 | 185 | - `appSourceContinuousDelivery` is moved to the `deliverToAppSource` structure 186 | - `appSourceMainAppFolder` is moved to the `deliverToAppSource` structure 187 | - `appSourceProductId` is moved to the `deliverToAppSource` structure 188 | 189 | ### New parameter -clean on localdevenv and clouddevenv 190 | 191 | Adding -clean when running localdevenv or clouddevenv will create a clean development environment without compiling and publishing your apps. 192 | 193 | ## v5.0 194 | 195 | ### Issues 196 | 197 | - Issue 940 Publish to Environment is broken when specifying projects to publish 198 | - Issue 994 CI/CD ignores Deploy to GitHub Pages in private repositories 199 | 200 | ### New Settings 201 | 202 | - `UpdateALGoSystemFilesEnvironment`: The name of the environment that is referenced in job `UpdateALGoSystemFiles` in the _Update AL-Go System Files_ workflow. See [jobs.\.environment](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idenvironment) for more information. Currently, only setting the environment name is supported. 203 | 204 | ### Issues 205 | 206 | - Support release branches that start with releases/ 207 | - Issue 870 Improve Error Handling when CLI is missing 208 | - Issue 889 CreateRelease and IncrementVersionNumber workflow did not handle wild characters in `appFolders`, `testFolders` or `bcptTestFolders` settings. 209 | - Issue 973 Prerelease is not used for deployment 210 | 211 | ### Build modes 212 | 213 | AL-Go ships with Default, Translated and Clean mode out of the box. Now you can also define custom build modes in addition to the ones shipped with AL-Go. This allows you to define your own build modes, which can be used to build your apps in different ways. By default, a custom build mode will build the apps similarly to the Default mode but this behavior can be overridden in e.g. script overrides in your repository. 214 | 215 | ## v4.1 216 | 217 | ### New Settings 218 | 219 | - `templateSha`: The SHA of the version of AL-Go currently used 220 | 221 | ### New Actions 222 | 223 | - `DumpWorkflowInfo`: Dump information about running workflow 224 | - `Troubleshooting` : Run troubleshooting for repository 225 | 226 | ### Update AL-Go System Files 227 | 228 | Add another parameter when running Update AL-Go System Files, called downloadLatest, used to indicate whether to download latest version from template repository. Default value is true. 229 | If false, the templateSha repository setting is used to download specific AL-Go System Files when calculating new files. 230 | 231 | ### Issues 232 | 233 | - Issue 782 Exclude '.altestrunner/' from template .gitignore 234 | - Issue 823 Dependencies from prior build jobs are not included when using useProjectDependencies 235 | - App artifacts for version 'latest' are now fetched from the latest CICD run that completed and successfully built all the projects for the corresponding branch. 236 | - Issue 824 Utilize `useCompilerFolder` setting when creating an development environment for an AL-Go project. 237 | - Issue 828 and 825 display warnings for secrets, which might cause AL-Go for GitHub to malfunction 238 | 239 | ### New Settings 240 | 241 | - `alDoc` : JSON object with properties for the ALDoc reference document generation 242 | - **continuousDeployment** = Determines if reference documentation will be deployed continuously as part of CI/CD. You can run the **Deploy Reference Documentation** workflow to deploy manually or on a schedule. (Default false) 243 | - **deployToGitHubPages** = Determines whether or not the reference documentation site should be deployed to GitHub Pages for the repository. In order to deploy to GitHub Pages, GitHub Pages must be enabled and set to GitHub Actions. (Default true) 244 | - **maxReleases** = Maximum number of releases to include in the reference documentation. (Default 3) 245 | - **groupByProject** = Determines whether projects in multi-project repositories are used as folders in reference documentation 246 | - **includeProjects** = An array of projects to include in the reference documentation. (Default all) 247 | - **excludeProjects** = An array of projects to exclude in the reference documentation. (Default none)- 248 | - **header** = Header for the documentation site. (Default: Documentation for...) 249 | - **footer** = Footer for the documentation site. (Default: Made with...) 250 | - **defaultIndexMD** = Markdown for the landing page of the documentation site. (Default: Reference documentation...) 251 | - **defaultReleaseMD** = Markdown for the landing page of the release sites. (Default: Release reference documentation...) 252 | - *Note that in header, footer, defaultIndexMD and defaultReleaseMD you can use the following placeholders: {REPOSITORY}, {VERSION}, {INDEXTEMPLATERELATIVEPATH}, {RELEASENOTES}* 253 | 254 | ### New Workflows 255 | 256 | - **Deploy Reference Documentation** is a workflow, which you can invoke manually or on a schedule to generate and deploy reference documentation using the aldoc tool, using the ALDoc setting properties described above. 257 | - **Troubleshooting** is a workflow, which you can invoke manually to run troubleshooting on the repository and check for settings or secrets, containing illegal values. When creating issues on https://github.com/microsoft/AL-Go/issues, we might ask you to run the troubleshooter to help identify common problems. 258 | 259 | ### Support for ALDoc reference documentation tool 260 | 261 | ALDoc reference documentation tool is now supported for generating and deploying reference documentation for your projects either continuously or manually/scheduled. 262 | 263 | ## v4.0 264 | 265 | ### Removal of the InsiderSasToken 266 | 267 | As of October 1st 2023, Business Central insider builds are now publicly available. When creating local containers with the insider builds, you will have to accept the insider EULA (https://go.microsoft.com/fwlink/?linkid=2245051) in order to continue. 268 | 269 | AL-Go for GitHub allows you to build and test using insider builds without any explicit approval, but please note that the insider artifacts contains the insider Eula and you automatically accept this when using the builds. 270 | 271 | ### Issues 272 | 273 | - Issue 730 Support for external rulesets. 274 | - Issue 739 Workflow specific KeyVault settings doesn't work for localDevEnv 275 | - Using self-hosted runners while using Azure KeyVault for secrets or signing might fail with C:\\Modules doesn't exist 276 | - PullRequestHandler wasn't triggered if only .md files where changes. This lead to PRs which couldn't be merged if a PR status check was mandatory. 277 | - Artifacts names for PR Builds were using the merge branch instead of the head branch. 278 | 279 | ### New Settings 280 | 281 | - `enableExternalRulesets`: set this setting to true if you want to allow AL-Go to automatically download external references in rulesets. 282 | - `deliverTo`: is not really new, but has new properties and wasn't documented. The complete list of properties is here (note that some properties are deliveryTarget specific): 283 | - **Branches** = an array of branch patterns, which are allowed to deliver to this deliveryTarget. (Default \[ "main" \]) 284 | - **CreateContainerIfNotExist** = *\[Only for DeliverToStorage\]* Create Blob Storage Container if it doesn't already exist. (Default false) 285 | 286 | ### Deployment 287 | 288 | Environment URL is now displayed underneath the environment being deployed to in the build summary. For Custom Deployment, the script can set the GitHub Output variable `environmentUrl` in order to show a custom URL. 289 | 290 | ## v3.3 291 | 292 | ### Issues 293 | 294 | - Issue 227 Feature request: Allow deployments with "Schema Sync Mode" = Force 295 | - Issue 519 Deploying to onprem environment 296 | - Issue 520 Automatic deployment to environment with annotation 297 | - Issue 592 Internal Server Error when publishing 298 | - Issue 557 Deployment step fails when retried 299 | - After configuring deployment branches for an environment in GitHub and setting Deployment Branch Policy to **Protected Branches**, AL-Go for GitHub would fail during initialization (trying to get environments for deployment) 300 | - The DetermineDeploymentEnvironments doesn't work in private repositories (needs the GITHUB_TOKEN) 301 | - Issue 683 Settings from GitHub variables ALGoRepoSettings and ALGoOrgSettings are not applied during build pipeline 302 | - Issue 708 Inconsistent AuthTokenSecret Behavior in Multiple Projects: 'Secrets are not available' 303 | 304 | ### Breaking changes 305 | 306 | Earlier, you could specify a mapping to an environment name in an environment secret called `_EnvironmentName`, `-EnvironmentName` or just `EnvironmentName`. You could also specify the projects you want to deploy to an environment as an environment secret called `Projects`. 307 | 308 | This mechanism is no longer supported and you will get an error if your repository has these secrets. Instead you should use the `DeployTo` setting described below. 309 | 310 | Earlier, you could also specify the projects you want to deploy to an environment in a setting called `_Projects` or `-Projects`. This is also no longer supported. Instead use the `DeployTo` and remove the old settings. 311 | 312 | ### New Actions 313 | 314 | - `DetermineDeliveryTargets`: Determine which delivery targets should be used for delivering artifacts from the build job. 315 | - `DetermineDeploymentEnvironments`: Determine which deployment environments should be used for the workflow. 316 | 317 | ### New Settings 318 | 319 | - `projectName`: project setting used as friendly name for an AL-Go project, to be used in the UI for various workflows, e.g. CICD, Pull Request Build. 320 | - `fullBuildPatterns`: used by `DetermineProjectsToBuild` action to specify changes in which files and folders would trigger a full build (building all AL-Go projects). 321 | - `excludeEnvironments`: used by `DetermineDeploymentEnvironments` action to exclude environments from the list of environments considered for deployment. 322 | - `deployTo`: is not really new, but has new properties. The complete list of properties is here: 323 | - **EnvironmentType** = specifies the type of environment. The environment type can be used to invoke a custom deployment. (Default SaaS) 324 | - **EnvironmentName** = specifies the "real" name of the environment if it differs from the GitHub environment 325 | - **Branches** = an array of branch patterns, which are allowed to deploy to this environment. (Default \[ "main" \]) 326 | - **Projects** = In multi-project repositories, this property can be a comma separated list of project patterns to deploy to this environment. (Default \*) 327 | - **SyncMode** = ForceSync if deployment to this environment should happen with ForceSync, else Add. If deploying to the development endpoint you can also specify Development or Clean. (Default Add) 328 | - **ContinuousDeployment** = true if this environment should be used for continuous deployment, else false. (Default: AL-Go will continuously deploy to sandbox environments or environments, which doesn't end in (PROD) or (FAT) 329 | - **runs-on** = specifies which GitHub runner to use when deploying to this environment. (Default is settings.runs-on) 330 | 331 | ### Custom Deployment 332 | 333 | By specifying a custom EnvironmentType in the DeployTo structure for an environment, you can now add a script in the .github folder called `DeployTo.ps1`. This script will be executed instead of the standard deployment mechanism with the following parameters in a HashTable: 334 | 335 | | Parameter | Description | Example | 336 | | --------- | :--- | :--- | 337 | | `$parameters.type` | Type of delivery (CD or Release) | CD | 338 | | `$parameters.apps` | Apps to deploy | /home/runner/.../GHP-Common-main-Apps-2.0.33.0.zip | 339 | | `$parameters.EnvironmentType` | Environment type | SaaS | 340 | | `$parameters.EnvironmentName` | Environment name | Production | 341 | | `$parameters.Branches` | Branches which should deploy to this environment (from settings) | main,dev | 342 | | `$parameters.AuthContext` | AuthContext in a compressed Json structure | {"refreshToken":"mytoken"} | 343 | | `$parameters.BranchesFromPolicy` | Branches which should deploy to this environment (from GitHub environments) | main | 344 | | `$parameters.Projects` | Projects to deploy to this environment | | 345 | | `$parameters.ContinuousDeployment` | Is this environment setup for continuous deployment | false | 346 | | `$parameters."runs-on"` | GitHub runner to be used to run the deployment script | windows-latest | 347 | 348 | ### Status Checks in Pull Requests 349 | 350 | AL-Go for GitHub now adds status checks to Pull Requests Builds. In your GitHub branch protection rules, you can set up "Pull Request Status Check" to be a required status check to ensure Pull Request Builds succeed before merging. 351 | 352 | ### Secrets in AL-Go for GitHub 353 | 354 | In v3.2 of AL-Go for GitHub, all secrets requested by AL-Go for GitHub were available to all steps in a job one compressed JSON structure in env:Secrets. 355 | With this update, only the steps that actually requires secrets will have the secrets available. 356 | 357 | ## v3.2 358 | 359 | ### Issues 360 | 361 | Issue 542 Deploy Workflow fails 362 | Issue 558 CI/CD attempts to deploy from feature branch 363 | Issue 559 Changelog includes wrong commits 364 | Publish to AppSource fails if publisher name or app name contains national or special characters 365 | Issue 598 Cleanup during flush if build pipeline doesn't cleanup properly 366 | Issue 608 When creating a release, throw error if no new artifacts have been added 367 | Issue 528 Give better error messages when uploading to storage accounts 368 | Create Online Development environment workflow failed in AppSource template unless AppSourceCopMandatoryAffixes is defined in repository settings file 369 | Create Online Development environment workflow didn't have a project parameter and only worked for single project repositories 370 | Create Online Development environment workflow didn't work if runs-on was set to Linux 371 | Special characters are not supported in RepoName, Project names or other settings - Use UTF8 encoding to handle special characters in GITHUB_OUTPUT and GITHUB_ENV 372 | 373 | ### Issue 555 374 | 375 | AL-Go contains several workflows, which create a Pull Request or pushes code directly. 376 | All (except Update AL-Go System Files) earlier used the GITHUB_TOKEN to create the PR or commit. 377 | The problem using GITHUB_TOKEN is that is doesn't trigger a pull request build or a commit build. 378 | This is by design: https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#triggering-a-workflow-from-a-workflow 379 | Now, you can set the checkbox called Use GhTokenWorkflow to allowing you to use the GhTokenWorkflow instead of the GITHUB_TOKEN - making sure that workflows are triggered 380 | 381 | ### New Settings 382 | 383 | - `keyVaultCodesignCertificateName`: With this setting you can delegate the codesigning to an Azure Key Vault. This can be useful if your certificate has to be stored in a Hardware Security Module 384 | - `PullRequestTrigger`: With this setting you can set which trigger to use for Pull Request Builds. By default AL-Go will use pull_request_target. 385 | 386 | ### New Actions 387 | 388 | - `DownloadProjectDependencies`: Downloads the dependency apps for a given project and build mode. 389 | 390 | ### Settings and Secrets in AL-Go for GitHub 391 | 392 | In earlier versions of AL-Go for GitHub, all settings were available as individual environment variables to scripts and overrides, this is no longer the case. 393 | Settings were also available as one compressed JSON structure in env:Settings, this is still the case. 394 | Settings can no longer contain line breaks. It might have been possible to use line breaks earlier, but it would likely have unwanted consequences. 395 | Use `$settings = $ENV:Settings | ConvertFrom-Json` to get all settings in PowerShell. 396 | 397 | In earlier versions of AL-Go for GitHub, all secrets requested by AL-Go for GitHub were available as individual environment variables to scripts and overrides, this is no longer the case. 398 | As described in bug 647, all secrets available to the workflow were also available in env:\_Secrets, this is no longer the case. 399 | All requested secrets were also available (base64 encoded) as one compressed JSON structure in env:Secrets, this is still the case. 400 | Use `$secrets = $ENV:Secrets | ConvertFrom-Json` to get all requested secrets in PowerShell. 401 | You cannot get to any secrets that weren't requested by AL-Go for GitHub. 402 | 403 | ## v3.1 404 | 405 | ### Issues 406 | 407 | Issue #446 Wrong NewLine character in Release Notes 408 | Issue #453 DeliverToStorage - override fails reading secrets 409 | Issue #434 Use gh auth token to get authentication token instead of gh auth status 410 | Issue #501 The Create New App action will now use 22.0.0.0 as default application reference and include NoImplicitwith feature. 411 | 412 | ### New behavior 413 | 414 | The following workflows: 415 | 416 | - Create New App 417 | - Create New Test App 418 | - Create New Performance Test App 419 | - Increment Version Number 420 | - Add Existing App 421 | - Create Online Development Environment 422 | 423 | All these actions now uses the selected branch in the **Run workflow** dialog as the target for the Pull Request or Direct COMMIT. 424 | 425 | ### New Settings 426 | 427 | - `UseCompilerFolder`: Setting useCompilerFolder to true causes your pipelines to use containerless compiling. Unless you also set `doNotPublishApps` to true, setting useCompilerFolder to true won't give you any performance advantage, since AL-Go for GitHub will still need to create a container in order to publish and test the apps. In the future, publishing and testing will be split from building and there will be other options for getting an instance of Business Central for publishing and testing. 428 | - `vsixFile`: vsixFile should be a direct download URL to the version of the AL Language extension you want to use for building the project or repo. By default, AL-Go will use the AL Language extension that comes with the Business Central Artifacts. 429 | 430 | ### New Workflows 431 | 432 | - **\_BuildALGoProject** is a reusable workflow that unites the steps for building an AL-Go projects. It has been reused in the following workflows: _CI/CD_, _Pull Request Build_, _NextMinor_, _NextMajor_ and _Current_. 433 | The workflow appears under the _Actions_ tab in GitHub, but it is not actionable in any way. 434 | 435 | ### New Actions 436 | 437 | - **DetermineArtifactUrl** is used to determine which artifacts to use for building a project in CI/CD, PullRequestHandler, Current, NextMinor and NextMajor workflows. 438 | 439 | ### License File 440 | 441 | With the changes to the CRONUS license in Business Central version 22, that license can in most cases be used as a developer license for AppSource Apps and it is no longer mandatory to specify a license file in AppSource App repositories. 442 | Obviously, if you build and test your app for Business Central versions prior to 21, it will fail if you don't specify a licenseFileUrl secret. 443 | 444 | ## v3.0 445 | 446 | ### **NOTE:** When upgrading to this version 447 | 448 | When upgrading to this version form earlier versions of AL-Go for GitHub, you will need to run the _Update AL-Go System Files_ workflow twice if you have the `useProjectDependencies` setting set to _true_. 449 | 450 | ### Publish to unknown environment 451 | 452 | You can now run the **Publish To Environment** workflow without creating the environment in GitHub or settings up-front, just by specifying the name of a single environment in the Environment Name when running the workflow. 453 | Subsequently, if an AuthContext secret hasn't been created for this environment, the Device Code flow authentication will be initiated from the Publish To Environment workflow and you can publish to the new environment without ever creating a secret. 454 | Open Workflow details to get the device Code for authentication in the job summary for the initialize job. 455 | 456 | ### Create Online Dev. Environment 457 | 458 | When running the **Create Online Dev. Environment** workflow without having the _adminCenterApiCredentials_ secret created, the workflow will intiate the deviceCode flow and allow you to authenticate to the Business Central Admin Center. 459 | Open Workflow details to get the device Code for authentication in the job summary for the initialize job. 460 | 461 | ### Issues 462 | 463 | - Issue #391 Create release action - CreateReleaseBranch error 464 | - Issue 434 Building local DevEnv, downloading dependencies: Authentication fails when using "gh auth status" 465 | 466 | ### Changes to Pull Request Process 467 | 468 | In v2.4 and earlier, the PullRequestHandler would trigger the CI/CD workflow to run the PR build. 469 | Now, the PullRequestHandler will perform the build and the CI/CD workflow is only run on push (or manual dispatch) and will perform a complete build. 470 | 471 | ### Build modes per project 472 | 473 | Build modes can now be specified per project 474 | 475 | ### New Actions 476 | 477 | - **DetermineProjectsToBuild** is used to determine which projects to build in PullRequestHandler, CI/CD, Current, NextMinor and NextMajor workflows. 478 | - **CalculateArtifactNames** is used to calculate artifact names in PullRequestHandler, CI/CD, Current, NextMinor and NextMajor workflows. 479 | - **VerifyPRChanges** is used to verify whether a PR contains changes, which are not allowed from a fork. 480 | 481 | ## v2.4 482 | 483 | ### Issues 484 | 485 | - Issue #171 create a workspace file when creating a project 486 | - Issue #356 Publish to AppSource fails in multi project repo 487 | - Issue #358 Publish To Environment Action stopped working in v2.3 488 | - Issue #362 Support for EnableTaskScheduler 489 | - Issue #360 Creating a release and deploying from a release branch 490 | - Issue #371 'No previous release found' for builds on release branches 491 | - Issue #376 CICD jobs that are triggered by the pull request trigger run directly to an error if title contains quotes 492 | 493 | ### Release Branches 494 | 495 | **NOTE:** Release Branches are now only named after major.minor if the patch value is 0 in the release tag (which must be semver compatible) 496 | 497 | This version contains a number of bug fixes to release branches, to ensure that the recommended branching strategy is fully supported. Bugs fixed includes: 498 | 499 | - Release branches was named after the full tag (1.0.0), even though subsequent hotfixes released from this branch would be 1.0.x 500 | - Release branches named 1.0 wasn't picked up as a release branch 501 | - Release notes contained the wrong changelog 502 | - The previous release was always set to be the first release from a release branch 503 | - SemVerStr could not have 5 segments after the dash 504 | - Release was created on the right SHA, but the release branch was created on the wrong SHA 505 | 506 | Recommended branching strategy: 507 | 508 | ![Branching Strategy](https://raw.githubusercontent.com/microsoft/AL-Go/main/Scenarios/images/branchingstrategy.png) 509 | 510 | ### New Settings 511 | 512 | New Project setting: EnableTaskScheduler in container executing tests and when setting up local development environment 513 | 514 | ### Support for GitHub variables: ALGoOrgSettings and ALGoRepoSettings 515 | 516 | Recently, GitHub added support for variables, which you can define on your organization or your repository. 517 | AL-Go now supports that you can define a GitHub variable called ALGoOrgSettings, which will work for all repositories (with access to the variable) 518 | Org Settings will be applied before Repo settings and local repository settings files will override values in the org settings 519 | You can also define a variable called ALGoRepoSettings on the repository, which will be applied after reading the Repo Settings file in the repo 520 | Example for usage could be setup of branching strategies, versioning or an appDependencyProbingPaths to repositories which all repositories share. 521 | appDependencyProbingPaths from settings variables are merged together with appDependencyProbingPaths defined in repositories 522 | 523 | ### Refactoring and tests 524 | 525 | ReadSettings has been refactored to allow organization wide settings to be added as well. CI Tests have been added to cover ReadSettings. 526 | 527 | ## v2.3 528 | 529 | ### Issues 530 | 531 | - Issue #312 Branching enhancements 532 | - Issue #229 Create Release action tags wrong commit 533 | - Issue #283 Create Release workflow uses deprecated actions 534 | - Issue #319 Support for AssignPremiumPlan 535 | - Issue #328 Allow multiple projects in AppSource App repo 536 | - Issue #344 Deliver To AppSource on finding app.json for the app 537 | - Issue #345 LocalDevEnv.ps1 can't Dowload the file license file 538 | 539 | ### New Settings 540 | 541 | New Project setting: AssignPremiumPlan on user in container executing tests and when setting up local development environment 542 | New Repo setting: unusedALGoSystemFiles is an array of AL-Go System Files, which won't be updated during Update AL-Go System Files. They will instead be removed. Use with care, as this can break the AL-Go for GitHub functionality and potentially leave your repo no longer functional. 543 | 544 | ### Build modes support 545 | 546 | AL-Go projects can now be built in different modes, by specifying the _buildModes_ setting in AL-Go-Settings.json. Read more about build modes in the [Basic Repository settings](https://github.com/microsoft/AL-Go/blob/main/Scenarios/settings.md#basic-repository-settings). 547 | 548 | ### LocalDevEnv / CloudDevEnv 549 | 550 | With the support for PowerShell 7 in BcContainerHelper, the scripts LocalDevEnv and CloudDevEnv (placed in the .AL-Go folder) for creating development environments have been modified to run inside VS Code instead of spawning a new powershell 5.1 session. 551 | 552 | ### Continuous Delivery 553 | 554 | Continuous Delivery can now run from other branches than main. By specifying a property called branches, containing an array of branches in the deliveryContext json construct, the artifacts generated from this branch are also delivered. The branch specification can include wildcards (like release/\*). Default is main, i.e. no changes to functionality. 555 | 556 | ### Continuous Deployment 557 | 558 | Continuous Deployment can now run from other branches than main. By creating a repo setting (.github/AL-Go-Settings.json) called **`-Branches`**, which is an array of branches, which will deploy the generated artifacts to this environment. The branch specification can include wildcards (like release/\*), although this probably won't be used a lot in continuous deployment. Default is main, i.e. no changes to functionality. 559 | 560 | ### Create Release 561 | 562 | When locating artifacts for the various projects, the SHA used to build the artifact is used for the release tag 563 | If all projects are not available with the same SHA, this error is thrown: **The build selected for release doesn't contain all projects. Please rebuild all projects by manually running the CI/CD workflow and recreate the release.** 564 | There is no longer a hard dependency on the main branch name from Create Release. 565 | 566 | ### AL-Go Tests 567 | 568 | Some unit tests have been added and AL-Go unit tests can now be run directly from VS Code. 569 | Another set of end to end tests have also been added and in the documentation on contributing to AL-Go, you can see how to run these in a local fork or from VS Code. 570 | 571 | ### LF, UTF8 and JSON 572 | 573 | GitHub natively uses LF as line seperator in source files. 574 | In earlier versions of AL-Go for GitHub, many scripts and actions would use CRLF and convert back and forth. Some files were written with UTF8 BOM (Byte Order Mark), other files without and JSON formatting was done using PowerShell 5.1 (which is different from PowerShell 7). 575 | In the latest version, we always use LF as line seperator, UTF8 without BOM and JSON files are written using PowerShell 7. If you have self-hosted runners, you need to ensure that PS7 is installed to make this work. 576 | 577 | ### Experimental Support 578 | 579 | Setting the repo setting "shell" to "pwsh", followed by running Update AL-Go System Files, will cause all PowerShell code to be run using PowerShell 7 instead of PowerShell 5. This functionality is experimental. Please report any issues at https://github.com/microsoft/AL-Go/issues 580 | Setting the repo setting "runs-on" to "Ubuntu-Latest", followed by running Update AL-Go System Files, will cause all non-build jobs to run using Linux. This functionality is experimental. Please report any issues at https://github.com/microsoft/AL-Go/issues 581 | 582 | ## v2.2 583 | 584 | ### Enhancements 585 | 586 | - Container Event log is added as a build artifact if builds or tests are failing 587 | 588 | ### Issues 589 | 590 | - Issue #280 Overflow error when test result summary was too big 591 | - Issue #282, 292 AL-Go for GitHub causes GitHub to issue warnings 592 | - Issue #273 Potential security issue in Pull Request Handler in Open Source repositories 593 | - Issue #303 PullRequestHandler fails on added files 594 | - Issue #299 Multi-project repositories build all projects on Pull Requests 595 | - Issue #291 Issues with new Pull Request Handler 596 | - Issue #287 AL-Go pipeline fails in ReadSettings step 597 | 598 | ### Changes 599 | 600 | - VersioningStrategy 1 is no longer supported. GITHUB_ID has changed behavior (Issue #277) 601 | 602 | ## v2.1 603 | 604 | ### Issues 605 | 606 | - Issue #233 AL-Go for GitHub causes GitHub to issue warnings 607 | - Issue #244 Give error if AZURE_CREDENTIALS contains line breaks 608 | 609 | ### Changes 610 | 611 | - New workflow: PullRequestHandler to handle all Pull Requests and pass control safely to CI/CD 612 | - Changes to yaml files, PowerShell scripts and codeowners files are not permitted from fork Pull Requests 613 | - Test Results summary (and failed tests) are now displayed directly in the CI/CD workflow and in the Pull Request Check 614 | 615 | ### Continuous Delivery 616 | 617 | - Proof Of Concept Delivery to GitHub Packages and Nuget 618 | 619 | ## v2.0 620 | 621 | ### Issues 622 | 623 | - Issue #143 Commit Message for **Increment Version Number** workflow 624 | - Issue #160 Create local DevEnv aith appDependencyProbingPaths 625 | - Issue #156 Versioningstrategy 2 doesn't use 24h format 626 | - Issue #155 Initial Add existing app fails with "Cannot find path" 627 | - Issue #152 Error when loading dependencies from releases 628 | - Issue #168 Regression in preview fixed 629 | - Issue #189 Warnings: Resource not accessible by integration 630 | - Issue #190 PublishToEnvironment is not working with AL-Go-PTE@preview 631 | - Issue #186 AL-GO build fails for multi-project repository when there's nothing to build 632 | - When you have GitHub pages enabled, AL-Go for GitHub would try to publish to github_pages environment 633 | - Special characters wasn't supported in parameters to GitHub actions (Create New App etc.) 634 | 635 | ### Continuous Delivery 636 | 637 | - Added new GitHub Action "Deliver" to deliver build output to Storage or AppSource 638 | - Refactor CI/CD and Release workflows to use new deliver action 639 | - Custom delivery supported by creating scripts with the naming convention DeliverTo\*.ps1 in the .github folder 640 | 641 | ### AppSource Apps 642 | 643 | - New workflow: Publish to AppSource 644 | - Continuous Delivery to AppSource validation supported 645 | 646 | ### Settings 647 | 648 | - New Repo setting: CICDPushBranches can be specified as an array of branches, which triggers a CI/CD workflow on commit. Default is main', release/\*, feature/\* 649 | - New Repo setting: CICDPullRequestBranches can be specified as an array of branches, which triggers a CI/CD workflow on pull request. Default is main 650 | - New Repo setting: CICDSchedule can specify a CRONTab on when you want to run CI/CD on a schedule. Note that this will disable Push and Pull Request triggers unless specified specifically using CICDPushBranches or CICDPullRequestBranches 651 | - New Repo setting: UpdateGitHubGoSystemFilesSchedule can specify a CRONTab on when you want to Update AL-Go System Files. Note that when running on a schedule, update AL-Go system files will perfom a direct commit and not create a pull request. 652 | - New project Setting: AppSourceContext should be a compressed json structure containing authContext for submitting to AppSource. The BcContainerHelperFunction New-ALGoAppSourceContext will help you create this structure. 653 | - New project Setting: AppSourceContinuousDelivery. Set this to true in enable continuous delivery for this project to AppSource. This requires AppSourceContext and AppSourceProductId to be set as well 654 | - New project Setting: AppSourceProductId should be set to the product Id of this project in AppSource 655 | - New project Setting: AppSourceMainAppFolder. If you have multiple appFolders, this is the folder name of the main app to submit to AppSource. 656 | 657 | ### All workflows 658 | 659 | - Support 2 folder levels projects (apps\\w1, apps\\dk etc.) 660 | - Better error messages for if an error occurs within an action 661 | - Special characters are now supported in secrets 662 | - Initial support for agents running inside containers on a host 663 | - Optimized workflows to have fewer jobs 664 | 665 | ### Update AL-Go System Files Workflow 666 | 667 | - workflow now displays the currently used template URL when selecting the Run Workflow action 668 | 669 | ### CI/CD workflow 670 | 671 | - Better detection of changed projects 672 | - appDependencyProbingPaths did not support multiple projects in the same repository for latestBuild dependencies 673 | - appDependencyProbingPaths with release=latestBuild only considered the last 30 artifacts 674 | - Use mutex around ReadSecrets to ensure that multiple agents on the same host doesn't clash 675 | - Add lfs when checking out files for CI/CD to support checking in dependencies 676 | - Continue on error with Deploy and Deliver 677 | 678 | ### CI/CD and Publish To New Environment 679 | 680 | - Base functionality for selecting a specific GitHub runner for an environment 681 | - Include dependencies artifacts when deploying (if generateDependencyArtifact is true) 682 | 683 | ### localDevEnv.ps1 and cloudDevEnv.ps1 684 | 685 | - Display clear error message if something goes wrong 686 | 687 | ## v1.5 688 | 689 | ### Issues 690 | 691 | - Issue #100 - Add more resilience to localDevEnv.ps1 and cloudDevEnv.ps1 692 | - Issue #131 - Special characters are not allowed in secrets 693 | 694 | ### All workflows 695 | 696 | - During initialize, all AL-Go settings files are now checked for validity and reported correctly 697 | - During initialize, the version number of AL-Go for GitHub is printed in large letters (incl. preview or dev.) 698 | 699 | ### New workflow: Create new Performance Test App 700 | 701 | - Create BCPT Test app and add to bcptTestFolders to run bcpt Tests in workflows (set doNotRunBcptTests in workflow settings for workflows where you do NOT want this) 702 | 703 | ### Update AL-Go System Files Workflow 704 | 705 | - Include release notes of new version in the description of the PR (and in the workflow output) 706 | 707 | ### CI/CD workflow 708 | 709 | - Apps are not signed when the workflow is running as a Pull Request validation 710 | - if a secret called applicationInsightsConnectionString exists, then the value of that will be used as ApplicationInsightsConnectionString for the app 711 | 712 | ### Increment Version Number Workflow 713 | 714 | - Bugfix: increment all apps using f.ex. +0.1 would fail. 715 | 716 | ### Environments 717 | 718 | - Add suport for EnvironmentName redirection by adding an Environment Secret under the environment or a repo secret called \\_EnvironmentName with the actual environment name. 719 | - No default environment name on Publish To Environment 720 | - For multi-project repositories, you can specify an environment secret called Projects or a repo setting called \\_Projects, containing the projects you want to deploy to this environment. 721 | 722 | ### Settings 723 | 724 | - New setting: **runs-on** to allow modifying runs-on for all jobs (requires Update AL-Go System files after changing the setting) 725 | - New setting: **DoNotSignApps** - setting this to true causes signing of the app to be skipped 726 | - New setting: **DoNotPublishApps** - setting this to true causes the workflow to skip publishing, upgrading and testing the app to improve performance. 727 | - New setting: **ConditionalSettings** to allow to use different settings for specific branches. Example: 728 | 729 | ``` 730 | "ConditionalSettings": [ 731 | { 732 | "branches": [ 733 | "feature/*" 734 | ], 735 | "settings": { 736 | "doNotPublishApps": true, 737 | "doNotSignApps": true 738 | } 739 | } 740 | ] 741 | ``` 742 | 743 | - Default **BcContainerHelperVersion** is now based on AL-Go version. Preview AL-Go selects preview bcContainerHelper, normal selects latest. 744 | - New Setting: **bcptTestFolders** contains folders with BCPT tests, which will run in all build workflows 745 | - New Setting: set **doNotRunBcptTest** to true (in workflow specific settings file?) to avoid running BCPT tests 746 | - New Setting: set **obsoleteTagMinAllowedMajorMinor** to enable appsource cop to validate your app against future changes (AS0105). This setting will become auto-calculated in Test Current, Test Next Minor and Test Next Major later. 747 | 748 | ## v1.4 749 | 750 | ### All workflows 751 | 752 | - Add requested permissions to avoid dependency on user/org defaults being too permissive 753 | 754 | ### Update AL-Go System Files Workflow 755 | 756 | - Default host to https://github.com/ (you can enter **myaccount/AL-Go-PTE@main** to change template) 757 | - Support for "just" changing branch (ex. **@Preview**) to shift to the preview version 758 | 759 | ### CI/CD Workflow 760 | 761 | - Support for feature branches (naming **feature/\***) - CI/CD workflow will run, but not generate artifacts nor deploy to QA 762 | 763 | ### Create Release Workflow 764 | 765 | - Support for release branches 766 | - Force Semver format on release tags 767 | - Add support for creating release branches on release (naming release/\*) 768 | - Add support for incrementing main branch after release 769 | 770 | ### Increment version number workflow 771 | 772 | - Add support for incremental (and absolute) version number change 773 | 774 | ### Environments 775 | 776 | - Support environmentName redirection in CI/CD and Publish To Environments workflows 777 | - If the name in Environments or environments settings doesn't match the actual environment name, 778 | - You can add a secret called EnvironmentName under the environment (or \\_ENVIRONMENTNAME globally) 779 | 780 | ## v1.3 781 | 782 | ### Issues 783 | 784 | - Issue #90 - Environments did not work. Secrets for environments specified in settings can now be **\\_AUTHCONTEXT** 785 | 786 | ### CI/CD Workflow 787 | 788 | - Give warning instead of error If no artifacts are found in **appDependencyProbingPaths** 789 | 790 | ## v1.2 791 | 792 | ### Issues 793 | 794 | - Issue #90 - Environments did not work. Environments (even if only defined in the settings file) did not work for private repositories if you didn't have a premium subscription. 795 | 796 | ### Local scripts 797 | 798 | - **LocalDevEnv.ps1** and \***CloudDevEnv.ps1** will now spawn a new PowerShell window as admin instead of running inside VS Code. Normally people doesn't run VS Code as administrator, and they shouldn't have to. Furthermore, I have seen a some people having problems when running these scripts inside VS Code. 799 | 800 | ## v1.1 801 | 802 | ### Settings 803 | 804 | - New Repo Setting: **GenerateDependencyArtifact** (default **false**). When true, CI/CD pipeline generates an artifact with the external dependencies used for building the apps in this repo. 805 | - New Repo Setting: **UpdateDependencies** (default **false**). When true, the default artifact for building the apps in this repo is not the latest available artifacts for this country, but instead the first compatible version (after calculating application dependencies). It is recommended to run Test Current, Test NextMinor and Test NextMajor in order to test your app against current and future builds. 806 | 807 | ### CI/CD Workflow 808 | 809 | - New Artifact: BuildOutput.txt. All compiler warnings and errors are emitted to this file to make it easier to investigate compiler errors and build a better UI for build errors and test results going forward. 810 | - TestResults artifact name to include repo version number and workflow name (for Current, NextMinor and NextMajor) 811 | - Default dependency version in appDependencyProbingPaths setting used is now latest Release instead of LatestBuild 812 | -------------------------------------------------------------------------------- /.github/Test Current.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "artifact": "////latest", 3 | "cacheImageName": "", 4 | "versioningStrategy": 15 5 | } 6 | -------------------------------------------------------------------------------- /.github/Test Next Major.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "artifact": "////nextmajor/{INSIDERSASTOKEN}", 3 | "cacheImageName": "", 4 | "versioningStrategy": 15 5 | } 6 | -------------------------------------------------------------------------------- /.github/Test Next Minor.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "artifact": "////nextminor/{INSIDERSASTOKEN}", 3 | "cacheImageName": "", 4 | "versioningStrategy": 15 5 | } 6 | -------------------------------------------------------------------------------- /.github/workflows/AddExistingAppOrTestApp.yaml: -------------------------------------------------------------------------------- 1 | name: 'Add existing app or test app' 2 | 3 | run-name: "Add existing app or test app in [${{ github.ref_name }}]" 4 | 5 | on: 6 | workflow_dispatch: 7 | inputs: 8 | project: 9 | description: Project name if the repository is setup for multiple projects 10 | required: false 11 | default: '.' 12 | url: 13 | description: Direct Download Url of .app or .zip file 14 | required: true 15 | directCommit: 16 | description: Direct Commit? 17 | type: boolean 18 | default: false 19 | useGhTokenWorkflow: 20 | description: Use GhTokenWorkflow for PR/Commit? 21 | type: boolean 22 | default: false 23 | 24 | permissions: 25 | actions: read 26 | contents: write 27 | id-token: write 28 | pull-requests: write 29 | 30 | defaults: 31 | run: 32 | shell: powershell 33 | 34 | env: 35 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 36 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 37 | 38 | jobs: 39 | AddExistingAppOrTestApp: 40 | needs: [ ] 41 | runs-on: [ windows-latest ] 42 | steps: 43 | - name: Dump Workflow Information 44 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 45 | with: 46 | shell: powershell 47 | 48 | - name: Checkout 49 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 50 | 51 | - name: Initialize the workflow 52 | id: init 53 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 54 | with: 55 | shell: powershell 56 | 57 | - name: Read settings 58 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 59 | with: 60 | shell: powershell 61 | 62 | - name: Read secrets 63 | id: ReadSecrets 64 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 65 | with: 66 | shell: powershell 67 | gitHubSecrets: ${{ toJson(secrets) }} 68 | getSecrets: 'TokenForPush' 69 | useGhTokenWorkflowForPush: '${{ github.event.inputs.useGhTokenWorkflow }}' 70 | 71 | - name: Add existing app 72 | uses: microsoft/AL-Go/Actions/AddExistingApp@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 73 | with: 74 | shell: powershell 75 | token: ${{ steps.ReadSecrets.outputs.TokenForPush }} 76 | project: ${{ github.event.inputs.project }} 77 | url: ${{ github.event.inputs.url }} 78 | directCommit: ${{ github.event.inputs.directCommit }} 79 | 80 | - name: Finalize the workflow 81 | if: always() 82 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 83 | env: 84 | GITHUB_TOKEN: ${{ github.token }} 85 | with: 86 | shell: powershell 87 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 88 | currentJobContext: ${{ toJson(job) }} 89 | -------------------------------------------------------------------------------- /.github/workflows/CICD.yaml: -------------------------------------------------------------------------------- 1 | name: ' CI/CD' 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | paths-ignore: 7 | - '**.md' 8 | - '.github/workflows/*.yaml' 9 | - '!.github/workflows/CICD.yaml' 10 | branches: [ 'main', 'release/*', 'feature/*' ] 11 | 12 | defaults: 13 | run: 14 | shell: powershell 15 | 16 | permissions: 17 | actions: read 18 | contents: read 19 | id-token: write 20 | pages: read 21 | 22 | env: 23 | workflowDepth: 1 24 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 25 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 26 | 27 | jobs: 28 | Initialization: 29 | needs: [ ] 30 | runs-on: [ windows-latest ] 31 | outputs: 32 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 33 | environmentsMatrixJson: ${{ steps.DetermineDeploymentEnvironments.outputs.EnvironmentsMatrixJson }} 34 | environmentCount: ${{ steps.DetermineDeploymentEnvironments.outputs.EnvironmentCount }} 35 | deploymentEnvironmentsJson: ${{ steps.DetermineDeploymentEnvironments.outputs.DeploymentEnvironmentsJson }} 36 | generateALDocArtifact: ${{ steps.DetermineDeploymentEnvironments.outputs.GenerateALDocArtifact }} 37 | deployALDocArtifact: ${{ steps.DetermineDeploymentEnvironments.outputs.DeployALDocArtifact }} 38 | deliveryTargetsJson: ${{ steps.DetermineDeliveryTargets.outputs.DeliveryTargetsJson }} 39 | githubRunner: ${{ steps.ReadSettings.outputs.GitHubRunnerJson }} 40 | githubRunnerShell: ${{ steps.ReadSettings.outputs.GitHubRunnerShell }} 41 | projects: ${{ steps.determineProjectsToBuild.outputs.ProjectsJson }} 42 | projectDependenciesJson: ${{ steps.determineProjectsToBuild.outputs.ProjectDependenciesJson }} 43 | buildOrderJson: ${{ steps.determineProjectsToBuild.outputs.BuildOrderJson }} 44 | powerPlatformSolutionFolder: ${{ steps.DeterminePowerPlatformSolutionFolder.outputs.powerPlatformSolutionFolder }} 45 | workflowDepth: ${{ steps.DetermineWorkflowDepth.outputs.WorkflowDepth }} 46 | steps: 47 | - name: Dump Workflow Information 48 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 49 | with: 50 | shell: powershell 51 | 52 | - name: Checkout 53 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 54 | with: 55 | lfs: true 56 | 57 | - name: Initialize the workflow 58 | id: init 59 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 60 | with: 61 | shell: powershell 62 | 63 | - name: Read settings 64 | id: ReadSettings 65 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 66 | with: 67 | shell: powershell 68 | get: type, powerPlatformSolutionFolder 69 | 70 | - name: Determine Workflow Depth 71 | id: DetermineWorkflowDepth 72 | run: | 73 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "WorkflowDepth=$($env:workflowDepth)" 74 | 75 | - name: Determine Projects To Build 76 | id: determineProjectsToBuild 77 | uses: microsoft/AL-Go/Actions/DetermineProjectsToBuild@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 78 | with: 79 | shell: powershell 80 | maxBuildDepth: ${{ env.workflowDepth }} 81 | 82 | - name: Determine PowerPlatform Solution Folder 83 | id: DeterminePowerPlatformSolutionFolder 84 | if: env.type == 'PTE' 85 | run: | 86 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "powerPlatformSolutionFolder=$($env:powerPlatformSolutionFolder)" 87 | 88 | - name: Determine Delivery Target Secrets 89 | id: DetermineDeliveryTargetSecrets 90 | uses: microsoft/AL-Go/Actions/DetermineDeliveryTargets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 91 | with: 92 | shell: powershell 93 | projectsJson: '${{ steps.determineProjectsToBuild.outputs.ProjectsJson }}' 94 | checkContextSecrets: 'false' 95 | 96 | - name: Read secrets 97 | id: ReadSecrets 98 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 99 | with: 100 | shell: powershell 101 | gitHubSecrets: ${{ toJson(secrets) }} 102 | getSecrets: ${{ steps.DetermineDeliveryTargetSecrets.outputs.ContextSecrets }} 103 | 104 | - name: Determine Delivery Targets 105 | id: DetermineDeliveryTargets 106 | uses: microsoft/AL-Go/Actions/DetermineDeliveryTargets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 107 | env: 108 | Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' 109 | with: 110 | shell: powershell 111 | projectsJson: '${{ steps.determineProjectsToBuild.outputs.ProjectsJson }}' 112 | checkContextSecrets: 'true' 113 | 114 | - name: Determine Deployment Environments 115 | id: DetermineDeploymentEnvironments 116 | uses: microsoft/AL-Go/Actions/DetermineDeploymentEnvironments@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 117 | env: 118 | GITHUB_TOKEN: ${{ github.token }} 119 | with: 120 | shell: powershell 121 | getEnvironments: '*' 122 | type: 'CD' 123 | 124 | CheckForUpdates: 125 | needs: [ Initialization ] 126 | runs-on: [ windows-latest ] 127 | steps: 128 | - name: Checkout 129 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 130 | 131 | - name: Read settings 132 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 133 | with: 134 | shell: powershell 135 | get: templateUrl 136 | 137 | - name: Check for updates to AL-Go system files 138 | uses: microsoft/AL-Go/Actions/CheckForUpdates@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 139 | with: 140 | shell: powershell 141 | templateUrl: ${{ env.templateUrl }} 142 | downloadLatest: true 143 | 144 | Build: 145 | needs: [ Initialization ] 146 | if: (!failure()) && (!cancelled()) && fromJson(needs.Initialization.outputs.buildOrderJson)[0].projectsCount > 0 147 | strategy: 148 | matrix: 149 | include: ${{ fromJson(needs.Initialization.outputs.buildOrderJson)[0].buildDimensions }} 150 | fail-fast: false 151 | name: Build ${{ matrix.projectName }} (${{ matrix.buildMode }}) 152 | uses: ./.github/workflows/_BuildALGoProject.yaml 153 | secrets: inherit 154 | with: 155 | shell: ${{ matrix.githubRunnerShell }} 156 | runsOn: ${{ matrix.githubRunner }} 157 | project: ${{ matrix.project }} 158 | projectName: ${{ matrix.projectName }} 159 | buildMode: ${{ matrix.buildMode }} 160 | projectDependenciesJson: ${{ needs.Initialization.outputs.projectDependenciesJson }} 161 | secrets: 'licenseFileUrl,codeSignCertificateUrl,*codeSignCertificatePassword,keyVaultCertificateUrl,*keyVaultCertificatePassword,keyVaultClientId,gitHubPackagesContext,applicationInsightsConnectionString' 162 | publishThisBuildArtifacts: ${{ needs.Initialization.outputs.workflowDepth > 1 }} 163 | publishArtifacts: ${{ github.ref_name == 'main' || startswith(github.ref_name, 'release/') || startswith(github.ref_name, 'releases/') || needs.Initialization.outputs.deliveryTargetsJson != '[]' || needs.Initialization.outputs.environmentCount > 0 }} 164 | signArtifacts: true 165 | useArtifactCache: true 166 | 167 | DeployALDoc: 168 | needs: [ Initialization, Build ] 169 | if: (!cancelled()) && needs.Build.result == 'Success' && needs.Initialization.outputs.generateALDocArtifact == 1 && github.ref_name == 'main' 170 | runs-on: [ windows-latest ] 171 | name: Deploy Reference Documentation 172 | permissions: 173 | contents: read 174 | actions: read 175 | pages: write 176 | id-token: write 177 | environment: 178 | name: github-pages 179 | url: ${{ steps.deployment.outputs.page_url }} 180 | steps: 181 | - name: Checkout 182 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 183 | 184 | - name: Download artifacts 185 | uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 186 | with: 187 | path: '.artifacts' 188 | 189 | - name: Read settings 190 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 191 | with: 192 | shell: powershell 193 | 194 | - name: Setup Pages 195 | if: needs.Initialization.outputs.deployALDocArtifact == 1 196 | uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 197 | 198 | - name: Build Reference Documentation 199 | uses: microsoft/AL-Go/Actions/BuildReferenceDocumentation@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 200 | with: 201 | shell: powershell 202 | artifacts: '.artifacts' 203 | 204 | - name: Upload pages artifact 205 | uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1 206 | with: 207 | path: ".aldoc/_site/" 208 | 209 | - name: Deploy to GitHub Pages 210 | if: needs.Initialization.outputs.deployALDocArtifact == 1 211 | id: deployment 212 | uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5 213 | 214 | Deploy: 215 | needs: [ Initialization, Build ] 216 | if: (!cancelled()) && (needs.Build.result == 'success' || needs.Build.result == 'skipped') && needs.Initialization.outputs.environmentCount > 0 217 | strategy: ${{ fromJson(needs.Initialization.outputs.environmentsMatrixJson) }} 218 | runs-on: ${{ fromJson(matrix.os) }} 219 | name: Deploy to ${{ matrix.environment }} 220 | defaults: 221 | run: 222 | shell: ${{ matrix.shell }} 223 | environment: 224 | name: ${{ matrix.environment }} 225 | url: ${{ steps.Deploy.outputs.environmentUrl }} 226 | steps: 227 | - name: Checkout 228 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 229 | 230 | - name: Download artifacts 231 | uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 232 | with: 233 | path: '.artifacts' 234 | 235 | - name: Read settings 236 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 237 | with: 238 | shell: ${{ matrix.shell }} 239 | get: type,powerPlatformSolutionFolder 240 | 241 | - name: EnvName 242 | id: envName 243 | run: | 244 | $errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 245 | $envName = '${{ matrix.environment }}'.split(' ')[0] 246 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "envName=$envName" 247 | 248 | - name: Read secrets 249 | id: ReadSecrets 250 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 251 | with: 252 | shell: ${{ matrix.shell }} 253 | gitHubSecrets: ${{ toJson(secrets) }} 254 | getSecrets: '${{ steps.envName.outputs.envName }}-AuthContext,${{ steps.envName.outputs.envName }}_AuthContext,AuthContext' 255 | 256 | - name: Deploy to Business Central 257 | id: Deploy 258 | uses: microsoft/AL-Go/Actions/Deploy@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 259 | env: 260 | Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' 261 | with: 262 | shell: ${{ matrix.shell }} 263 | environmentName: ${{ matrix.environment }} 264 | artifactsFolder: '.artifacts' 265 | type: 'CD' 266 | deploymentEnvironmentsJson: ${{ needs.Initialization.outputs.deploymentEnvironmentsJson }} 267 | 268 | - name: Deploy to Power Platform 269 | if: env.type == 'PTE' && env.powerPlatformSolutionFolder != '' 270 | uses: microsoft/AL-Go/Actions/DeployPowerPlatform@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 271 | env: 272 | Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' 273 | with: 274 | shell: powershell 275 | environmentName: ${{ matrix.environment }} 276 | artifactsFolder: '.artifacts' 277 | deploymentEnvironmentsJson: ${{ needs.Initialization.outputs.deploymentEnvironmentsJson }} 278 | 279 | Deliver: 280 | needs: [ Initialization, Build ] 281 | if: (!cancelled()) && (needs.Build.result == 'success' || needs.Build.result == 'skipped') && needs.Initialization.outputs.deliveryTargetsJson != '[]' 282 | strategy: 283 | matrix: 284 | deliveryTarget: ${{ fromJson(needs.Initialization.outputs.deliveryTargetsJson) }} 285 | fail-fast: false 286 | runs-on: [ windows-latest ] 287 | name: Deliver to ${{ matrix.deliveryTarget }} 288 | steps: 289 | - name: Checkout 290 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 291 | 292 | - name: Download artifacts 293 | uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 294 | with: 295 | path: '.artifacts' 296 | 297 | - name: Read settings 298 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 299 | with: 300 | shell: powershell 301 | 302 | - name: Read secrets 303 | id: ReadSecrets 304 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 305 | with: 306 | shell: powershell 307 | gitHubSecrets: ${{ toJson(secrets) }} 308 | getSecrets: '${{ matrix.deliveryTarget }}Context' 309 | 310 | - name: Deliver 311 | uses: microsoft/AL-Go/Actions/Deliver@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 312 | env: 313 | Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' 314 | with: 315 | shell: powershell 316 | type: 'CD' 317 | projects: ${{ needs.Initialization.outputs.projects }} 318 | deliveryTarget: ${{ matrix.deliveryTarget }} 319 | artifacts: '.artifacts' 320 | 321 | PostProcess: 322 | needs: [ Initialization, Build, Deploy, Deliver, DeployALDoc ] 323 | if: (!cancelled()) 324 | runs-on: [ windows-latest ] 325 | steps: 326 | - name: Checkout 327 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 328 | 329 | - name: Finalize the workflow 330 | id: PostProcess 331 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 332 | env: 333 | GITHUB_TOKEN: ${{ github.token }} 334 | with: 335 | shell: powershell 336 | telemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} 337 | currentJobContext: ${{ toJson(job) }} 338 | -------------------------------------------------------------------------------- /.github/workflows/CreateApp.yaml: -------------------------------------------------------------------------------- 1 | name: 'Create a new app' 2 | 3 | run-name: "Create a new app in [${{ github.ref_name }}]" 4 | 5 | on: 6 | workflow_dispatch: 7 | inputs: 8 | project: 9 | description: Project name if the repository is setup for multiple projects 10 | required: false 11 | default: '.' 12 | name: 13 | description: Name 14 | required: true 15 | publisher: 16 | description: Publisher 17 | required: true 18 | idrange: 19 | description: ID range (from..to) 20 | required: true 21 | sampleCode: 22 | description: Include Sample code? 23 | type: boolean 24 | default: true 25 | directCommit: 26 | description: Direct Commit? 27 | type: boolean 28 | default: false 29 | useGhTokenWorkflow: 30 | description: Use GhTokenWorkflow for PR/Commit? 31 | type: boolean 32 | default: false 33 | 34 | permissions: 35 | actions: read 36 | contents: write 37 | id-token: write 38 | pull-requests: write 39 | 40 | defaults: 41 | run: 42 | shell: powershell 43 | 44 | env: 45 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 46 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 47 | 48 | jobs: 49 | CreateApp: 50 | needs: [ ] 51 | runs-on: [ windows-latest ] 52 | steps: 53 | - name: Dump Workflow Information 54 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 55 | with: 56 | shell: powershell 57 | 58 | - name: Checkout 59 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 60 | 61 | - name: Initialize the workflow 62 | id: init 63 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 64 | with: 65 | shell: powershell 66 | 67 | - name: Read settings 68 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 69 | with: 70 | shell: powershell 71 | get: type 72 | 73 | - name: Read secrets 74 | id: ReadSecrets 75 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 76 | with: 77 | shell: powershell 78 | gitHubSecrets: ${{ toJson(secrets) }} 79 | getSecrets: 'TokenForPush' 80 | useGhTokenWorkflowForPush: '${{ github.event.inputs.useGhTokenWorkflow }}' 81 | 82 | - name: Creating a new app 83 | uses: microsoft/AL-Go/Actions/CreateApp@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 84 | with: 85 | shell: powershell 86 | token: ${{ steps.ReadSecrets.outputs.TokenForPush }} 87 | project: ${{ github.event.inputs.project }} 88 | type: ${{ env.type }} 89 | name: ${{ github.event.inputs.name }} 90 | publisher: ${{ github.event.inputs.publisher }} 91 | idrange: ${{ github.event.inputs.idrange }} 92 | sampleCode: ${{ github.event.inputs.sampleCode }} 93 | directCommit: ${{ github.event.inputs.directCommit }} 94 | 95 | - name: Finalize the workflow 96 | if: always() 97 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 98 | env: 99 | GITHUB_TOKEN: ${{ github.token }} 100 | with: 101 | shell: powershell 102 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 103 | currentJobContext: ${{ toJson(job) }} 104 | -------------------------------------------------------------------------------- /.github/workflows/CreateOnlineDevelopmentEnvironment.yaml: -------------------------------------------------------------------------------- 1 | name: ' Create Online Dev. Environment' 2 | 3 | run-name: "Create Online Dev. Environment for [${{ github.ref_name }} / ${{ github.event.inputs.project }}]" 4 | 5 | on: 6 | workflow_dispatch: 7 | inputs: 8 | project: 9 | description: Project name if the repository is setup for multiple projects 10 | required: false 11 | default: '.' 12 | environmentName: 13 | description: Name of the online environment 14 | required: true 15 | reUseExistingEnvironment: 16 | description: Reuse environment if it exists? 17 | type: boolean 18 | default: false 19 | directCommit: 20 | description: Direct Commit? 21 | type: boolean 22 | default: false 23 | useGhTokenWorkflow: 24 | description: Use GhTokenWorkflow for PR/Commit? 25 | type: boolean 26 | default: false 27 | 28 | permissions: 29 | actions: read 30 | contents: write 31 | id-token: write 32 | pull-requests: write 33 | 34 | defaults: 35 | run: 36 | shell: powershell 37 | 38 | env: 39 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 40 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 41 | 42 | jobs: 43 | Initialization: 44 | needs: [ ] 45 | runs-on: [ windows-latest ] 46 | outputs: 47 | deviceCode: ${{ steps.authenticate.outputs.deviceCode }} 48 | githubRunner: ${{ steps.ReadSettings.outputs.GitHubRunnerJson }} 49 | githubRunnerShell: ${{ steps.ReadSettings.outputs.GitHubRunnerShell }} 50 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 51 | steps: 52 | - name: Dump Workflow Information 53 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 54 | with: 55 | shell: powershell 56 | 57 | - name: Checkout 58 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 59 | 60 | - name: Initialize the workflow 61 | id: init 62 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 63 | with: 64 | shell: powershell 65 | 66 | - name: Read settings 67 | id: ReadSettings 68 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 69 | with: 70 | shell: powershell 71 | 72 | - name: Read secrets 73 | id: ReadSecrets 74 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 75 | with: 76 | shell: powershell 77 | gitHubSecrets: ${{ toJson(secrets) }} 78 | getSecrets: 'adminCenterApiCredentials' 79 | 80 | - name: Check AdminCenterApiCredentials / Initiate Device Login (open to see code) 81 | id: authenticate 82 | run: | 83 | $errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 84 | $settings = $env:Settings | ConvertFrom-Json 85 | if ('${{ fromJson(steps.ReadSecrets.outputs.Secrets).adminCenterApiCredentials }}') { 86 | Write-Host "AdminCenterApiCredentials provided in secret $($settings.adminCenterApiCredentialsSecretName)!" 87 | Add-Content -Encoding UTF8 -path $ENV:GITHUB_STEP_SUMMARY -value "Admin Center Api Credentials was provided in a secret called $($settings.adminCenterApiCredentialsSecretName). Using this information for authentication." 88 | } 89 | else { 90 | Write-Host "AdminCenterApiCredentials not provided, initiating Device Code flow" 91 | $ALGoHelperPath = "$([System.IO.Path]::GetTempFileName()).ps1" 92 | $webClient = New-Object System.Net.WebClient 93 | $webClient.DownloadFile('https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1', $ALGoHelperPath) 94 | . $ALGoHelperPath 95 | DownloadAndImportBcContainerHelper 96 | $authContext = New-BcAuthContext -includeDeviceLogin -deviceLoginTimeout ([TimeSpan]::FromSeconds(0)) 97 | Add-Content -Encoding UTF8 -path $ENV:GITHUB_STEP_SUMMARY -value "AL-Go needs access to the Business Central Admin Center Api and could not locate a secret called $($settings.adminCenterApiCredentialsSecretName) (https://aka.ms/ALGoSettings#AdminCenterApiCredentialsSecretName)`n`n$($authContext.message)" 98 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "deviceCode=$($authContext.deviceCode)" 99 | } 100 | 101 | CreateDevelopmentEnvironment: 102 | needs: [ Initialization ] 103 | runs-on: ${{ fromJson(needs.Initialization.outputs.githubRunner) }} 104 | defaults: 105 | run: 106 | shell: ${{ needs.Initialization.outputs.githubRunnerShell }} 107 | name: Create Development Environment 108 | env: 109 | deviceCode: ${{ needs.Initialization.outputs.deviceCode }} 110 | steps: 111 | - name: Checkout 112 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 113 | 114 | - name: Read settings 115 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 116 | with: 117 | shell: powershell 118 | 119 | - name: Read secrets 120 | id: ReadSecrets 121 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 122 | with: 123 | shell: powershell 124 | gitHubSecrets: ${{ toJson(secrets) }} 125 | getSecrets: 'adminCenterApiCredentials,TokenForPush' 126 | useGhTokenWorkflowForPush: '${{ github.event.inputs.useGhTokenWorkflow }}' 127 | 128 | - name: Set AdminCenterApiCredentials 129 | id: SetAdminCenterApiCredentials 130 | run: | 131 | if ($env:deviceCode) { 132 | $adminCenterApiCredentials = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("{""deviceCode"":""$($env:deviceCode)""}")) 133 | } 134 | else { 135 | $adminCenterApiCredentials = '${{ fromJson(steps.ReadSecrets.outputs.Secrets).adminCenterApiCredentials }}' 136 | } 137 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -value "adminCenterApiCredentials=$adminCenterApiCredentials" 138 | 139 | - name: Create Development Environment 140 | uses: microsoft/AL-Go/Actions/CreateDevelopmentEnvironment@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 141 | with: 142 | shell: powershell 143 | token: ${{ steps.ReadSecrets.outputs.TokenForPush }} 144 | environmentName: ${{ github.event.inputs.environmentName }} 145 | project: ${{ github.event.inputs.project }} 146 | reUseExistingEnvironment: ${{ github.event.inputs.reUseExistingEnvironment }} 147 | directCommit: ${{ github.event.inputs.directCommit }} 148 | adminCenterApiCredentials: ${{ steps.SetAdminCenterApiCredentials.outputs.adminCenterApiCredentials }} 149 | 150 | - name: Finalize the workflow 151 | if: always() 152 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 153 | env: 154 | GITHUB_TOKEN: ${{ github.token }} 155 | with: 156 | shell: powershell 157 | telemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} 158 | currentJobContext: ${{ toJson(job) }} 159 | -------------------------------------------------------------------------------- /.github/workflows/CreatePerformanceTestApp.yaml: -------------------------------------------------------------------------------- 1 | name: 'Create a new performance test app' 2 | 3 | run-name: "Create a new performance test app in [${{ github.ref_name }}]" 4 | 5 | on: 6 | workflow_dispatch: 7 | inputs: 8 | project: 9 | description: Project name if the repository is setup for multiple projects 10 | required: false 11 | default: '.' 12 | name: 13 | description: Name 14 | required: true 15 | default: '.PerformanceTest' 16 | publisher: 17 | description: Publisher 18 | required: true 19 | idrange: 20 | description: ID range 21 | required: true 22 | default: '50000..99999' 23 | sampleCode: 24 | description: Include Sample code? 25 | type: boolean 26 | default: true 27 | sampleSuite: 28 | description: Include Sample BCPT Suite? 29 | type: boolean 30 | default: true 31 | directCommit: 32 | description: Direct Commit? 33 | type: boolean 34 | default: false 35 | useGhTokenWorkflow: 36 | description: Use GhTokenWorkflow for PR/Commit? 37 | type: boolean 38 | default: false 39 | 40 | permissions: 41 | actions: read 42 | contents: write 43 | id-token: write 44 | pull-requests: write 45 | 46 | defaults: 47 | run: 48 | shell: powershell 49 | 50 | env: 51 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 52 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 53 | 54 | jobs: 55 | CreatePerformanceTestApp: 56 | needs: [ ] 57 | runs-on: [ windows-latest ] 58 | steps: 59 | - name: Dump Workflow Information 60 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 61 | with: 62 | shell: powershell 63 | 64 | - name: Checkout 65 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 66 | 67 | - name: Initialize the workflow 68 | id: init 69 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 70 | with: 71 | shell: powershell 72 | 73 | - name: Read settings 74 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 75 | with: 76 | shell: powershell 77 | 78 | - name: Read secrets 79 | id: ReadSecrets 80 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 81 | with: 82 | shell: powershell 83 | gitHubSecrets: ${{ toJson(secrets) }} 84 | getSecrets: 'TokenForPush' 85 | useGhTokenWorkflowForPush: '${{ github.event.inputs.useGhTokenWorkflow }}' 86 | 87 | - name: Creating a new test app 88 | uses: microsoft/AL-Go/Actions/CreateApp@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 89 | with: 90 | shell: powershell 91 | token: ${{ steps.ReadSecrets.outputs.TokenForPush }} 92 | project: ${{ github.event.inputs.project }} 93 | type: 'Performance Test App' 94 | name: ${{ github.event.inputs.name }} 95 | publisher: ${{ github.event.inputs.publisher }} 96 | idrange: ${{ github.event.inputs.idrange }} 97 | sampleCode: ${{ github.event.inputs.sampleCode }} 98 | sampleSuite: ${{ github.event.inputs.sampleSuite }} 99 | directCommit: ${{ github.event.inputs.directCommit }} 100 | 101 | - name: Finalize the workflow 102 | if: always() 103 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 104 | env: 105 | GITHUB_TOKEN: ${{ github.token }} 106 | with: 107 | shell: powershell 108 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 109 | currentJobContext: ${{ toJson(job) }} 110 | -------------------------------------------------------------------------------- /.github/workflows/CreateRelease.yaml: -------------------------------------------------------------------------------- 1 | name: ' Create release' 2 | run-name: "Create release - Version ${{ inputs.tag }}" 3 | 4 | on: 5 | workflow_dispatch: 6 | inputs: 7 | appVersion: 8 | description: App version to promote to release (default is latest) 9 | required: false 10 | default: 'latest' 11 | name: 12 | description: Name of this release 13 | required: true 14 | default: '' 15 | tag: 16 | description: Tag of this release (needs to be semantic version string https://semver.org, ex. 1.0.0) 17 | required: true 18 | default: '' 19 | prerelease: 20 | description: Prerelease? 21 | type: boolean 22 | default: false 23 | draft: 24 | description: Draft? 25 | type: boolean 26 | default: false 27 | createReleaseBranch: 28 | description: Create Release Branch? 29 | type: boolean 30 | default: false 31 | releaseBranchPrefix: 32 | description: The prefix for the release branch. Used only if 'Create Release Branch?' is checked. 33 | type: string 34 | default: release/ 35 | updateVersionNumber: 36 | description: New Version Number in main branch. Use Major.Minor for absolute change, use +Major.Minor for incremental change. 37 | required: false 38 | default: '' 39 | directCommit: 40 | description: Direct Commit? 41 | type: boolean 42 | default: false 43 | useGhTokenWorkflow: 44 | description: Use GhTokenWorkflow for PR/Commit? 45 | type: boolean 46 | default: false 47 | 48 | permissions: 49 | actions: read 50 | contents: write 51 | id-token: write 52 | pull-requests: write 53 | 54 | concurrency: release 55 | 56 | defaults: 57 | run: 58 | shell: powershell 59 | 60 | env: 61 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 62 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 63 | 64 | jobs: 65 | CreateRelease: 66 | needs: [ ] 67 | runs-on: [ windows-latest ] 68 | outputs: 69 | artifacts: ${{ steps.analyzeartifacts.outputs.artifacts }} 70 | releaseId: ${{ steps.createrelease.outputs.releaseId }} 71 | commitish: ${{ steps.analyzeartifacts.outputs.commitish }} 72 | releaseVersion: ${{ steps.createreleasenotes.outputs.releaseVersion }} 73 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 74 | steps: 75 | - name: Dump Workflow Information 76 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 77 | with: 78 | shell: powershell 79 | 80 | - name: Checkout 81 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 82 | 83 | - name: Initialize the workflow 84 | id: init 85 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 86 | with: 87 | shell: powershell 88 | 89 | - name: Read settings 90 | id: ReadSettings 91 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 92 | with: 93 | shell: powershell 94 | get: templateUrl,repoName,type,powerPlatformSolutionFolder 95 | 96 | - name: Read secrets 97 | id: ReadSecrets 98 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 99 | with: 100 | shell: powershell 101 | gitHubSecrets: ${{ toJson(secrets) }} 102 | getSecrets: 'TokenForPush' 103 | useGhTokenWorkflowForPush: '${{ github.event.inputs.useGhTokenWorkflow }}' 104 | 105 | - name: Determine Projects 106 | id: determineProjects 107 | uses: microsoft/AL-Go/Actions/DetermineProjectsToBuild@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 108 | with: 109 | shell: powershell 110 | 111 | - name: Check for updates to AL-Go system files 112 | uses: microsoft/AL-Go/Actions/CheckForUpdates@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 113 | with: 114 | shell: powershell 115 | templateUrl: ${{ env.templateUrl }} 116 | downloadLatest: true 117 | 118 | - name: Analyze Artifacts 119 | id: analyzeartifacts 120 | env: 121 | _appVersion: ${{ github.event.inputs.appVersion }} 122 | run: | 123 | $errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 124 | $projects = '${{ steps.determineProjects.outputs.ProjectsJson }}' | ConvertFrom-Json 125 | Write-Host "projects:" 126 | $projects | ForEach-Object { Write-Host "- $_" } 127 | if ($env:type -eq "PTE" -and $env:powerPlatformSolutionFolder -ne "") { 128 | Write-Host "PowerPlatformSolution:" 129 | Write-Host "- $($env:powerPlatformSolutionFolder)" 130 | $projects += @($env:powerPlatformSolutionFolder) 131 | } 132 | $include = @() 133 | $sha = '' 134 | $allArtifacts = @() 135 | $page = 1 136 | $headers = @{ 137 | "Authorization" = "token ${{ github.token }}" 138 | "X-GitHub-Api-Version" = "2022-11-28" 139 | "Accept" = "application/vnd.github+json; charset=utf-8" 140 | } 141 | do { 142 | $repoArtifacts = Invoke-RestMethod -UseBasicParsing -Headers $headers -Uri "$($ENV:GITHUB_API_URL)/repos/$($ENV:GITHUB_REPOSITORY)/actions/artifacts?per_page=100&page=$page" 143 | $allArtifacts += $repoArtifacts.Artifacts | Where-Object { !$_.expired } 144 | $page++ 145 | } 146 | while ($repoArtifacts.Artifacts.Count -gt 0) 147 | Write-Host "Repo Artifacts count: $($repoArtifacts.total_count)" 148 | Write-Host "Downloaded Artifacts count: $($allArtifacts.Count)" 149 | $projects | ForEach-Object { 150 | $thisProject = $_ 151 | if ($thisProject -and ($thisProject -ne '.')) { 152 | $project = $thisProject.Replace('\','_').Replace('/','_') 153 | } 154 | else { 155 | $project = $env:repoName 156 | } 157 | $refname = "$ENV:GITHUB_REF_NAME".Replace('/','_') 158 | Write-Host "Analyzing artifacts for project $project" 159 | $appVersion = "$env:_appVersion" 160 | if ($appVersion -eq "latest") { 161 | Write-Host "Grab latest" 162 | $artifact = $allArtifacts | Where-Object { $_.name -like "$project-$refname-Apps-*" -or $_.name -like "$project-$refname-PowerPlatformSolution-*" } | Select-Object -First 1 163 | } 164 | else { 165 | Write-Host "Search for $project-$refname-Apps-$appVersion or $project-$refname-PowerPlatformSolution-$appVersion" 166 | $artifact = $allArtifacts | Where-Object { $_.name -eq "$project-$refname-Apps-$appVersion"-or $_.name -eq "$project-$refname-PowerPlatformSolution-$appVersion" } | Select-Object -First 1 167 | } 168 | if ($artifact) { 169 | $startIndex = $artifact.name.LastIndexOf('-') + 1 170 | $artifactsVersion = $artifact.name.SubString($startIndex) 171 | } 172 | else { 173 | Write-Host "::Error::No artifacts found for this project" 174 | exit 1 175 | } 176 | if ($sha) { 177 | if ($artifact.workflow_run.head_sha -ne $sha) { 178 | Write-Host "::Error::The build selected for release doesn't contain all projects. Please rebuild all projects by manually running the CI/CD workflow and recreate the release." 179 | throw "The build selected for release doesn't contain all projects. Please rebuild all projects by manually running the CI/CD workflow and recreate the release." 180 | } 181 | } 182 | else { 183 | $sha = $artifact.workflow_run.head_sha 184 | } 185 | 186 | write-host "looking for $project-$refname-Apps-$artifactsVersion or $project-$refname-TestApps-$artifactsVersion or $project-$refname-Dependencies-$artifactsVersion or $project-$refname-PowerPlatformSolution-$artifactsVersion" 187 | $allArtifacts | Where-Object { ($_.name -like "$project-$refname-Apps-$artifactsVersion" -or $_.name -like "$project-$refname-TestApps-$artifactsVersion" -or $_.name -like "$project-$refname-Dependencies-$artifactsVersion" -or $_.name -like "$project-$refname-PowerPlatformSolution-$artifactsVersion") } | ForEach-Object { 188 | $atype = $_.name.SubString(0,$_.name.Length-$artifactsVersion.Length-1) 189 | $atype = $atype.SubString($atype.LastIndexOf('-')+1) 190 | $include += $( [ordered]@{ "name" = $_.name; "url" = $_.archive_download_url; "atype" = $atype; "project" = $thisproject } ) 191 | } 192 | if ($include.Count -eq 0) { 193 | Write-Host "::Error::No artifacts found for version $artifactsVersion" 194 | exit 1 195 | } 196 | } 197 | $artifacts = @{ "include" = $include } 198 | $artifactsJson = $artifacts | ConvertTo-Json -compress 199 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "artifacts=$artifactsJson" 200 | Write-Host "artifacts=$artifactsJson" 201 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "commitish=$sha" 202 | Write-Host "commitish=$sha" 203 | 204 | - name: Prepare release notes 205 | id: createreleasenotes 206 | uses: microsoft/AL-Go/Actions/CreateReleaseNotes@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 207 | with: 208 | shell: powershell 209 | tag_name: ${{ github.event.inputs.tag }} 210 | target_commitish: ${{ steps.analyzeartifacts.outputs.commitish }} 211 | 212 | - name: Create release 213 | uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 214 | id: createrelease 215 | env: 216 | bodyMD: ${{ steps.createreleasenotes.outputs.releaseNotes }} 217 | with: 218 | github-token: ${{ steps.ReadSecrets.outputs.TokenForPush }} 219 | script: | 220 | var bodyMD = process.env.bodyMD 221 | const createReleaseResponse = await github.rest.repos.createRelease({ 222 | owner: context.repo.owner, 223 | repo: context.repo.repo, 224 | tag_name: '${{ github.event.inputs.tag }}', 225 | name: '${{ github.event.inputs.name }}', 226 | body: bodyMD.replaceAll('\\n','\n').replaceAll('%0A','\n').replaceAll('%0D','\n').replaceAll('%25','%'), 227 | draft: ${{ github.event.inputs.draft=='true' }}, 228 | prerelease: ${{ github.event.inputs.prerelease=='true' }}, 229 | make_latest: 'legacy', 230 | target_commitish: '${{ steps.analyzeartifacts.outputs.commitish }}' 231 | }); 232 | const { 233 | data: { id: releaseId, html_url: htmlUrl, upload_url: uploadUrl } 234 | } = createReleaseResponse; 235 | core.setOutput('releaseId', releaseId); 236 | 237 | UploadArtifacts: 238 | needs: [ CreateRelease ] 239 | runs-on: [ windows-latest ] 240 | strategy: 241 | matrix: ${{ fromJson(needs.CreateRelease.outputs.artifacts) }} 242 | fail-fast: true 243 | steps: 244 | - name: Checkout 245 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 246 | 247 | - name: Read settings 248 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 249 | with: 250 | shell: powershell 251 | 252 | - name: Read secrets 253 | id: ReadSecrets 254 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 255 | with: 256 | shell: powershell 257 | gitHubSecrets: ${{ toJson(secrets) }} 258 | getSecrets: 'nuGetContext,storageContext,TokenForPush' 259 | useGhTokenWorkflowForPush: '${{ github.event.inputs.useGhTokenWorkflow }}' 260 | 261 | - name: Download artifact 262 | run: | 263 | $errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 264 | Write-Host "Downloading artifact ${{ matrix.name}}" 265 | $headers = @{ 266 | "Authorization" = "token ${{ github.token }}" 267 | "X-GitHub-Api-Version" = "2022-11-28" 268 | "Accept" = "application/vnd.github+json" 269 | } 270 | Invoke-WebRequest -UseBasicParsing -Headers $headers -Uri '${{ matrix.url }}' -OutFile '${{ matrix.name }}.zip' 271 | 272 | - name: Upload release artifacts 273 | uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 274 | env: 275 | releaseId: ${{ needs.createrelease.outputs.releaseId }} 276 | with: 277 | github-token: ${{ steps.ReadSecrets.outputs.TokenForPush }} 278 | script: | 279 | const releaseId = process.env.releaseId 280 | const assetPath = '${{ matrix.name }}.zip' 281 | const assetName = encodeURIComponent('${{ matrix.name }}.zip'.replaceAll(' ','.')).replaceAll('%','') 282 | const fs = require('fs'); 283 | const uploadAssetResponse = await github.rest.repos.uploadReleaseAsset({ 284 | owner: context.repo.owner, 285 | repo: context.repo.repo, 286 | release_id: releaseId, 287 | name: assetName, 288 | data: fs.readFileSync(assetPath) 289 | }); 290 | 291 | - name: Deliver to NuGet 292 | uses: microsoft/AL-Go/Actions/Deliver@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 293 | if: ${{ fromJson(steps.ReadSecrets.outputs.Secrets).nuGetContext != '' }} 294 | env: 295 | Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' 296 | with: 297 | shell: powershell 298 | type: 'Release' 299 | projects: ${{ matrix.project }} 300 | deliveryTarget: 'NuGet' 301 | artifacts: ${{ github.event.inputs.appVersion }} 302 | atypes: 'Apps,TestApps' 303 | 304 | - name: Deliver to Storage 305 | uses: microsoft/AL-Go/Actions/Deliver@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 306 | if: ${{ fromJson(steps.ReadSecrets.outputs.Secrets).storageContext != '' }} 307 | env: 308 | Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' 309 | with: 310 | shell: powershell 311 | type: 'Release' 312 | projects: ${{ matrix.project }} 313 | deliveryTarget: 'Storage' 314 | artifacts: ${{ github.event.inputs.appVersion }} 315 | atypes: 'Apps,TestApps,Dependencies' 316 | 317 | CreateReleaseBranch: 318 | needs: [ CreateRelease, UploadArtifacts ] 319 | if: ${{ github.event.inputs.createReleaseBranch=='true' }} 320 | runs-on: [ windows-latest ] 321 | steps: 322 | - name: Checkout 323 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 324 | with: 325 | ref: '${{ needs.createRelease.outputs.commitish }}' 326 | 327 | - name: Create Release Branch 328 | env: 329 | releaseBranchPrefix: ${{ github.event.inputs.releaseBranchPrefix }} 330 | run: | 331 | $errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 332 | $releaseBranch = "$($env:releaseBranchPrefix)" + "${{ needs.CreateRelease.outputs.releaseVersion }}" 333 | Write-Host "Creating release branch $releaseBranch" 334 | git checkout -b $releaseBranch 335 | git config user.name ${{ github.actor}} 336 | git config user.email ${{ github.actor}}@users.noreply.github.com 337 | git commit --allow-empty -m "Release branch $releaseBranch" 338 | git push origin $releaseBranch 339 | 340 | UpdateVersionNumber: 341 | needs: [ CreateRelease, UploadArtifacts ] 342 | if: ${{ github.event.inputs.updateVersionNumber!='' }} 343 | runs-on: [ windows-latest ] 344 | steps: 345 | - name: Checkout 346 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 347 | 348 | - name: Read settings 349 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 350 | with: 351 | shell: powershell 352 | 353 | - name: Read secrets 354 | id: ReadSecrets 355 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 356 | with: 357 | shell: powershell 358 | gitHubSecrets: ${{ toJson(secrets) }} 359 | getSecrets: 'TokenForPush' 360 | useGhTokenWorkflowForPush: '${{ github.event.inputs.useGhTokenWorkflow }}' 361 | 362 | - name: Update Version Number 363 | uses: microsoft/AL-Go/Actions/IncrementVersionNumber@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 364 | with: 365 | shell: powershell 366 | token: ${{ steps.ReadSecrets.outputs.TokenForPush }} 367 | versionNumber: ${{ github.event.inputs.updateVersionNumber }} 368 | directCommit: ${{ github.event.inputs.directCommit }} 369 | 370 | PostProcess: 371 | needs: [ CreateRelease, UploadArtifacts, CreateReleaseBranch, UpdateVersionNumber ] 372 | if: always() 373 | runs-on: [ windows-latest ] 374 | steps: 375 | - name: Checkout 376 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 377 | 378 | - name: Finalize the workflow 379 | id: PostProcess 380 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 381 | env: 382 | GITHUB_TOKEN: ${{ github.token }} 383 | with: 384 | shell: powershell 385 | telemetryScopeJson: ${{ needs.CreateRelease.outputs.telemetryScopeJson }} 386 | currentJobContext: ${{ toJson(job) }} 387 | -------------------------------------------------------------------------------- /.github/workflows/CreateTestApp.yaml: -------------------------------------------------------------------------------- 1 | name: 'Create a new test app' 2 | 3 | run-name: "Create a new test app in [${{ github.ref_name }}]" 4 | 5 | on: 6 | workflow_dispatch: 7 | inputs: 8 | project: 9 | description: Project name if the repository is setup for multiple projects 10 | required: false 11 | default: '.' 12 | name: 13 | description: Name 14 | required: true 15 | default: '.Test' 16 | publisher: 17 | description: Publisher 18 | required: true 19 | idrange: 20 | description: ID range 21 | required: true 22 | default: '50000..99999' 23 | sampleCode: 24 | description: Include Sample code? 25 | type: boolean 26 | default: true 27 | directCommit: 28 | description: Direct Commit? 29 | type: boolean 30 | default: false 31 | useGhTokenWorkflow: 32 | description: Use GhTokenWorkflow for PR/Commit? 33 | type: boolean 34 | default: false 35 | 36 | permissions: 37 | actions: read 38 | contents: write 39 | id-token: write 40 | pull-requests: write 41 | 42 | defaults: 43 | run: 44 | shell: powershell 45 | 46 | env: 47 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 48 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 49 | 50 | jobs: 51 | CreateTestApp: 52 | needs: [ ] 53 | runs-on: [ windows-latest ] 54 | steps: 55 | - name: Dump Workflow Information 56 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 57 | with: 58 | shell: powershell 59 | 60 | - name: Checkout 61 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 62 | 63 | - name: Initialize the workflow 64 | id: init 65 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 66 | with: 67 | shell: powershell 68 | 69 | - name: Read settings 70 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 71 | with: 72 | shell: powershell 73 | 74 | - name: Read secrets 75 | id: ReadSecrets 76 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 77 | with: 78 | shell: powershell 79 | gitHubSecrets: ${{ toJson(secrets) }} 80 | getSecrets: 'TokenForPush' 81 | useGhTokenWorkflowForPush: '${{ github.event.inputs.useGhTokenWorkflow }}' 82 | 83 | - name: Creating a new test app 84 | uses: microsoft/AL-Go/Actions/CreateApp@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 85 | with: 86 | shell: powershell 87 | token: ${{ steps.ReadSecrets.outputs.TokenForPush }} 88 | project: ${{ github.event.inputs.project }} 89 | type: 'Test App' 90 | name: ${{ github.event.inputs.name }} 91 | publisher: ${{ github.event.inputs.publisher }} 92 | idrange: ${{ github.event.inputs.idrange }} 93 | sampleCode: ${{ github.event.inputs.sampleCode }} 94 | directCommit: ${{ github.event.inputs.directCommit }} 95 | 96 | - name: Finalize the workflow 97 | if: always() 98 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 99 | env: 100 | GITHUB_TOKEN: ${{ github.token }} 101 | with: 102 | shell: powershell 103 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 104 | currentJobContext: ${{ toJson(job) }} 105 | -------------------------------------------------------------------------------- /.github/workflows/Current.yaml: -------------------------------------------------------------------------------- 1 | name: ' Test Current' 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | permissions: 7 | actions: read 8 | contents: read 9 | id-token: write 10 | 11 | defaults: 12 | run: 13 | shell: powershell 14 | 15 | env: 16 | workflowDepth: 1 17 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 18 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 19 | 20 | jobs: 21 | Initialization: 22 | needs: [ ] 23 | runs-on: [ windows-latest ] 24 | outputs: 25 | projects: ${{ steps.determineProjectsToBuild.outputs.ProjectsJson }} 26 | projectDependenciesJson: ${{ steps.determineProjectsToBuild.outputs.ProjectDependenciesJson }} 27 | buildOrderJson: ${{ steps.determineProjectsToBuild.outputs.BuildOrderJson }} 28 | workflowDepth: ${{ steps.DetermineWorkflowDepth.outputs.WorkflowDepth }} 29 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 30 | steps: 31 | - name: Dump Workflow Information 32 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 33 | with: 34 | shell: powershell 35 | 36 | - name: Checkout 37 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 38 | with: 39 | lfs: true 40 | 41 | - name: Initialize the workflow 42 | id: init 43 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 44 | with: 45 | shell: powershell 46 | 47 | - name: Read settings 48 | id: ReadSettings 49 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 50 | with: 51 | shell: powershell 52 | 53 | - name: Determine Workflow Depth 54 | id: DetermineWorkflowDepth 55 | run: | 56 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "WorkflowDepth=$($env:workflowDepth)" 57 | 58 | - name: Determine Projects To Build 59 | id: determineProjectsToBuild 60 | uses: microsoft/AL-Go/Actions/DetermineProjectsToBuild@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 61 | with: 62 | shell: powershell 63 | maxBuildDepth: ${{ env.workflowDepth }} 64 | 65 | Build: 66 | needs: [ Initialization ] 67 | if: (!failure()) && (!cancelled()) && fromJson(needs.Initialization.outputs.buildOrderJson)[0].projectsCount > 0 68 | strategy: 69 | matrix: 70 | include: ${{ fromJson(needs.Initialization.outputs.buildOrderJson)[0].buildDimensions }} 71 | fail-fast: false 72 | name: Build ${{ matrix.projectName }} (${{ matrix.buildMode }}) 73 | uses: ./.github/workflows/_BuildALGoProject.yaml 74 | secrets: inherit 75 | with: 76 | shell: ${{ matrix.githubRunnerShell }} 77 | runsOn: ${{ matrix.githubRunner }} 78 | project: ${{ matrix.project }} 79 | projectName: ${{ matrix.projectName }} 80 | buildMode: ${{ matrix.buildMode }} 81 | projectDependenciesJson: ${{ needs.Initialization.outputs.projectDependenciesJson }} 82 | secrets: 'licenseFileUrl,codeSignCertificateUrl,*codeSignCertificatePassword,keyVaultCertificateUrl,*keyVaultCertificatePassword,keyVaultClientId,gitHubPackagesContext,applicationInsightsConnectionString' 83 | publishThisBuildArtifacts: ${{ needs.Initialization.outputs.workflowDepth > 1 }} 84 | artifactsNameSuffix: 'Current' 85 | 86 | PostProcess: 87 | needs: [ Initialization, Build ] 88 | if: always() 89 | runs-on: [ windows-latest ] 90 | steps: 91 | - name: Checkout 92 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 93 | 94 | - name: Finalize the workflow 95 | id: PostProcess 96 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 97 | env: 98 | GITHUB_TOKEN: ${{ github.token }} 99 | with: 100 | shell: powershell 101 | telemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} 102 | currentJobContext: ${{ toJson(job) }} 103 | -------------------------------------------------------------------------------- /.github/workflows/DeployReferenceDocumentation.yaml: -------------------------------------------------------------------------------- 1 | name: ' Deploy Reference Documentation' 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | permissions: 7 | actions: read 8 | contents: read 9 | id-token: write 10 | pages: write 11 | 12 | defaults: 13 | run: 14 | shell: powershell 15 | 16 | env: 17 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 18 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 19 | 20 | jobs: 21 | DeployALDoc: 22 | runs-on: [ windows-latest ] 23 | name: Deploy Reference Documentation 24 | environment: 25 | name: github-pages 26 | url: ${{ steps.deployment.outputs.page_url }} 27 | steps: 28 | - name: Checkout 29 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 30 | 31 | - name: Initialize the workflow 32 | id: init 33 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 34 | with: 35 | shell: powershell 36 | 37 | - name: Read settings 38 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 39 | with: 40 | shell: powershell 41 | 42 | - name: Determine Deployment Environments 43 | id: DetermineDeploymentEnvironments 44 | uses: microsoft/AL-Go/Actions/DetermineDeploymentEnvironments@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 45 | env: 46 | GITHUB_TOKEN: ${{ github.token }} 47 | with: 48 | shell: powershell 49 | getEnvironments: 'github-pages' 50 | type: 'Publish' 51 | 52 | - name: Setup Pages 53 | if: steps.DetermineDeploymentEnvironments.outputs.deployALDocArtifact == 1 54 | uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 55 | 56 | - name: Build Reference Documentation 57 | uses: microsoft/AL-Go/Actions/BuildReferenceDocumentation@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 58 | with: 59 | shell: powershell 60 | artifacts: 'latest' 61 | 62 | - name: Upload pages artifact 63 | uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1 64 | with: 65 | path: ".aldoc/_site/" 66 | 67 | - name: Deploy to GitHub Pages 68 | if: steps.DetermineDeploymentEnvironments.outputs.deployALDocArtifact == 1 69 | id: deployment 70 | uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5 71 | 72 | - name: Finalize the workflow 73 | if: always() 74 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 75 | env: 76 | GITHUB_TOKEN: ${{ github.token }} 77 | with: 78 | shell: powershell 79 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 80 | currentJobContext: ${{ toJson(job) }} 81 | -------------------------------------------------------------------------------- /.github/workflows/IncrementVersionNumber.yaml: -------------------------------------------------------------------------------- 1 | name: ' Increment Version Number' 2 | 3 | run-name: "Increment Version Number in [${{ github.ref_name }}]" 4 | 5 | on: 6 | workflow_dispatch: 7 | inputs: 8 | projects: 9 | description: Comma-separated list of project name patterns if the repository is setup for multiple projects (default is * for all projects) 10 | required: false 11 | default: '*' 12 | versionNumber: 13 | description: Updated Version Number. Use Major.Minor for absolute change, use +Major.Minor for incremental change. 14 | required: true 15 | directCommit: 16 | description: Direct Commit? 17 | type: boolean 18 | default: false 19 | useGhTokenWorkflow: 20 | description: Use GhTokenWorkflow for PR/Commit? 21 | type: boolean 22 | default: false 23 | 24 | permissions: 25 | actions: read 26 | contents: write 27 | id-token: write 28 | pull-requests: write 29 | 30 | defaults: 31 | run: 32 | shell: powershell 33 | 34 | env: 35 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 36 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 37 | 38 | jobs: 39 | IncrementVersionNumber: 40 | needs: [ ] 41 | runs-on: [ windows-latest ] 42 | steps: 43 | - name: Dump Workflow Information 44 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 45 | with: 46 | shell: powershell 47 | 48 | - name: Checkout 49 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 50 | 51 | - name: Initialize the workflow 52 | id: init 53 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 54 | with: 55 | shell: powershell 56 | 57 | - name: Read settings 58 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 59 | with: 60 | shell: powershell 61 | 62 | - name: Read secrets 63 | id: ReadSecrets 64 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 65 | with: 66 | shell: powershell 67 | gitHubSecrets: ${{ toJson(secrets) }} 68 | getSecrets: 'TokenForPush' 69 | useGhTokenWorkflowForPush: '${{ github.event.inputs.useGhTokenWorkflow }}' 70 | 71 | - name: Increment Version Number 72 | uses: microsoft/AL-Go/Actions/IncrementVersionNumber@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 73 | with: 74 | shell: powershell 75 | token: ${{ steps.ReadSecrets.outputs.TokenForPush }} 76 | projects: ${{ github.event.inputs.projects }} 77 | versionNumber: ${{ github.event.inputs.versionNumber }} 78 | directCommit: ${{ github.event.inputs.directCommit }} 79 | 80 | - name: Finalize the workflow 81 | if: always() 82 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 83 | env: 84 | GITHUB_TOKEN: ${{ github.token }} 85 | with: 86 | shell: powershell 87 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 88 | currentJobContext: ${{ toJson(job) }} 89 | -------------------------------------------------------------------------------- /.github/workflows/NextMajor.yaml: -------------------------------------------------------------------------------- 1 | name: ' Test Next Major' 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | permissions: 7 | actions: read 8 | contents: read 9 | id-token: write 10 | 11 | defaults: 12 | run: 13 | shell: powershell 14 | 15 | env: 16 | workflowDepth: 1 17 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 18 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 19 | 20 | jobs: 21 | Initialization: 22 | needs: [ ] 23 | runs-on: [ windows-latest ] 24 | outputs: 25 | projects: ${{ steps.determineProjectsToBuild.outputs.ProjectsJson }} 26 | projectDependenciesJson: ${{ steps.determineProjectsToBuild.outputs.ProjectDependenciesJson }} 27 | buildOrderJson: ${{ steps.determineProjectsToBuild.outputs.BuildOrderJson }} 28 | workflowDepth: ${{ steps.DetermineWorkflowDepth.outputs.WorkflowDepth }} 29 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 30 | steps: 31 | - name: Dump Workflow Information 32 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 33 | with: 34 | shell: powershell 35 | 36 | - name: Checkout 37 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 38 | with: 39 | lfs: true 40 | 41 | - name: Initialize the workflow 42 | id: init 43 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 44 | with: 45 | shell: powershell 46 | 47 | - name: Read settings 48 | id: ReadSettings 49 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 50 | with: 51 | shell: powershell 52 | 53 | - name: Determine Workflow Depth 54 | id: DetermineWorkflowDepth 55 | run: | 56 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "WorkflowDepth=$($env:workflowDepth)" 57 | 58 | - name: Determine Projects To Build 59 | id: determineProjectsToBuild 60 | uses: microsoft/AL-Go/Actions/DetermineProjectsToBuild@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 61 | with: 62 | shell: powershell 63 | maxBuildDepth: ${{ env.workflowDepth }} 64 | 65 | Build: 66 | needs: [ Initialization ] 67 | if: (!failure()) && (!cancelled()) && fromJson(needs.Initialization.outputs.buildOrderJson)[0].projectsCount > 0 68 | strategy: 69 | matrix: 70 | include: ${{ fromJson(needs.Initialization.outputs.buildOrderJson)[0].buildDimensions }} 71 | fail-fast: false 72 | name: Build ${{ matrix.projectName }} (${{ matrix.buildMode }}) 73 | uses: ./.github/workflows/_BuildALGoProject.yaml 74 | secrets: inherit 75 | with: 76 | shell: ${{ matrix.githubRunnerShell }} 77 | runsOn: ${{ matrix.githubRunner }} 78 | project: ${{ matrix.project }} 79 | projectName: ${{ matrix.projectName }} 80 | buildMode: ${{ matrix.buildMode }} 81 | projectDependenciesJson: ${{ needs.Initialization.outputs.projectDependenciesJson }} 82 | secrets: 'licenseFileUrl,codeSignCertificateUrl,*codeSignCertificatePassword,keyVaultCertificateUrl,*keyVaultCertificatePassword,keyVaultClientId,gitHubPackagesContext,applicationInsightsConnectionString' 83 | publishThisBuildArtifacts: ${{ needs.Initialization.outputs.workflowDepth > 1 }} 84 | artifactsNameSuffix: 'NextMajor' 85 | 86 | PostProcess: 87 | needs: [ Initialization, Build ] 88 | if: always() 89 | runs-on: [ windows-latest ] 90 | steps: 91 | - name: Checkout 92 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 93 | 94 | - name: Finalize the workflow 95 | id: PostProcess 96 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 97 | env: 98 | GITHUB_TOKEN: ${{ github.token }} 99 | with: 100 | shell: powershell 101 | telemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} 102 | currentJobContext: ${{ toJson(job) }} 103 | -------------------------------------------------------------------------------- /.github/workflows/NextMinor.yaml: -------------------------------------------------------------------------------- 1 | name: ' Test Next Minor' 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | permissions: 7 | actions: read 8 | contents: read 9 | id-token: write 10 | 11 | defaults: 12 | run: 13 | shell: powershell 14 | 15 | env: 16 | workflowDepth: 1 17 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 18 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 19 | 20 | jobs: 21 | Initialization: 22 | needs: [ ] 23 | runs-on: [ windows-latest ] 24 | outputs: 25 | projects: ${{ steps.determineProjectsToBuild.outputs.ProjectsJson }} 26 | projectDependenciesJson: ${{ steps.determineProjectsToBuild.outputs.ProjectDependenciesJson }} 27 | buildOrderJson: ${{ steps.determineProjectsToBuild.outputs.BuildOrderJson }} 28 | workflowDepth: ${{ steps.DetermineWorkflowDepth.outputs.WorkflowDepth }} 29 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 30 | steps: 31 | - name: Dump Workflow Information 32 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 33 | with: 34 | shell: powershell 35 | 36 | - name: Checkout 37 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 38 | with: 39 | lfs: true 40 | 41 | - name: Initialize the workflow 42 | id: init 43 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 44 | with: 45 | shell: powershell 46 | 47 | - name: Read settings 48 | id: ReadSettings 49 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 50 | with: 51 | shell: powershell 52 | 53 | - name: Determine Workflow Depth 54 | id: DetermineWorkflowDepth 55 | run: | 56 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "WorkflowDepth=$($env:workflowDepth)" 57 | 58 | - name: Determine Projects To Build 59 | id: determineProjectsToBuild 60 | uses: microsoft/AL-Go/Actions/DetermineProjectsToBuild@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 61 | with: 62 | shell: powershell 63 | maxBuildDepth: ${{ env.workflowDepth }} 64 | 65 | Build: 66 | needs: [ Initialization ] 67 | if: (!failure()) && (!cancelled()) && fromJson(needs.Initialization.outputs.buildOrderJson)[0].projectsCount > 0 68 | strategy: 69 | matrix: 70 | include: ${{ fromJson(needs.Initialization.outputs.buildOrderJson)[0].buildDimensions }} 71 | fail-fast: false 72 | name: Build ${{ matrix.projectName }} (${{ matrix.buildMode }}) 73 | uses: ./.github/workflows/_BuildALGoProject.yaml 74 | secrets: inherit 75 | with: 76 | shell: ${{ matrix.githubRunnerShell }} 77 | runsOn: ${{ matrix.githubRunner }} 78 | project: ${{ matrix.project }} 79 | projectName: ${{ matrix.projectName }} 80 | buildMode: ${{ matrix.buildMode }} 81 | projectDependenciesJson: ${{ needs.Initialization.outputs.projectDependenciesJson }} 82 | secrets: 'licenseFileUrl,codeSignCertificateUrl,*codeSignCertificatePassword,keyVaultCertificateUrl,*keyVaultCertificatePassword,keyVaultClientId,gitHubPackagesContext,applicationInsightsConnectionString' 83 | publishThisBuildArtifacts: ${{ needs.Initialization.outputs.workflowDepth > 1 }} 84 | artifactsNameSuffix: 'NextMinor' 85 | 86 | PostProcess: 87 | needs: [ Initialization, Build ] 88 | if: always() 89 | runs-on: [ windows-latest ] 90 | steps: 91 | - name: Checkout 92 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 93 | 94 | - name: Finalize the workflow 95 | id: PostProcess 96 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 97 | env: 98 | GITHUB_TOKEN: ${{ github.token }} 99 | with: 100 | shell: powershell 101 | telemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} 102 | currentJobContext: ${{ toJson(job) }} 103 | -------------------------------------------------------------------------------- /.github/workflows/PublishToAppSource.yaml: -------------------------------------------------------------------------------- 1 | name: ' Publish To AppSource' 2 | run-name: 'Publish To AppSource - Version ${{ inputs.appVersion }}, Projects ${{ inputs.projects }}' 3 | 4 | on: 5 | workflow_dispatch: 6 | inputs: 7 | appVersion: 8 | description: App version to deliver to AppSource (current, prerelease, draft, latest or version number) 9 | required: false 10 | default: 'current' 11 | projects: 12 | description: Projects to publish to AppSource if the repository is multi-project. Default is *, which will publish all projects to AppSource. 13 | required: false 14 | default: '*' 15 | GoLive: 16 | description: Promote AppSource App to go live if it passes technical validation? 17 | type: boolean 18 | default: false 19 | 20 | permissions: 21 | actions: read 22 | contents: read 23 | id-token: write 24 | 25 | defaults: 26 | run: 27 | shell: powershell 28 | 29 | env: 30 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 31 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 32 | 33 | jobs: 34 | Initialization: 35 | needs: [ ] 36 | runs-on: [ windows-latest ] 37 | outputs: 38 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 39 | steps: 40 | - name: Dump Workflow Information 41 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 42 | with: 43 | shell: powershell 44 | 45 | - name: Checkout 46 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 47 | 48 | - name: Initialize the workflow 49 | id: init 50 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 51 | with: 52 | shell: powershell 53 | 54 | Deliver: 55 | needs: [ Initialization ] 56 | runs-on: [ windows-latest ] 57 | name: Deliver to AppSource 58 | steps: 59 | - name: Checkout 60 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 61 | 62 | - name: Read settings 63 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 64 | with: 65 | shell: powershell 66 | 67 | - name: Read secrets 68 | id: ReadSecrets 69 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 70 | with: 71 | shell: powershell 72 | gitHubSecrets: ${{ toJson(secrets) }} 73 | getSecrets: 'appSourceContext' 74 | 75 | - name: Deliver 76 | uses: microsoft/AL-Go/Actions/Deliver@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 77 | env: 78 | Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' 79 | with: 80 | shell: powershell 81 | type: 'Release' 82 | projects: ${{ github.event.inputs.projects }} 83 | deliveryTarget: 'AppSource' 84 | artifacts: ${{ github.event.inputs.appVersion }} 85 | goLive: ${{ github.event.inputs.goLive }} 86 | 87 | PostProcess: 88 | needs: [ Initialization, Deliver ] 89 | if: always() 90 | runs-on: [ windows-latest ] 91 | steps: 92 | - name: Checkout 93 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 94 | 95 | - name: Finalize the workflow 96 | id: PostProcess 97 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 98 | env: 99 | GITHUB_TOKEN: ${{ github.token }} 100 | with: 101 | shell: powershell 102 | telemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} 103 | currentJobContext: ${{ toJson(job) }} 104 | -------------------------------------------------------------------------------- /.github/workflows/PublishToEnvironment.yaml: -------------------------------------------------------------------------------- 1 | name: ' Publish To Environment' 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | appVersion: 7 | description: App version to deploy to environment(s) (current, prerelease, draft, latest or version number) 8 | required: false 9 | default: 'current' 10 | environmentName: 11 | description: Environment mask to receive the new version (* for all, PROD* for all environments starting with PROD) 12 | required: true 13 | 14 | permissions: 15 | actions: read 16 | contents: read 17 | id-token: write 18 | 19 | defaults: 20 | run: 21 | shell: powershell 22 | 23 | env: 24 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 25 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 26 | 27 | jobs: 28 | Initialization: 29 | needs: [ ] 30 | runs-on: [ windows-latest ] 31 | outputs: 32 | environmentsMatrixJson: ${{ steps.DetermineDeploymentEnvironments.outputs.EnvironmentsMatrixJson }} 33 | environmentCount: ${{ steps.DetermineDeploymentEnvironments.outputs.EnvironmentCount }} 34 | deploymentEnvironmentsJson: ${{ steps.DetermineDeploymentEnvironments.outputs.DeploymentEnvironmentsJson }} 35 | deviceCode: ${{ steps.Authenticate.outputs.deviceCode }} 36 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 37 | steps: 38 | - name: Dump Workflow Information 39 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 40 | with: 41 | shell: powershell 42 | 43 | - name: Checkout 44 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 45 | 46 | - name: Initialize the workflow 47 | id: init 48 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 49 | with: 50 | shell: powershell 51 | 52 | - name: Read settings 53 | id: ReadSettings 54 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 55 | with: 56 | shell: powershell 57 | 58 | - name: Determine Deployment Environments 59 | id: DetermineDeploymentEnvironments 60 | uses: microsoft/AL-Go/Actions/DetermineDeploymentEnvironments@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 61 | env: 62 | GITHUB_TOKEN: ${{ github.token }} 63 | with: 64 | shell: powershell 65 | getEnvironments: ${{ github.event.inputs.environmentName }} 66 | type: 'Publish' 67 | 68 | - name: EnvName 69 | id: envName 70 | if: steps.DetermineDeploymentEnvironments.outputs.UnknownEnvironment == 1 71 | run: | 72 | $errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 73 | $envName = '${{ fromJson(steps.DetermineDeploymentEnvironments.outputs.environmentsMatrixJson).matrix.include[0].environment }}'.split(' ')[0] 74 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "envName=$envName" 75 | 76 | - name: Read secrets 77 | id: ReadSecrets 78 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 79 | if: steps.DetermineDeploymentEnvironments.outputs.UnknownEnvironment == 1 80 | with: 81 | shell: powershell 82 | gitHubSecrets: ${{ toJson(secrets) }} 83 | getSecrets: '${{ steps.envName.outputs.envName }}-AuthContext,${{ steps.envName.outputs.envName }}_AuthContext,AuthContext' 84 | 85 | - name: Authenticate 86 | id: Authenticate 87 | if: steps.DetermineDeploymentEnvironments.outputs.UnknownEnvironment == 1 88 | run: | 89 | $envName = '${{ steps.envName.outputs.envName }}' 90 | $secretName = '' 91 | $secrets = '${{ steps.ReadSecrets.outputs.Secrets }}' | ConvertFrom-Json 92 | $authContext = $null 93 | "$($envName)-AuthContext", "$($envName)_AuthContext", "AuthContext" | ForEach-Object { 94 | if (!($authContext)) { 95 | if ($secrets."$_") { 96 | Write-Host "Using $_ secret as AuthContext" 97 | $authContext = $secrets."$_" 98 | $secretName = $_ 99 | } 100 | } 101 | } 102 | if ($authContext) { 103 | Write-Host "AuthContext provided in secret $secretName!" 104 | Add-Content -Encoding UTF8 -path $ENV:GITHUB_STEP_SUMMARY -value "AuthContext was provided in a secret called $secretName. Using this information for authentication." 105 | } 106 | else { 107 | Write-Host "No AuthContext provided for $envName, initiating Device Code flow" 108 | $ALGoHelperPath = "$([System.IO.Path]::GetTempFileName()).ps1" 109 | $webClient = New-Object System.Net.WebClient 110 | $webClient.DownloadFile('https://raw.githubusercontent.com/microsoft/AL-Go/a46044fa1ffca4b1ff05d2d1844fd7d5922c6984/Actions/AL-Go-Helper.ps1', $ALGoHelperPath) 111 | . $ALGoHelperPath 112 | DownloadAndImportBcContainerHelper 113 | $authContext = New-BcAuthContext -includeDeviceLogin -deviceLoginTimeout ([TimeSpan]::FromSeconds(0)) 114 | Add-Content -Encoding UTF8 -path $ENV:GITHUB_STEP_SUMMARY -value "AL-Go needs access to the Business Central Environment $('${{ steps.envName.outputs.envName }}'.Split(' ')[0]) and could not locate a secret called ${{ steps.envName.outputs.envName }}_AuthContext`n`n$($authContext.message)" 115 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "deviceCode=$($authContext.deviceCode)" 116 | } 117 | 118 | Deploy: 119 | needs: [ Initialization ] 120 | if: needs.Initialization.outputs.environmentCount > 0 121 | strategy: ${{ fromJson(needs.Initialization.outputs.environmentsMatrixJson) }} 122 | runs-on: ${{ fromJson(matrix.os) }} 123 | name: Deploy to ${{ matrix.environment }} 124 | defaults: 125 | run: 126 | shell: ${{ matrix.shell }} 127 | environment: 128 | name: ${{ matrix.environment }} 129 | url: ${{ steps.Deploy.outputs.environmentUrl }} 130 | env: 131 | deviceCode: ${{ needs.Initialization.outputs.deviceCode }} 132 | steps: 133 | - name: Checkout 134 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 135 | 136 | - name: EnvName 137 | id: envName 138 | run: | 139 | $errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 140 | $envName = '${{ matrix.environment }}'.split(' ')[0] 141 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "envName=$envName" 142 | 143 | - name: Read settings 144 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 145 | with: 146 | shell: ${{ matrix.shell }} 147 | get: type,powerPlatformSolutionFolder 148 | 149 | - name: Read secrets 150 | id: ReadSecrets 151 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 152 | with: 153 | shell: ${{ matrix.shell }} 154 | gitHubSecrets: ${{ toJson(secrets) }} 155 | getSecrets: '${{ steps.envName.outputs.envName }}-AuthContext,${{ steps.envName.outputs.envName }}_AuthContext,AuthContext' 156 | 157 | - name: Get Artifacts for deployment 158 | uses: microsoft/AL-Go/Actions/GetArtifactsForDeployment@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 159 | with: 160 | shell: ${{ matrix.shell }} 161 | artifactsVersion: ${{ github.event.inputs.appVersion }} 162 | artifactsFolder: '.artifacts' 163 | 164 | - name: Deploy to Business Central 165 | id: Deploy 166 | uses: microsoft/AL-Go/Actions/Deploy@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 167 | env: 168 | Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' 169 | with: 170 | shell: ${{ matrix.shell }} 171 | environmentName: ${{ matrix.environment }} 172 | artifactsFolder: '.artifacts' 173 | type: 'Publish' 174 | deploymentEnvironmentsJson: ${{ needs.Initialization.outputs.deploymentEnvironmentsJson }} 175 | 176 | - name: Deploy to Power Platform 177 | if: env.type == 'PTE' && env.powerPlatformSolutionFolder != '' 178 | uses: microsoft/AL-Go/Actions/DeployPowerPlatform@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 179 | env: 180 | Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' 181 | with: 182 | shell: ${{ matrix.shell }} 183 | environmentName: ${{ matrix.environment }} 184 | artifactsFolder: '.artifacts' 185 | deploymentEnvironmentsJson: ${{ needs.Initialization.outputs.deploymentEnvironmentsJson }} 186 | 187 | PostProcess: 188 | needs: [ Initialization, Deploy ] 189 | if: always() 190 | runs-on: [ windows-latest ] 191 | steps: 192 | - name: Checkout 193 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 194 | 195 | - name: Finalize the workflow 196 | id: PostProcess 197 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 198 | env: 199 | GITHUB_TOKEN: ${{ github.token }} 200 | with: 201 | shell: powershell 202 | telemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} 203 | currentJobContext: ${{ toJson(job) }} 204 | -------------------------------------------------------------------------------- /.github/workflows/PullRequestHandler.yaml: -------------------------------------------------------------------------------- 1 | name: 'Pull Request Build' 2 | 3 | on: 4 | pull_request_target: 5 | branches: [ 'main' ] 6 | 7 | concurrency: 8 | group: ${{ github.workflow }}-${{ github.event.pull_request.number }} 9 | cancel-in-progress: true 10 | 11 | defaults: 12 | run: 13 | shell: powershell 14 | 15 | permissions: 16 | actions: read 17 | contents: read 18 | id-token: write 19 | pull-requests: read 20 | 21 | env: 22 | workflowDepth: 1 23 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 24 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 25 | 26 | jobs: 27 | PregateCheck: 28 | if: (github.event.pull_request.base.repo.full_name != github.event.pull_request.head.repo.full_name) && (github.event_name != 'pull_request') 29 | runs-on: windows-latest 30 | steps: 31 | - uses: microsoft/AL-Go/Actions/VerifyPRChanges@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 32 | 33 | Initialization: 34 | needs: [ PregateCheck ] 35 | if: (!failure() && !cancelled()) 36 | runs-on: [ windows-latest ] 37 | outputs: 38 | projects: ${{ steps.determineProjectsToBuild.outputs.ProjectsJson }} 39 | projectDependenciesJson: ${{ steps.determineProjectsToBuild.outputs.ProjectDependenciesJson }} 40 | buildOrderJson: ${{ steps.determineProjectsToBuild.outputs.BuildOrderJson }} 41 | baselineWorkflowRunId: ${{ steps.determineProjectsToBuild.outputs.BaselineWorkflowRunId }} 42 | workflowDepth: ${{ steps.DetermineWorkflowDepth.outputs.WorkflowDepth }} 43 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 44 | steps: 45 | - name: Dump Workflow Information 46 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 47 | with: 48 | shell: powershell 49 | 50 | - name: Checkout 51 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 52 | with: 53 | lfs: true 54 | ref: ${{ github.event_name == 'pull_request' && github.sha || format('refs/pull/{0}/merge', github.event.pull_request.number) }} 55 | 56 | - name: Initialize the workflow 57 | id: init 58 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 59 | with: 60 | shell: powershell 61 | 62 | - name: Read settings 63 | id: ReadSettings 64 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 65 | with: 66 | shell: powershell 67 | 68 | - name: Determine Workflow Depth 69 | id: DetermineWorkflowDepth 70 | run: | 71 | Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "WorkflowDepth=$($env:workflowDepth)" 72 | 73 | - name: Determine Projects To Build 74 | id: determineProjectsToBuild 75 | uses: microsoft/AL-Go/Actions/DetermineProjectsToBuild@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 76 | with: 77 | shell: powershell 78 | maxBuildDepth: ${{ env.workflowDepth }} 79 | 80 | Build: 81 | needs: [ Initialization ] 82 | if: (!failure()) && (!cancelled()) && fromJson(needs.Initialization.outputs.buildOrderJson)[0].projectsCount > 0 83 | strategy: 84 | matrix: 85 | include: ${{ fromJson(needs.Initialization.outputs.buildOrderJson)[0].buildDimensions }} 86 | fail-fast: false 87 | name: Build ${{ matrix.projectName }} (${{ matrix.buildMode }}) 88 | uses: ./.github/workflows/_BuildALGoProject.yaml 89 | secrets: inherit 90 | with: 91 | shell: ${{ matrix.githubRunnerShell }} 92 | runsOn: ${{ matrix.githubRunner }} 93 | checkoutRef: ${{ github.event_name == 'pull_request' && github.sha || format('refs/pull/{0}/merge', github.event.pull_request.number) }} 94 | project: ${{ matrix.project }} 95 | projectName: ${{ matrix.projectName }} 96 | buildMode: ${{ matrix.buildMode }} 97 | projectDependenciesJson: ${{ needs.Initialization.outputs.projectDependenciesJson }} 98 | baselineWorkflowRunId: ${{ needs.Initialization.outputs.baselineWorkflowRunId }} 99 | secrets: 'licenseFileUrl,keyVaultCertificateUrl,*keyVaultCertificatePassword,keyVaultClientId,gitHubPackagesContext,applicationInsightsConnectionString' 100 | publishThisBuildArtifacts: ${{ needs.Initialization.outputs.workflowDepth > 1 }} 101 | artifactsNameSuffix: 'PR${{ github.event.number }}' 102 | 103 | StatusCheck: 104 | needs: [ Initialization, Build ] 105 | if: (!cancelled()) 106 | runs-on: [ windows-latest ] 107 | name: Pull Request Status Check 108 | steps: 109 | - name: Pull Request Status Check 110 | id: PullRequestStatusCheck 111 | uses: microsoft/AL-Go/Actions/PullRequestStatusCheck@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 112 | env: 113 | GITHUB_TOKEN: ${{ github.token }} 114 | with: 115 | shell: powershell 116 | 117 | - name: Finalize the workflow 118 | id: PostProcess 119 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 120 | if: success() || failure() 121 | env: 122 | GITHUB_TOKEN: ${{ github.token }} 123 | with: 124 | shell: powershell 125 | telemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} 126 | currentJobContext: ${{ toJson(job) }} 127 | -------------------------------------------------------------------------------- /.github/workflows/Troubleshooting.yaml: -------------------------------------------------------------------------------- 1 | name: 'Troubleshooting' 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | displayNameOfSecrets: 7 | description: Display the name (not the value) of secrets available to the repository 8 | type: boolean 9 | default: false 10 | 11 | permissions: 12 | actions: read 13 | contents: read 14 | 15 | defaults: 16 | run: 17 | shell: powershell 18 | 19 | env: 20 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 21 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 22 | 23 | jobs: 24 | Troubleshooting: 25 | runs-on: [ windows-latest ] 26 | steps: 27 | - name: Checkout 28 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 29 | with: 30 | lfs: true 31 | 32 | - name: Troubleshooting 33 | uses: microsoft/AL-Go/Actions/Troubleshooting@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 34 | with: 35 | shell: powershell 36 | gitHubSecrets: ${{ toJson(secrets) }} 37 | displayNameOfSecrets: ${{ github.event.inputs.displayNameOfSecrets }} 38 | -------------------------------------------------------------------------------- /.github/workflows/UpdateGitHubGoSystemFiles.yaml: -------------------------------------------------------------------------------- 1 | name: ' Update AL-Go System Files' 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | templateUrl: 7 | description: Template Repository URL (current is https://github.com/microsoft/AL-Go-AppSource@preview) 8 | required: false 9 | default: '' 10 | downloadLatest: 11 | description: Download latest from template repository 12 | type: boolean 13 | default: true 14 | directCommit: 15 | description: Direct Commit? 16 | type: boolean 17 | default: false 18 | 19 | permissions: 20 | actions: read 21 | contents: read 22 | id-token: write 23 | 24 | defaults: 25 | run: 26 | shell: powershell 27 | 28 | env: 29 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 30 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 31 | 32 | jobs: 33 | UpdateALGoSystemFiles: 34 | name: 'Update AL-Go System Files' 35 | needs: [ ] 36 | runs-on: [ windows-latest ] 37 | steps: 38 | - name: Dump Workflow Information 39 | uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 40 | with: 41 | shell: powershell 42 | 43 | - name: Checkout 44 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 45 | 46 | - name: Initialize the workflow 47 | id: init 48 | uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 49 | with: 50 | shell: powershell 51 | 52 | - name: Read settings 53 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 54 | with: 55 | shell: powershell 56 | get: templateUrl 57 | 58 | - name: Read secrets 59 | id: ReadSecrets 60 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 61 | with: 62 | shell: powershell 63 | gitHubSecrets: ${{ toJson(secrets) }} 64 | getSecrets: 'ghTokenWorkflow' 65 | 66 | - name: Override templateUrl 67 | env: 68 | templateUrl: ${{ github.event.inputs.templateUrl }} 69 | run: | 70 | $errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 71 | $templateUrl = $ENV:templateUrl 72 | if ($templateUrl) { 73 | Write-Host "Using Template Url: $templateUrl" 74 | Add-Content -Encoding UTF8 -Path $env:GITHUB_ENV -Value "templateUrl=$templateUrl" 75 | } 76 | 77 | - name: Calculate Input 78 | env: 79 | directCommit: '${{ github.event.inputs.directCommit }}' 80 | downloadLatest: ${{ github.event.inputs.downloadLatest }} 81 | eventName: ${{ github.event_name }} 82 | run: | 83 | $errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 84 | $directCommit = $ENV:directCommit 85 | $downloadLatest = $ENV:downloadLatest 86 | Write-Host $ENV:eventName 87 | if ($ENV:eventName -eq 'schedule') { 88 | Write-Host "Running Update AL-Go System Files on a schedule. Setting DirectCommit and DownloadLatest to true" 89 | $directCommit = 'true' 90 | $downloadLatest = 'true' 91 | } 92 | Add-Content -Encoding UTF8 -Path $env:GITHUB_ENV -Value "directCommit=$directCommit" 93 | Add-Content -Encoding UTF8 -Path $env:GITHUB_ENV -Value "downloadLatest=$downloadLatest" 94 | 95 | - name: Update AL-Go system files 96 | uses: microsoft/AL-Go/Actions/CheckForUpdates@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 97 | with: 98 | shell: powershell 99 | token: ${{ fromJson(steps.ReadSecrets.outputs.Secrets).ghTokenWorkflow }} 100 | downloadLatest: ${{ env.downloadLatest }} 101 | update: 'Y' 102 | templateUrl: ${{ env.templateUrl }} 103 | directCommit: ${{ env.directCommit }} 104 | 105 | - name: Finalize the workflow 106 | if: always() 107 | uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 108 | env: 109 | GITHUB_TOKEN: ${{ github.token }} 110 | with: 111 | shell: powershell 112 | telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} 113 | currentJobContext: ${{ toJson(job) }} 114 | -------------------------------------------------------------------------------- /.github/workflows/_BuildALGoProject.yaml: -------------------------------------------------------------------------------- 1 | name: '_Build AL-Go project' 2 | 3 | run-name: 'Build ${{ inputs.project }}' 4 | 5 | on: 6 | workflow_call: 7 | inputs: 8 | shell: 9 | description: Shell in which you want to run the action (powershell or pwsh) 10 | required: false 11 | default: powershell 12 | type: string 13 | runsOn: 14 | description: JSON-formatted string of the types of machine to run the build job on 15 | required: true 16 | type: string 17 | checkoutRef: 18 | description: Ref to checkout 19 | required: false 20 | default: ${{ github.sha }} 21 | type: string 22 | project: 23 | description: Name of the built project 24 | required: true 25 | type: string 26 | projectName: 27 | description: Friendly name of the built project 28 | required: true 29 | type: string 30 | projectDependenciesJson: 31 | description: Dependencies of the built project in compressed Json format 32 | required: false 33 | default: '{}' 34 | type: string 35 | buildMode: 36 | description: Build mode used when building the artifacts 37 | required: true 38 | type: string 39 | baselineWorkflowRunId: 40 | description: ID of the baseline workflow run, from where to download the current project dependencies, in case they are not built in the current workflow run 41 | required: false 42 | default: '0' 43 | type: string 44 | secrets: 45 | description: A comma-separated string with the names of the secrets, required for the workflow. 46 | required: false 47 | default: '' 48 | type: string 49 | publishThisBuildArtifacts: 50 | description: Flag indicating whether this build artifacts should be published 51 | type: boolean 52 | default: false 53 | publishArtifacts: 54 | description: Flag indicating whether the artifacts should be published 55 | type: boolean 56 | default: false 57 | artifactsNameSuffix: 58 | description: Suffix to add to the artifacts names 59 | required: false 60 | default: '' 61 | type: string 62 | signArtifacts: 63 | description: Flag indicating whether the apps should be signed 64 | type: boolean 65 | default: false 66 | useArtifactCache: 67 | description: Flag determining whether to use the Artifacts Cache 68 | type: boolean 69 | default: false 70 | 71 | permissions: 72 | actions: read 73 | contents: read 74 | id-token: write 75 | 76 | env: 77 | ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} 78 | ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} 79 | 80 | jobs: 81 | BuildALGoProject: 82 | needs: [ ] 83 | runs-on: ${{ fromJson(inputs.runsOn) }} 84 | defaults: 85 | run: 86 | shell: ${{ inputs.shell }} 87 | name: ${{ inputs.projectName }} (${{ inputs.buildMode }}) 88 | steps: 89 | - name: Checkout 90 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 91 | with: 92 | ref: ${{ inputs.checkoutRef }} 93 | lfs: true 94 | 95 | - name: Read settings 96 | uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 97 | with: 98 | shell: ${{ inputs.shell }} 99 | project: ${{ inputs.project }} 100 | get: useCompilerFolder,keyVaultCodesignCertificateName,doNotSignApps,doNotRunTests,artifact,generateDependencyArtifact,trustedSigning 101 | 102 | - name: Read secrets 103 | id: ReadSecrets 104 | if: github.event_name != 'pull_request' 105 | uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 106 | with: 107 | shell: ${{ inputs.shell }} 108 | gitHubSecrets: ${{ toJson(secrets) }} 109 | getSecrets: '${{ inputs.secrets }},appDependencySecrets,AZURE_CREDENTIALS' 110 | 111 | - name: Determine ArtifactUrl 112 | uses: microsoft/AL-Go/Actions/DetermineArtifactUrl@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 113 | id: determineArtifactUrl 114 | with: 115 | shell: ${{ inputs.shell }} 116 | project: ${{ inputs.project }} 117 | 118 | - name: Cache Business Central Artifacts 119 | if: env.useCompilerFolder == 'True' && inputs.useArtifactCache && env.artifactCacheKey 120 | uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 121 | with: 122 | path: .artifactcache 123 | key: ${{ env.artifactCacheKey }} 124 | 125 | - name: Download Project Dependencies 126 | id: DownloadProjectDependencies 127 | uses: microsoft/AL-Go/Actions/DownloadProjectDependencies@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 128 | env: 129 | Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' 130 | with: 131 | shell: ${{ inputs.shell }} 132 | project: ${{ inputs.project }} 133 | buildMode: ${{ inputs.buildMode }} 134 | projectsDependenciesJson: ${{ inputs.projectDependenciesJson }} 135 | baselineWorkflowRunId: ${{ inputs.baselineWorkflowRunId }} 136 | 137 | - name: Build 138 | uses: microsoft/AL-Go/Actions/RunPipeline@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 139 | env: 140 | Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' 141 | BuildMode: ${{ inputs.buildMode }} 142 | with: 143 | shell: ${{ inputs.shell }} 144 | artifact: ${{ env.artifact }} 145 | project: ${{ inputs.project }} 146 | buildMode: ${{ inputs.buildMode }} 147 | installAppsJson: ${{ steps.DownloadProjectDependencies.outputs.DownloadedApps }} 148 | installTestAppsJson: ${{ steps.DownloadProjectDependencies.outputs.DownloadedTestApps }} 149 | 150 | - name: Sign 151 | if: inputs.signArtifacts && env.doNotSignApps == 'False' && (env.keyVaultCodesignCertificateName != '' || (fromJson(env.trustedSigning).Endpoint != '' && fromJson(env.trustedSigning).Account != '' && fromJson(env.trustedSigning).CertificateProfile != '')) 152 | id: sign 153 | uses: microsoft/AL-Go/Actions/Sign@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 154 | with: 155 | shell: ${{ inputs.shell }} 156 | azureCredentialsJson: '${{ fromJson(steps.ReadSecrets.outputs.Secrets).AZURE_CREDENTIALS }}' 157 | pathToFiles: '${{ inputs.project }}/.buildartifacts/Apps/*.app' 158 | 159 | - name: Calculate Artifact names 160 | id: calculateArtifactsNames 161 | uses: microsoft/AL-Go/Actions/CalculateArtifactNames@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 162 | if: success() || failure() 163 | with: 164 | shell: ${{ inputs.shell }} 165 | project: ${{ inputs.project }} 166 | buildMode: ${{ inputs.buildMode }} 167 | suffix: ${{ inputs.artifactsNameSuffix }} 168 | 169 | - name: Upload thisbuild artifacts - apps 170 | if: inputs.publishThisBuildArtifacts 171 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 172 | with: 173 | name: ${{ steps.calculateArtifactsNames.outputs.ThisBuildAppsArtifactsName }} 174 | path: '${{ inputs.project }}/.buildartifacts/Apps/' 175 | if-no-files-found: ignore 176 | retention-days: 1 177 | 178 | - name: Upload thisbuild artifacts - dependencies 179 | if: inputs.publishThisBuildArtifacts 180 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 181 | with: 182 | name: ${{ steps.calculateArtifactsNames.outputs.ThisBuildDependenciesArtifactsName }} 183 | path: '${{ inputs.project }}/.buildartifacts/Dependencies/' 184 | if-no-files-found: ignore 185 | retention-days: 1 186 | 187 | - name: Upload thisbuild artifacts - test apps 188 | if: inputs.publishThisBuildArtifacts 189 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 190 | with: 191 | name: ${{ steps.calculateArtifactsNames.outputs.ThisBuildTestAppsArtifactsName }} 192 | path: '${{ inputs.project }}/.buildartifacts/TestApps/' 193 | if-no-files-found: ignore 194 | retention-days: 1 195 | 196 | - name: Publish artifacts - apps 197 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 198 | if: inputs.publishArtifacts 199 | with: 200 | name: ${{ steps.calculateArtifactsNames.outputs.AppsArtifactsName }} 201 | path: '${{ inputs.project }}/.buildartifacts/Apps/' 202 | if-no-files-found: ignore 203 | 204 | - name: Publish artifacts - dependencies 205 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 206 | if: inputs.publishArtifacts && env.generateDependencyArtifact == 'True' 207 | with: 208 | name: ${{ steps.calculateArtifactsNames.outputs.DependenciesArtifactsName }} 209 | path: '${{ inputs.project }}/.buildartifacts/Dependencies/' 210 | if-no-files-found: ignore 211 | 212 | - name: Publish artifacts - test apps 213 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 214 | if: inputs.publishArtifacts 215 | with: 216 | name: ${{ steps.calculateArtifactsNames.outputs.TestAppsArtifactsName }} 217 | path: '${{ inputs.project }}/.buildartifacts/TestApps/' 218 | if-no-files-found: ignore 219 | 220 | - name: Publish artifacts - build output 221 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 222 | if: (success() || failure()) && (hashFiles(format('{0}/BuildOutput.txt',inputs.project)) != '') 223 | with: 224 | name: ${{ steps.calculateArtifactsNames.outputs.BuildOutputArtifactsName }} 225 | path: '${{ inputs.project }}/BuildOutput.txt' 226 | if-no-files-found: ignore 227 | 228 | - name: Publish artifacts - container event log 229 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 230 | if: (failure()) && (hashFiles(format('{0}/ContainerEventLog.evtx',inputs.project)) != '') 231 | with: 232 | name: ${{ steps.calculateArtifactsNames.outputs.ContainerEventLogArtifactsName }} 233 | path: '${{ inputs.project }}/ContainerEventLog.evtx' 234 | if-no-files-found: ignore 235 | 236 | - name: Publish artifacts - test results 237 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 238 | if: (success() || failure()) && (hashFiles(format('{0}/.buildartifacts/TestResults.xml',inputs.project)) != '') 239 | with: 240 | name: ${{ steps.calculateArtifactsNames.outputs.TestResultsArtifactsName }} 241 | path: '${{ inputs.project }}/.buildartifacts/TestResults.xml' 242 | if-no-files-found: ignore 243 | 244 | - name: Publish artifacts - bcpt test results 245 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 246 | if: (success() || failure()) && (hashFiles(format('{0}/.buildartifacts/bcptTestResults.json',inputs.project)) != '') 247 | with: 248 | name: ${{ steps.calculateArtifactsNames.outputs.BcptTestResultsArtifactsName }} 249 | path: '${{ inputs.project }}/.buildartifacts/bcptTestResults.json' 250 | if-no-files-found: ignore 251 | 252 | - name: Publish artifacts - page scripting test results 253 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 254 | if: (success() || failure()) && (hashFiles(format('{0}/.buildartifacts/PageScriptingTestResults.xml',inputs.project)) != '') 255 | with: 256 | name: ${{ steps.calculateArtifactsNames.outputs.PageScriptingTestResultsArtifactsName }} 257 | path: '${{ inputs.project }}/.buildartifacts/PageScriptingTestResults.xml' 258 | if-no-files-found: ignore 259 | 260 | - name: Publish artifacts - page scripting test result details 261 | uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 262 | if: (success() || failure()) 263 | with: 264 | name: ${{ steps.calculateArtifactsNames.outputs.PageScriptingTestResultDetailsArtifactsName }} 265 | path: '${{ inputs.project }}/.buildartifacts/PageScriptingTestResultDetails/' 266 | if-no-files-found: ignore 267 | 268 | - name: Analyze Test Results 269 | id: analyzeTestResults 270 | if: (success() || failure()) && env.doNotRunTests == 'False' 271 | uses: microsoft/AL-Go/Actions/AnalyzeTests@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 272 | with: 273 | shell: ${{ inputs.shell }} 274 | project: ${{ inputs.project }} 275 | 276 | - name: Cleanup 277 | if: always() 278 | uses: microsoft/AL-Go/Actions/PipelineCleanup@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 279 | with: 280 | shell: ${{ inputs.shell }} 281 | project: ${{ inputs.project }} 282 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.app 2 | *.flf 3 | *.bclicense 4 | *.g.xlf 5 | .DS_Store 6 | Thumbs.db 7 | TestResults*.xml 8 | bcptTestResults*.json 9 | BuildOutput.txt 10 | rad.json 11 | .output/ 12 | .dependencies/ 13 | .buildartifacts/ 14 | .alpackages/ 15 | .packages/ 16 | .alcache/ 17 | .altemplates/ 18 | .snapshots/ 19 | cache_* 20 | ~$* 21 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Microsoft Open Source Code of Conduct 2 | 3 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 4 | 5 | Resources: 6 | 7 | - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) 8 | - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) 9 | - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [PREVIEW] AL-Go Template 2 | 3 | ## AppSource App Project 4 | This template repository can be used for managing AppSource Apps for Business Central. 5 | 6 | It is the preview version of https://github.com/microsoft/AL-Go-AppSource. 7 | 8 | [![Use this template](https://github.com/microsoft/AL-Go/assets/10775043/ca1ecc85-2fd3-4ab5-a866-bd2e7e80259d)](https://github.com/new?template_name=AL-Go-AppSource-Preview&template_owner=microsoft) 9 | 10 | Please consult https://github.com/microsoft/AL-Go/#readme for scenarios on usage 11 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). 40 | 41 | 42 | -------------------------------------------------------------------------------- /SUPPORT.md: -------------------------------------------------------------------------------- 1 | # TODO: The maintainer of this repo has not yet edited this file 2 | 3 | **REPO OWNER**: Do you want Customer Service & Support (CSS) support for this product/project? 4 | 5 | - **No CSS support:** Fill out this template with information about how to file issues and get help. 6 | - **Yes CSS support:** Fill out an intake form at [aka.ms/onboardsupport](https://aka.ms/onboardsupport). CSS will work with/help you to determine next steps. 7 | - **Not sure?** Fill out an intake as though the answer were "Yes". CSS will help you decide. 8 | 9 | *Then remove this first heading from this SUPPORT.MD file before publishing your repo.* 10 | 11 | # Support 12 | 13 | ## How to file issues and get help 14 | 15 | This project uses GitHub Issues to track bugs and feature requests. Please search the existing 16 | issues before filing new issues to avoid duplicates. For new issues, file your bug or 17 | feature request as a new Issue. 18 | 19 | For help and questions about using this project, please **REPO MAINTAINER: INSERT INSTRUCTIONS HERE 20 | FOR HOW TO ENGAGE REPO OWNERS OR COMMUNITY FOR HELP. COULD BE A STACK OVERFLOW TAG OR OTHER 21 | CHANNEL. WHERE WILL YOU HELP PEOPLE?**. 22 | 23 | ## Microsoft Support Policy 24 | 25 | Support for this **PROJECT or PRODUCT** is limited to the resources listed above. 26 | -------------------------------------------------------------------------------- /al.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": ".AL-Go" 5 | } 6 | ], 7 | "settings": { 8 | 9 | } 10 | } 11 | --------------------------------------------------------------------------------