Pipelines/Read-Settings.ps1

Param(
    [Parameter(Mandatory=$false)]
    [ValidateSet('Local', 'AzureDevOps', 'GithubActions', 'GitLab')]
    [string] $environment = 'Local',
    [string] $version = "",
    [string] $settingsFile = "",
    [string] $settingsFolder = $PSScriptRoot
)


function Merge-Hashtables {
    $Output = @{}
    ForEach ($Hashtable in ($Input + $Args)) {
        If ($Hashtable -is [Hashtable]) {
            ForEach ($Key in $Hashtable.Keys) {$Output.$Key = $Hashtable.$Key}
        }
    }
    $Output
}

$agentName = ""
if ($environment -ne 'Local') {
    $agentName = $ENV:AGENT_NAME
}

$globalsettingsFile = "$env:BUILD_SOURCESDIRECTORY\CI Scripts\AL\Pipelines\default.global.settings.json"
if (Test-Path -Path $globalsettingsFile) {
    $globalsettings = (Get-Content $globalsettingsFile -Encoding UTF8 | ConvertFrom-Json -AsHashtable)      # Powershell 7.0 only
}

if ($settingsFile -eq "") {
    $settingsFile = (Join-Path $settingsFolder "settings.json")
}

$settings = (Get-Content $settingsFile -Encoding UTF8 | ConvertFrom-Json -AsHashtable)      # Powershell 7.0 only

if ($settings.versions) {
    if ("$version" -eq "")  {
        $version = $settings.versions[0].version
        Write-Host "Version not defined, using $version"
    }

    $buildversion = $settings.versions | Where-Object { $_.version -eq $version }
} else {
    $buildversion = @{}
}

$settings = Merge-Hashtables $globalsettings $settings $buildversion

$pipelineName = "$($settings.Name)-$version"
Write-Host "Set pipelineName = $pipelineName"

if ($agentName) {
    $containerName = "$($agentName -replace '[^a-zA-Z0-9---]', '')-$($pipelineName -replace '[^a-zA-Z0-9---]', '')".ToLowerInvariant()
}
else {
    $containerName = "$($pipelineName.Replace('.','-') -replace '[^a-zA-Z0-9---]', '')".ToLowerInvariant()
}
Write-Host "Set containerName = $containerName"
if ($environment -eq 'AzureDevOps') {
    Write-Host "##vso[task.setvariable variable=containerName]$containerName"
}

$artifact = if ($settings.useArtifactWithBlob) { "$ENV:artifactVersionFromSecrets" } else { $settings.artifact }
Write-Host "Set artifact = '$artifact'"

if ($settings.installApps -isnot [array]) {
    $installApps = $settings.installApps.Split(',')
} else {
    $installApps = $settings.installApps
}
if ($settings.previousApps -isnot [array]) {
    $previousApps = $settings.previousApps.Split(',')
} else {
    $previousApps = $settings.previousApps
}

if ($settings.appendSasTokenFromSecrets) {
    $installApps = $installApps | ForEach-Object { if ($_ -like 'https://smartartifacts*') { $_ + $ENV:SASToken } else { $_ } }
    $previousApps = $previousApps | ForEach-Object { if ($_ -like 'https://smartartifacts*') { $_ + $ENV:SASToken } else { $_ } }

    Write-Host "Set modified installApps = '$installApps'"
    Write-Host "Set modified previousApps = '$previousApps'"
}

if ($settings.translationFolderBlobPath -ne "") {
    $translationFolderBlobPath = $settings.translationFolderBlobPath
    Write-Host "##vso[task.setvariable variable=translationFolderBlobPath]$translationFolderBlobPath"
}

$imageName = ""
if ($settings.cacheImage -and ("$AgentName" -ne "Hosted Agent" -and "$agentName" -ne "" -and "$AgentName" -notlike "Azure Pipelines*")) {
    $imageName = "bcimage"
}

# SO >>
#if ($previousApps -ne "")
#{
# if (Test-Path -Path $previousApps -PathType Container) {
# $previousApps = Get-ChildItem $previousApps | Where-Object {$_.Name -notlike "Microsoft*.app"} | Foreach-Object {$_.FullName}
# }
#}
# SO <<

Write-Host "SETTINGS:"
$settings