From 8eb865982f71beed8b480c28f9906e8240b39e5f Mon Sep 17 00:00:00 2001 From: aholstrup1 Date: Thu, 5 Feb 2026 14:17:49 +0100 Subject: [PATCH 1/7] Consider buildmode during publish to environment --- .../DetermineDeploymentEnvironments.ps1 | 4 ++- .../GetArtifactsForDeployment.ps1 | 26 ++++++++++++++----- Actions/GetArtifactsForDeployment/action.yaml | 7 ++++- .../workflows/PublishToEnvironment.yaml | 1 + .../workflows/PublishToEnvironment.yaml | 1 + 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/Actions/DetermineDeploymentEnvironments/DetermineDeploymentEnvironments.ps1 b/Actions/DetermineDeploymentEnvironments/DetermineDeploymentEnvironments.ps1 index 43fe98a732..5719ef5735 100644 --- a/Actions/DetermineDeploymentEnvironments/DetermineDeploymentEnvironments.ps1 +++ b/Actions/DetermineDeploymentEnvironments/DetermineDeploymentEnvironments.ps1 @@ -285,7 +285,9 @@ else { $json = @{"matrix" = @{ "include" = @() }; "fail-fast" = $false } $deploymentEnvironments.Keys | Sort-Object | ForEach-Object { $deploymentEnvironment = $deploymentEnvironments."$_" - $json.matrix.include += @{ "environment" = $_; "os" = "$(ConvertTo-Json -InputObject @($deploymentEnvironment."runs-on".Split(',').Trim()) -compress)"; "shell" = $deploymentEnvironment."shell" } + $buildMode = $deploymentEnvironment."buildMode" + if ($null -eq $buildMode) { $buildMode = "Default" } + $json.matrix.include += @{ "environment" = $_; "os" = "$(ConvertTo-Json -InputObject @($deploymentEnvironment."runs-on".Split(',').Trim()) -compress)"; "shell" = $deploymentEnvironment."shell"; "buildMode" = $buildMode } } $environmentsMatrixJson = $json | ConvertTo-Json -Depth 99 -compress Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "EnvironmentsMatrixJson=$environmentsMatrixJson" diff --git a/Actions/GetArtifactsForDeployment/GetArtifactsForDeployment.ps1 b/Actions/GetArtifactsForDeployment/GetArtifactsForDeployment.ps1 index 30c2f5e7c4..3922f49702 100644 --- a/Actions/GetArtifactsForDeployment/GetArtifactsForDeployment.ps1 +++ b/Actions/GetArtifactsForDeployment/GetArtifactsForDeployment.ps1 @@ -4,16 +4,29 @@ Param( [Parameter(HelpMessage = "Artifacts version to download (current, prerelease, draft, latest or version number)", Mandatory = $true)] [string] $artifactsVersion, [Parameter(HelpMessage = "Folder in which the artifacts will be downloaded", Mandatory = $true)] - [string] $artifactsFolder + [string] $artifactsFolder, + [Parameter(HelpMessage = "Build mode used when building the artifacts", Mandatory = $false)] + [string] $buildMode = 'Default' ) Import-Module (Join-Path -Path $PSScriptRoot "GetArtifactsForDeployment.psm1") . (Join-Path -Path $PSScriptRoot -ChildPath "..\AL-Go-Helper.ps1" -Resolve) DownloadAndImportBcContainerHelper +# If buildMode is 'Default', set it to empty string (no prefix in artifact names) +if ($buildMode -eq 'Default') { + $buildMode = '' +} + # Get artifacts for all projects $projects = "*" -$artifactsToDownload = @("Apps","TestApps","Dependencies","PowerPlatformSolution") + +# Default artifact types (used for releases which only support default buildMode) +$defaultArtifactTypes = @("Apps","TestApps","Dependencies","PowerPlatformSolution") + +# Artifact types with buildMode prefix (used for workflow artifacts) +# PowerPlatformSolution is always built with 'default' buildMode, so it never has a prefix +$buildModeArtifactTypes = @("$($buildMode)Apps","$($buildMode)TestApps","$($buildMode)Dependencies","PowerPlatformSolution") Write-Host "Get artifacts for version: '$artifactsVersion' for these projects: '$projects' to folder: '$artifactsFolder'" @@ -38,7 +51,8 @@ if ($artifactsVersion -eq "current" -or $artifactsVersion -eq "prerelease" -or $ if (!($release)) { throw "Unable to locate $artifactsVersion release" } - $artifactsToDownload | ForEach-Object { + # Releases only contain default buildMode artifacts + $defaultArtifactTypes | ForEach-Object { DownloadRelease -token $token -projects $projects -api_url $ENV:GITHUB_API_URL -repository $ENV:GITHUB_REPOSITORY -release $release -path $artifactsFolder -mask $_ -unpack } } @@ -72,13 +86,13 @@ elseif ($artifactsVersion -like "PR_*") { $expiredArtifacts = @() $lastKnownGoodBuildArtifacts = @() # Get PR artifacts - $artifactsToDownload | ForEach-Object { + $buildModeArtifactTypes | ForEach-Object { $prArtifacts += GetArtifactsFromWorkflowRun -workflowRun $latestPRBuildId -token $token -api_url $ENV:GITHUB_API_URL -repository $ENV:GITHUB_REPOSITORY -mask $_ -projects $projects -expiredArtifacts ([ref]$expiredArtifacts) } # Get last known good build artifacts referenced from PR if ($lastKnownGoodBuildId -ne 0) { Write-Host "Last known good build id: $lastKnownGoodBuildId" - $artifactsToDownload | ForEach-Object { + $buildModeArtifactTypes | ForEach-Object { $lastKnownGoodBuildArtifacts += GetArtifactsFromWorkflowRun -workflowRun $lastKnownGoodBuildId -token $token -api_url $ENV:GITHUB_API_URL -repository $ENV:GITHUB_REPOSITORY -mask $_ -projects $projects -expiredArtifacts ([ref]$expiredArtifacts) } } @@ -106,7 +120,7 @@ else { if ($searchArtifacts) { $allArtifacts = @() - $artifactsToDownload | ForEach-Object { + $buildModeArtifactTypes | ForEach-Object { $allArtifacts += @(GetArtifacts -token $token -api_url $ENV:GITHUB_API_URL -repository $ENV:GITHUB_REPOSITORY -mask $_ -projects $projects -version $artifactsVersion -branch $ENV:GITHUB_REF_NAME) } if ($allArtifacts) { diff --git a/Actions/GetArtifactsForDeployment/action.yaml b/Actions/GetArtifactsForDeployment/action.yaml index 67e1578128..5d41a20b34 100644 --- a/Actions/GetArtifactsForDeployment/action.yaml +++ b/Actions/GetArtifactsForDeployment/action.yaml @@ -15,6 +15,10 @@ inputs: artifactsFolder: description: Folder in which the artifacts will be downloaded required: true + buildMode: + description: Build mode used when building the artifacts + required: false + default: 'Default' runs: using: composite steps: @@ -24,9 +28,10 @@ runs: _token: ${{ inputs.token }} _artifactsVersion: ${{ inputs.artifactsVersion }} _artifactsFolder: ${{ inputs.artifactsFolder }} + _buildMode: ${{ inputs.buildMode }} run: | ${{ github.action_path }}/../Invoke-AlGoAction.ps1 -ActionName "GetArtifactsForDeployment" -Action { - ${{ github.action_path }}/GetArtifactsForDeployment.ps1 -token $ENV:_token -artifactsVersion $ENV:_artifactsVersion -artifactsFolder $ENV:_artifactsFolder + ${{ github.action_path }}/GetArtifactsForDeployment.ps1 -token $ENV:_token -artifactsVersion $ENV:_artifactsVersion -artifactsFolder $ENV:_artifactsFolder -buildMode $ENV:_buildMode } branding: icon: terminal diff --git a/Templates/AppSource App/.github/workflows/PublishToEnvironment.yaml b/Templates/AppSource App/.github/workflows/PublishToEnvironment.yaml index 710d401195..e60df4fc8f 100644 --- a/Templates/AppSource App/.github/workflows/PublishToEnvironment.yaml +++ b/Templates/AppSource App/.github/workflows/PublishToEnvironment.yaml @@ -169,6 +169,7 @@ jobs: shell: ${{ matrix.shell }} artifactsVersion: ${{ github.event.inputs.appVersion }} artifactsFolder: '.artifacts' + buildMode: ${{ matrix.buildMode }} - name: Deploy to Business Central id: Deploy diff --git a/Templates/Per Tenant Extension/.github/workflows/PublishToEnvironment.yaml b/Templates/Per Tenant Extension/.github/workflows/PublishToEnvironment.yaml index 710d401195..e60df4fc8f 100644 --- a/Templates/Per Tenant Extension/.github/workflows/PublishToEnvironment.yaml +++ b/Templates/Per Tenant Extension/.github/workflows/PublishToEnvironment.yaml @@ -169,6 +169,7 @@ jobs: shell: ${{ matrix.shell }} artifactsVersion: ${{ github.event.inputs.appVersion }} artifactsFolder: '.artifacts' + buildMode: ${{ matrix.buildMode }} - name: Deploy to Business Central id: Deploy From a61571dd7596915296f852e833ac60fa57416cc6 Mon Sep 17 00:00:00 2001 From: aholstrup1 Date: Thu, 5 Feb 2026 18:02:56 +0100 Subject: [PATCH 2/7] releasenotes --- RELEASENOTES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index aab396709e..aba20b188f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,3 +1,7 @@ +### Issues + +- Issue 2107 Publish a specific build mode to an environment + ## v8.2 ### Issues From 12e569fd465d4e8c0110f1acc8090b9e2179c803 Mon Sep 17 00:00:00 2001 From: aholstrup1 Date: Thu, 5 Feb 2026 18:26:57 +0100 Subject: [PATCH 3/7] Add buildmode to EnvironmentsMatrixJson --- Tests/DetermineDeploymentEnvironments.Test.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/DetermineDeploymentEnvironments.Test.ps1 b/Tests/DetermineDeploymentEnvironments.Test.ps1 index e577b2177c..75e9ed835c 100644 --- a/Tests/DetermineDeploymentEnvironments.Test.ps1 +++ b/Tests/DetermineDeploymentEnvironments.Test.ps1 @@ -58,13 +58,13 @@ Describe "DetermineDeploymentEnvironments Action Test" { $env:Settings = @{ "type" = "PTE"; "runs-on" = "ubuntu-latest"; "shell" = "pwsh"; "environments" = @(); "excludeEnvironments" = @( 'github-pages' ); "alDoc" = @{ "continuousDeployment" = $false; "deployToGitHubPages" = $false } } | ConvertTo-Json -Compress . (Join-Path $scriptRoot $scriptName) -getEnvironments '*' -type 'CD' PassGeneratedOutput - $EnvironmentsMatrixJson | ConvertFrom-Json | ConvertTo-HashTable -recurse | Should -MatchHashtable @{"matrix"=@{"include"=@(@{"environment"="another";"os"="[""ubuntu-latest""]";"shell"="pwsh"};@{"environment"="test";"os"="[""ubuntu-latest""]";"shell"="pwsh"})};"fail-fast"=$false} + $EnvironmentsMatrixJson | ConvertFrom-Json | ConvertTo-HashTable -recurse | Should -MatchHashtable @{"matrix"=@{"include"=@(@{"environment"="another";"os"="[""ubuntu-latest""]";"shell"="pwsh";"buildMode"="Default"};@{"environment"="test";"os"="[""ubuntu-latest""]";"shell"="pwsh";"buildMode"="Default"})};"fail-fast"=$false} $DeploymentEnvironmentsJson | ConvertFrom-Json | ConvertTo-HashTable -recurse | Should -MatchHashtable @{"test"=@{"EnvironmentType"="SaaS";"EnvironmentName"="test";"Branches"=@();"BranchesFromPolicy"=@();"Projects"="*";"DependencyInstallMode"="install";"Scope"=$null;"syncMode"=$null;"buildMode"=$null;"continuousDeployment"=$null;"runs-on"=@("ubuntu-latest");"shell"="pwsh";"ppEnvironmentUrl"="";"companyId"="";"includeTestAppsInSandboxEnvironment"=$false;"excludeAppIds"=@()};"another"=@{"EnvironmentType"="SaaS";"EnvironmentName"="another";"Branches"=@();"BranchesFromPolicy"=@();"Projects"="*";"DependencyInstallMode"="install";"Scope"=$null;"syncMode"=$null;"buildMode"=$null;"continuousDeployment"=$null;"runs-on"=@("ubuntu-latest");"shell"="pwsh";"ppEnvironmentUrl"="";"companyId"="";"includeTestAppsInSandboxEnvironment"=$false;"excludeAppIds"=@()}} $EnvironmentCount | Should -Be 2 . (Join-Path $scriptRoot $scriptName) -getEnvironments 'test' -type 'CD' PassGeneratedOutput - $EnvironmentsMatrixJson | ConvertFrom-Json | ConvertTo-HashTable -recurse | Should -MatchHashtable @{"matrix"=@{"include"=@(@{"environment"="test";"os"="[""ubuntu-latest""]";"shell"="pwsh"})};"fail-fast"=$false} + $EnvironmentsMatrixJson | ConvertFrom-Json | ConvertTo-HashTable -recurse | Should -MatchHashtable @{"matrix"=@{"include"=@(@{"environment"="test";"os"="[""ubuntu-latest""]";"shell"="pwsh";"buildMode"="Default"})};"fail-fast"=$false} $DeploymentEnvironmentsJson | ConvertFrom-Json | ConvertTo-HashTable -recurse | Should -MatchHashtable @{"test"=@{"EnvironmentType"="SaaS";"EnvironmentName"="test";"Branches"=@();"BranchesFromPolicy"=@();"Projects"="*";"DependencyInstallMode"="install";"Scope"=$null;"syncMode"=$null;"buildMode"=$null;"continuousDeployment"=$null;"runs-on"=@("ubuntu-latest");"shell"="pwsh";"ppEnvironmentUrl"="";"companyId"="";"includeTestAppsInSandboxEnvironment"=$false;"excludeAppIds"=@()}} $EnvironmentCount | Should -Be 1 } @@ -81,7 +81,7 @@ Describe "DetermineDeploymentEnvironments Action Test" { $env:Settings = @{ "type" = "PTE"; "runs-on" = "ubuntu-latest"; "shell" = "pwsh"; "environments" = @(); "excludeEnvironments" = @( 'github-pages' ); "alDoc" = @{ "continuousDeployment" = $false; "deployToGitHubPages" = $false } } | ConvertTo-Json -Compress . (Join-Path $scriptRoot $scriptName) -getEnvironments '*' -type 'CD' PassGeneratedOutput - $EnvironmentsMatrixJson | ConvertFrom-Json | ConvertTo-HashTable -recurse | Should -MatchHashtable @{"matrix"=@{"include"=@(@{"environment"="another";"os"="[""ubuntu-latest""]";"shell"="pwsh"})};"fail-fast"=$false} + $EnvironmentsMatrixJson | ConvertFrom-Json | ConvertTo-HashTable -recurse | Should -MatchHashtable @{"matrix"=@{"include"=@(@{"environment"="another";"os"="[""ubuntu-latest""]";"shell"="pwsh";"buildMode"="Default"})};"fail-fast"=$false} $DeploymentEnvironmentsJson | ConvertFrom-Json | ConvertTo-HashTable -recurse | Should -MatchHashtable @{"another"=@{"EnvironmentType"="SaaS";"EnvironmentName"="another";"Branches"=@();"BranchesFromPolicy"=@();"Projects"="*";"DependencyInstallMode"="install";"Scope"=$null;"syncMode"=$null;"buildMode"=$null;"continuousDeployment"=$null;"runs-on"=@("ubuntu-latest");"shell"="pwsh";"ppEnvironmentUrl"="";"companyId"="";"includeTestAppsInSandboxEnvironment"=$false;"excludeAppIds"=@()}} $EnvironmentCount | Should -Be 1 @@ -107,7 +107,7 @@ Describe "DetermineDeploymentEnvironments Action Test" { # Only another environment should be included when deploying from main . (Join-Path $scriptRoot $scriptName) -getEnvironments '*' -type 'CD' PassGeneratedOutput - $EnvironmentsMatrixJson | ConvertFrom-Json | ConvertTo-HashTable -recurse | Should -MatchHashtable @{"matrix"=@{"include"=@(@{"environment"="another";"os"="[""ubuntu-latest""]";"shell"="pwsh"})};"fail-fast"=$false} + $EnvironmentsMatrixJson | ConvertFrom-Json | ConvertTo-HashTable -recurse | Should -MatchHashtable @{"matrix"=@{"include"=@(@{"environment"="another";"os"="[""ubuntu-latest""]";"shell"="pwsh";"buildMode"="Default"})};"fail-fast"=$false} $DeploymentEnvironmentsJson | ConvertFrom-Json | ConvertTo-HashTable -recurse | Should -MatchHashtable @{"another"=@{"EnvironmentType"="SaaS";"EnvironmentName"="another";"Branches"=@();"BranchesFromPolicy"=@();"Projects"="*";"DependencyInstallMode"="install";"Scope"=$null;"syncMode"=$null;"buildMode"=$null;"continuousDeployment"=$null;"runs-on"=@("ubuntu-latest");"shell"="pwsh";"ppEnvironmentUrl"="";"companyId"="";"includeTestAppsInSandboxEnvironment"=$false;"excludeAppIds"=@()}} $EnvironmentCount | Should -Be 1 ($EnvironmentsMatrixJson | ConvertFrom-Json | ConvertTo-HashTable -recurse).matrix.include.environment | Should -Contain "another" From 403196dda62bad3ddcbe66e3522d387bc4ef833f Mon Sep 17 00:00:00 2001 From: aholstrup1 Date: Fri, 6 Feb 2026 08:07:21 +0100 Subject: [PATCH 4/7] Small change --- .../DetermineDeploymentEnvironments.ps1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Actions/DetermineDeploymentEnvironments/DetermineDeploymentEnvironments.ps1 b/Actions/DetermineDeploymentEnvironments/DetermineDeploymentEnvironments.ps1 index 5719ef5735..6fc16f99ed 100644 --- a/Actions/DetermineDeploymentEnvironments/DetermineDeploymentEnvironments.ps1 +++ b/Actions/DetermineDeploymentEnvironments/DetermineDeploymentEnvironments.ps1 @@ -285,8 +285,10 @@ else { $json = @{"matrix" = @{ "include" = @() }; "fail-fast" = $false } $deploymentEnvironments.Keys | Sort-Object | ForEach-Object { $deploymentEnvironment = $deploymentEnvironments."$_" - $buildMode = $deploymentEnvironment."buildMode" - if ($null -eq $buildMode) { $buildMode = "Default" } + $buildMode = "Default" + if ($deploymentEnvironment.ContainsKey("buildMode") -and $deploymentEnvironment."buildMode") { + $buildMode = $deploymentEnvironment."buildMode" + } $json.matrix.include += @{ "environment" = $_; "os" = "$(ConvertTo-Json -InputObject @($deploymentEnvironment."runs-on".Split(',').Trim()) -compress)"; "shell" = $deploymentEnvironment."shell"; "buildMode" = $buildMode } } $environmentsMatrixJson = $json | ConvertTo-Json -Depth 99 -compress From bd80ee0a0086e60d235a50fb853c447b7d436ae8 Mon Sep 17 00:00:00 2001 From: aholstrup1 Date: Fri, 6 Feb 2026 08:09:21 +0100 Subject: [PATCH 5/7] readme --- Actions/GetArtifactsForDeployment/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Actions/GetArtifactsForDeployment/README.md b/Actions/GetArtifactsForDeployment/README.md index 40d153eeee..be7324665c 100644 --- a/Actions/GetArtifactsForDeployment/README.md +++ b/Actions/GetArtifactsForDeployment/README.md @@ -16,6 +16,7 @@ none | token | | The GitHub token running the action | github.token | | artifactsVersion | Yes | Artifacts version to download (current, prerelease, draft, latest or version number) | | | artifactsFolder | Yes | Folder in which the artifacts will be downloaded | | +| buildMode | | Build mode used when building the artifacts | Default | ## OUTPUT From 52683ff26d376a2bee912fba72818377f00f4cac Mon Sep 17 00:00:00 2001 From: aholstrup1 Date: Fri, 6 Feb 2026 09:51:40 +0100 Subject: [PATCH 6/7] Add test for CustomBuildMode --- .../DetermineDeploymentEnvironments.Test.ps1 | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Tests/DetermineDeploymentEnvironments.Test.ps1 b/Tests/DetermineDeploymentEnvironments.Test.ps1 index 75e9ed835c..394a9f6aa0 100644 --- a/Tests/DetermineDeploymentEnvironments.Test.ps1 +++ b/Tests/DetermineDeploymentEnvironments.Test.ps1 @@ -239,6 +239,34 @@ Describe "DetermineDeploymentEnvironments Action Test" { ($EnvironmentsMatrixJson | ConvertFrom-Json | ConvertTo-HashTable -recurse).matrix.include.environment | Should -Contain "test (PROD)" } + # Test that buildMode from DeployTo settings is correctly included in the matrix + It 'Test calling action directly - Custom buildMode from DeployTo settings is included in matrix' { + Mock InvokeWebRequest -ParameterFilter { $uri -like '*/environments' } -MockWith { + return @{"Content" = (ConvertTo-Json -Compress -Depth 99 -InputObject @{ "environments" = @( @{ "name" = "test"; "protection_rules" = @() } ) })} + } + + $settings = @{ + "type" = "PTE" + "runs-on" = "ubuntu-latest" + "shell" = "pwsh" + "environments" = @() + "excludeEnvironments" = @( 'github-pages' ) + "alDoc" = @{ "continuousDeployment" = $false; "deployToGitHubPages" = $false } + "DeployToTest" = @{ + "buildMode" = "CustomBuildMode" + } + } + + $env:Settings = $settings | ConvertTo-Json -Compress -Depth 5 + . (Join-Path $scriptRoot $scriptName) -getEnvironments '*' -type 'CD' + PassGeneratedOutput + + # Verify buildMode is correctly set to CustomBuildMode in the matrix + $matrix = $EnvironmentsMatrixJson | ConvertFrom-Json | ConvertTo-HashTable -recurse + $matrix.matrix.include[0].buildMode | Should -Be "CustomBuildMode" + $EnvironmentCount | Should -Be 1 + } + # Unknown environment - createEnvIfNotExists = false (default) - should throw error It 'Test calling action directly - Unknown environment without createEnvIfNotExists should throw' { Mock InvokeWebRequest -ParameterFilter { $uri -like '*/environments' } -MockWith { From 9534aeba6523834e594364516d3333f064cc8b08 Mon Sep 17 00:00:00 2001 From: Alexander Holstrup <117829001+aholstrup1@users.noreply.github.com> Date: Fri, 6 Feb 2026 10:13:40 +0100 Subject: [PATCH 7/7] Update Actions/GetArtifactsForDeployment/GetArtifactsForDeployment.ps1 Co-authored-by: Maria Zhelezova <43066499+mazhelez@users.noreply.github.com> --- Actions/GetArtifactsForDeployment/GetArtifactsForDeployment.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Actions/GetArtifactsForDeployment/GetArtifactsForDeployment.ps1 b/Actions/GetArtifactsForDeployment/GetArtifactsForDeployment.ps1 index 3922f49702..1491b453e6 100644 --- a/Actions/GetArtifactsForDeployment/GetArtifactsForDeployment.ps1 +++ b/Actions/GetArtifactsForDeployment/GetArtifactsForDeployment.ps1 @@ -28,7 +28,7 @@ $defaultArtifactTypes = @("Apps","TestApps","Dependencies","PowerPlatformSolutio # PowerPlatformSolution is always built with 'default' buildMode, so it never has a prefix $buildModeArtifactTypes = @("$($buildMode)Apps","$($buildMode)TestApps","$($buildMode)Dependencies","PowerPlatformSolution") -Write-Host "Get artifacts for version: '$artifactsVersion' for these projects: '$projects' to folder: '$artifactsFolder'" +Write-Host "Get artifacts for version: '$artifactsVersion' (build mode: $buildMode) for these projects: '$projects' to folder: '$artifactsFolder'" $artifactsFolder = Join-Path $ENV:GITHUB_WORKSPACE $artifactsFolder if (!(Test-Path $artifactsFolder)) {