Updated AL-Go System Files #1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: ' CI/CD' | |
on: | |
workflow_dispatch: | |
push: | |
paths-ignore: | |
- '**.md' | |
- '.github/workflows/*.yaml' | |
- '!.github/workflows/CICD.yaml' | |
branches: [ 'main', 'release/*', 'feature/*' ] | |
defaults: | |
run: | |
shell: powershell | |
permissions: | |
contents: read | |
actions: read | |
env: | |
workflowDepth: 1 | |
ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} | |
ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} | |
jobs: | |
Initialization: | |
runs-on: [ windows-latest ] | |
outputs: | |
telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} | |
settings: ${{ steps.ReadSettings.outputs.SettingsJson }} | |
environments: ${{ steps.ReadSettings.outputs.EnvironmentsJson }} | |
environmentCount: ${{ steps.ReadSettings.outputs.EnvironmentCount }} | |
deliveryTargets: ${{ steps.DetermineDeliveryTargets.outputs.DeliveryTargetsJson }} | |
deliveryTargetCount: ${{ steps.DetermineDeliveryTargets.outputs.DeliveryTargetCount }} | |
githubRunner: ${{ steps.ReadSettings.outputs.GitHubRunnerJson }} | |
githubRunnerShell: ${{ steps.ReadSettings.outputs.GitHubRunnerShell }} | |
checkRunId: ${{ steps.CreateCheckRun.outputs.checkRunId }} | |
projects: ${{ steps.determineProjectsToBuild.outputs.ProjectsJson }} | |
projectDependenciesJson: ${{ steps.determineProjectsToBuild.outputs.ProjectDependenciesJson }} | |
buildOrderJson: ${{ steps.determineProjectsToBuild.outputs.BuildOrderJson }} | |
workflowDepth: ${{ steps.DetermineWorkflowDepth.outputs.WorkflowDepth }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
with: | |
lfs: true | |
- name: Initialize the workflow | |
id: init | |
uses: mazhelez/AL-Go/Actions/WorkflowInitialize@output-encoding | |
with: | |
shell: powershell | |
eventId: "DO0091" | |
- name: Read settings | |
id: ReadSettings | |
uses: mazhelez/AL-Go/Actions/ReadSettings@output-encoding | |
with: | |
shell: powershell | |
parentTelemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} | |
getEnvironments: '*' | |
- name: Determine Workflow Depth | |
id: DetermineWorkflowDepth | |
run: | | |
Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "WorkflowDepth=$($env:workflowDepth)" | |
- name: Determine Projects To Build | |
id: determineProjectsToBuild | |
uses: mazhelez/AL-Go/Actions/DetermineProjectsToBuild@output-encoding | |
with: | |
shell: powershell | |
maxBuildDepth: ${{ env.workflowDepth }} | |
- name: Determine Delivery Target Secrets | |
id: DetermineDeliveryTargetSecrets | |
run: | | |
$errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 | |
$deliveryTargetSecrets = @('GitHubPackagesContext','NuGetContext','StorageContext','AppSourceContext') | |
$namePrefix = 'DeliverTo' | |
Get-Item -Path (Join-Path $ENV:GITHUB_WORKSPACE ".github/$($namePrefix)*.ps1") | ForEach-Object { | |
$deliveryTarget = [System.IO.Path]::GetFileNameWithoutExtension($_.Name.SubString($namePrefix.Length)) | |
$deliveryTargetSecrets += @("$($deliveryTarget)Context") | |
} | |
Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "Secrets=$($deliveryTargetSecrets -join ',')" | |
- name: Read secrets | |
uses: mazhelez/AL-Go/Actions/ReadSecrets@output-encoding | |
env: | |
secrets: ${{ toJson(secrets) }} | |
with: | |
shell: powershell | |
settingsJson: ${{ env.Settings }} | |
secrets: ${{ steps.DetermineDeliveryTargetSecrets.outputs.Secrets }} | |
- name: Determine Delivery Targets | |
id: DetermineDeliveryTargets | |
run: | | |
$errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 | |
$deliveryTargets = @('GitHubPackages','NuGet','Storage') | |
if ($env:type -eq "AppSource App") { | |
$continuousDelivery = $false | |
# For multi-project repositories, we will add deliveryTarget AppSource if any project has AppSourceContinuousDelivery set to true | |
('${{ steps.determineProjectsToBuild.outputs.ProjectsJson }}' | ConvertFrom-Json) | where-Object { $_ } | ForEach-Object { | |
$projectSettings = Get-Content (Join-Path $_ '.AL-Go/settings.json') -encoding UTF8 -raw | ConvertFrom-Json | |
if ($projectSettings.PSObject.Properties.Name -eq 'AppSourceContinuousDelivery' -and $projectSettings.AppSourceContinuousDelivery) { | |
Write-Host "Project $_ is setup for Continuous Delivery" | |
$continuousDelivery = $true | |
} | |
} | |
if ($continuousDelivery) { | |
$deliveryTargets += @("AppSource") | |
} | |
} | |
$namePrefix = 'DeliverTo' | |
Get-Item -Path (Join-Path $ENV:GITHUB_WORKSPACE ".github/$($namePrefix)*.ps1") | ForEach-Object { | |
$deliveryTarget = [System.IO.Path]::GetFileNameWithoutExtension($_.Name.SubString($namePrefix.Length)) | |
$deliveryTargets += @($deliveryTarget) | |
} | |
$deliveryTargets = @($deliveryTargets | Select-Object -unique | Where-Object { | |
$include = $false | |
Write-Host "Check DeliveryTarget $_" | |
$contextName = "$($_)Context" | |
$deliveryContext = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String([System.Environment]::GetEnvironmentVariable($contextName))) | |
if ($deliveryContext) { | |
$settingName = "DeliverTo$_" | |
$settings = $env:Settings | ConvertFrom-Json | |
if (($settings.PSObject.Properties.Name -eq $settingName) -and ($settings."$settingName".PSObject.Properties.Name -eq "Branches")) { | |
Write-Host "Branches:" | |
$settings."$settingName".Branches | ForEach-Object { | |
Write-Host "- $_" | |
if ($ENV:GITHUB_REF_NAME -like $_) { | |
$include = $true | |
} | |
} | |
} | |
else { | |
$include = ($ENV:GITHUB_REF_NAME -eq 'main') | |
} | |
} | |
if ($include) { | |
Write-Host "DeliveryTarget $_ included" | |
} | |
$include | |
}) | |
$deliveryTargetsJson = $deliveryTargets | ConvertTo-Json -Depth 99 -compress | |
if ($deliveryTargets.Count -lt 2) { $deliveryTargetsJson = "[$($deliveryTargetsJson)]" } | |
Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "DeliveryTargetsJson=$deliveryTargetsJson" | |
Write-Host "DeliveryTargetsJson=$deliveryTargetsJson" | |
Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "DeliveryTargetCount=$($deliveryTargets.Count)" | |
Write-Host "DeliveryTargetCount=$($deliveryTargets.Count)" | |
Add-Content -Encoding UTF8 -Path $env:GITHUB_ENV -Value "DeliveryTargets=$deliveryTargetsJson" | |
CheckForUpdates: | |
runs-on: [ windows-latest ] | |
needs: [ Initialization ] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Read settings | |
uses: mazhelez/AL-Go/Actions/ReadSettings@output-encoding | |
with: | |
shell: powershell | |
parentTelemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} | |
get: templateUrl | |
- name: Check for updates to AL-Go system files | |
uses: mazhelez/AL-Go/Actions/CheckForUpdates@output-encoding | |
with: | |
shell: powershell | |
parentTelemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} | |
templateUrl: ${{ env.templateUrl }} | |
Build: | |
needs: [ Initialization ] | |
if: (!failure()) && (!cancelled()) && fromJson(needs.Initialization.outputs.buildOrderJson)[0].projectsCount > 0 | |
strategy: | |
matrix: | |
include: ${{ fromJson(needs.Initialization.outputs.buildOrderJson)[0].buildDimensions }} | |
fail-fast: false | |
name: Build ${{ matrix.project }} - ${{ matrix.buildMode }} | |
uses: ./.github/workflows/_BuildALGoProject.yaml | |
secrets: inherit | |
with: | |
shell: ${{ needs.Initialization.outputs.githubRunnerShell }} | |
runsOn: ${{ needs.Initialization.outputs.githubRunner }} | |
parentTelemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} | |
project: ${{ matrix.project }} | |
buildMode: ${{ matrix.buildMode }} | |
projectDependenciesJson: ${{ needs.Initialization.outputs.projectDependenciesJson }} | |
secrets: 'licenseFileUrl,insiderSasToken,codeSignCertificateUrl,codeSignCertificatePassword,keyVaultCertificateUrl,keyVaultCertificatePassword,keyVaultClientId,storageContext,gitHubPackagesContext' | |
publishThisBuildArtifacts: ${{ needs.Initialization.outputs.workflowDepth > 1 }} | |
publishArtifacts: ${{ github.ref_name == 'main' || startswith(github.ref_name, 'release/') || needs.Initialization.outputs.deliveryTargetCount > 0 || needs.Initialization.outputs.environmentCount > 0 }} | |
signArtifacts: true | |
useArtifactCache: true | |
Deploy: | |
needs: [ Initialization, Build ] | |
if: always() && needs.Build.result == 'Success' && needs.Initialization.outputs.environmentCount > 0 | |
strategy: ${{ fromJson(needs.Initialization.outputs.environments) }} | |
runs-on: ${{ fromJson(matrix.os) }} | |
name: Deploy to ${{ matrix.environment }} | |
environment: | |
name: ${{ matrix.environment }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Download artifacts | |
uses: actions/download-artifact@v3 | |
with: | |
path: '.artifacts' | |
- name: EnvName | |
id: envName | |
run: | | |
$errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 | |
$envName = '${{ matrix.environment }}'.split(' ')[0] | |
Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "envName=$envName" | |
- name: Read settings | |
uses: mazhelez/AL-Go/Actions/ReadSettings@output-encoding | |
with: | |
shell: powershell | |
- name: Read secrets | |
uses: mazhelez/AL-Go/Actions/ReadSecrets@output-encoding | |
env: | |
secrets: ${{ toJson(secrets) }} | |
with: | |
shell: powershell | |
settingsJson: ${{ env.Settings }} | |
secrets: '${{ steps.envName.outputs.envName }}-AuthContext,${{ steps.envName.outputs.envName }}_AuthContext,AuthContext,${{ steps.envName.outputs.envName }}-EnvironmentName,${{ steps.envName.outputs.envName }}_EnvironmentName,EnvironmentName,projects' | |
- name: AuthContext | |
id: authContext | |
run: | | |
$errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 | |
$envName = '${{ steps.envName.outputs.envName }}' | |
$deployToSettingStr = [System.Environment]::GetEnvironmentVariable("DeployTo$envName") | |
if ($deployToSettingStr) { | |
$deployToSetting = $deployToSettingStr | ConvertFrom-Json | |
} | |
else { | |
$deployToSetting = [PSCustomObject]@{} | |
} | |
$authContext = $null | |
"$($envName)-AuthContext", "$($envName)_AuthContext", "AuthContext" | ForEach-Object { | |
if (!($authContext)) { | |
$authContext = [System.Environment]::GetEnvironmentVariable($_) | |
if ($authContext) { | |
Write-Host "Using $_ secret as AuthContext" | |
} | |
} | |
} | |
if (!($authContext)) { | |
Write-Host "::Error::No AuthContext provided" | |
exit 1 | |
} | |
if (("$deployToSetting" -ne "") -and $deployToSetting.PSObject.Properties.name -eq "EnvironmentName") { | |
$environmentName = $deployToSetting.EnvironmentName | |
} | |
else { | |
$environmentName = $null | |
"$($envName)-EnvironmentName", "$($envName)_EnvironmentName", "EnvironmentName" | ForEach-Object { | |
if (!($EnvironmentName)) { | |
$EnvironmentName = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String([System.Environment]::GetEnvironmentVariable($_))) | |
if ($EnvironmentName) { | |
Write-Host "Using $_ secret as EnvironmentName" | |
Write-Host "Please consider using the DeployTo$_ setting instead, where you can specify EnvironmentName, projects and branches" | |
} | |
} | |
} | |
} | |
if (!($environmentName)) { | |
$environmentName = '${{ steps.envName.outputs.envName }}' | |
} | |
$environmentName = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(($environmentName + '${{ matrix.environment }}'.SubString($envName.Length)).ToUpperInvariant())) | |
if (("$deployToSetting" -ne "") -and $deployToSetting.PSObject.Properties.name -eq "projects") { | |
$projects = $deployToSetting.projects | |
} | |
else { | |
$projects = [System.Environment]::GetEnvironmentVariable("$($envName)-projects") | |
if (-not $projects) { | |
$projects = [System.Environment]::GetEnvironmentVariable("$($envName)_Projects") | |
if (-not $projects) { | |
$projects = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String([System.Environment]::GetEnvironmentVariable('projects'))) | |
} | |
} | |
} | |
if ($projects -eq '' -or $projects -eq '*') { | |
$projects = '*' | |
} | |
else { | |
$buildProjects = '${{ needs.Initialization.outputs.projects }}' | ConvertFrom-Json | |
$projects = ($projects.Split(',') | Where-Object { $buildProjects -contains $_ }) -join ',' | |
} | |
Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "authContext=$authContext" | |
Write-Host "authContext=$authContext" | |
Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "environmentName=$environmentName" | |
Write-Host "environmentName=$([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($environmentName)))" | |
Write-Host "environmentName (as Base64)=$environmentName" | |
Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "projects=$projects" | |
Write-Host "projects=$projects" | |
- name: Deploy | |
uses: mazhelez/AL-Go/Actions/Deploy@output-encoding | |
env: | |
AuthContext: ${{ steps.authContext.outputs.authContext }} | |
with: | |
shell: powershell | |
type: 'CD' | |
projects: ${{ steps.authContext.outputs.projects }} | |
environmentName: ${{ steps.authContext.outputs.environmentName }} | |
artifacts: '.artifacts' | |
Deliver: | |
needs: [ Initialization, Build ] | |
if: always() && needs.Build.result == 'Success' && needs.Initialization.outputs.deliveryTargetCount > 0 | |
strategy: | |
matrix: | |
deliveryTarget: ${{ fromJson(needs.Initialization.outputs.deliveryTargets) }} | |
fail-fast: false | |
runs-on: [ windows-latest ] | |
name: Deliver to ${{ matrix.deliveryTarget }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Download artifacts | |
uses: actions/download-artifact@v3 | |
with: | |
path: '.artifacts' | |
- name: Read settings | |
uses: mazhelez/AL-Go/Actions/ReadSettings@output-encoding | |
with: | |
shell: powershell | |
- name: Read secrets | |
uses: mazhelez/AL-Go/Actions/ReadSecrets@output-encoding | |
env: | |
secrets: ${{ toJson(secrets) }} | |
with: | |
shell: powershell | |
settingsJson: ${{ env.Settings }} | |
secrets: '${{ matrix.deliveryTarget }}Context' | |
- name: DeliveryContext | |
id: deliveryContext | |
run: | | |
$errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 | |
$contextName = '${{ matrix.deliveryTarget }}Context' | |
$deliveryContext = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String([System.Environment]::GetEnvironmentVariable($contextName))) | |
Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "deliveryContext=$deliveryContext" | |
Write-Host "deliveryContext=$deliveryContext" | |
- name: Deliver | |
uses: mazhelez/AL-Go/Actions/Deliver@output-encoding | |
env: | |
deliveryContext: ${{ steps.deliveryContext.outputs.deliveryContext }} | |
with: | |
shell: powershell | |
type: 'CD' | |
projects: ${{ needs.Initialization.outputs.projects }} | |
deliveryTarget: ${{ matrix.deliveryTarget }} | |
artifacts: '.artifacts' | |
PostProcess: | |
if: (!cancelled()) | |
runs-on: [ windows-latest ] | |
needs: [ Initialization, Build, Deploy, Deliver ] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Finalize the workflow | |
id: PostProcess | |
uses: mazhelez/AL-Go/Actions/WorkflowPostProcess@output-encoding | |
with: | |
shell: powershell | |
eventId: "DO0091" | |
telemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} |