Skip to content

Updated AL-Go System Files #11

Updated AL-Go System Files

Updated AL-Go System Files #11

Workflow file for this run

name: ' CI/CD'
on:
workflow_dispatch:
push:
paths-ignore:
- '**.md'
- '.github/workflows/*.yaml'
- '!.github/workflows/CICD.yaml'
branches: [ 'main', 'release/*', 'feature/*' ]
defaults:
run:
shell: pwsh
permissions:
contents: read
actions: read
env:
workflowDepth: 3
ALGoOrgSettings: ${{ vars.ALGoOrgSettings }}
ALGoRepoSettings: ${{ vars.ALGoRepoSettings }}
jobs:
Initialization:
runs-on: [ ubuntu-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: microsoft/AL-Go-Actions/WorkflowInitialize@preview
with:
shell: pwsh
eventId: "DO0091"
- name: Read settings
id: ReadSettings
uses: microsoft/AL-Go-Actions/ReadSettings@preview
with:
shell: pwsh
parentTelemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }}
getEnvironments: '*'
- name: Determine Workflow Depth
id: DetermineWorkflowDepth
run: |
Add-Content -Path $env:GITHUB_OUTPUT -Value "WorkflowDepth=$($env:workflowDepth)"
- name: Determine Projects To Build
id: determineProjectsToBuild
uses: microsoft/AL-Go-Actions/DetermineProjectsToBuild@preview
with:
shell: pwsh
maxBuildDepth: ${{ env.workflowDepth }}
- name: Determine Delivery Target Secrets
id: DetermineDeliveryTargetSecrets
run: |
$ErrorActionPreference = "STOP"
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 -Path $env:GITHUB_OUTPUT -Value "Secrets=$($deliveryTargetSecrets -join ',')"
- name: Read secrets
uses: microsoft/AL-Go-Actions/ReadSecrets@preview
env:
secrets: ${{ toJson(secrets) }}
with:
shell: pwsh
settingsJson: ${{ env.Settings }}
secrets: ${{ steps.DetermineDeliveryTargetSecrets.outputs.Secrets }}
- name: Determine Delivery Targets
id: DetermineDeliveryTargets
run: |
$ErrorActionPreference = "STOP"
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 -Path $env:GITHUB_OUTPUT -Value "DeliveryTargetsJson=$deliveryTargetsJson"
Write-Host "DeliveryTargetsJson=$deliveryTargetsJson"
Add-Content -Path $env:GITHUB_OUTPUT -Value "DeliveryTargetCount=$($deliveryTargets.Count)"
Write-Host "DeliveryTargetCount=$($deliveryTargets.Count)"
Add-Content -Path $env:GITHUB_ENV -Value "DeliveryTargets=$deliveryTargetsJson"
CheckForUpdates:
runs-on: [ ubuntu-latest ]
needs: [ Initialization ]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Read settings
uses: microsoft/AL-Go-Actions/ReadSettings@preview
with:
shell: pwsh
parentTelemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }}
get: templateUrl
- name: Check for updates to AL-Go system files
uses: microsoft/AL-Go-Actions/CheckForUpdates@preview
with:
shell: pwsh
parentTelemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }}
templateUrl: ${{ env.templateUrl }}
Build1:
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
Build2:
needs: [ Initialization, Build1 ]
if: (!failure()) && (!cancelled()) && (needs.Build1.result == 'success' || needs.Build1.result == 'skipped') && fromJson(needs.Initialization.outputs.buildOrderJson)[1].projectsCount > 0
strategy:
matrix:
include: ${{ fromJson(needs.Initialization.outputs.buildOrderJson)[1].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
Build:
needs: [ Initialization, Build2, Build1 ]
if: (!failure()) && (!cancelled()) && (needs.Build2.result == 'success' || needs.Build2.result == 'skipped') && (needs.Build1.result == 'success' || needs.Build1.result == 'skipped') && fromJson(needs.Initialization.outputs.buildOrderJson)[2].projectsCount > 0
strategy:
matrix:
include: ${{ fromJson(needs.Initialization.outputs.buildOrderJson)[2].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"
Set-StrictMode -version 2.0
$envName = '${{ matrix.environment }}'.split(' ')[0]
Add-Content -Path $env:GITHUB_OUTPUT -Value "envName=$envName"
- name: Read settings
uses: microsoft/AL-Go-Actions/ReadSettings@preview
with:
shell: pwsh
- name: Read secrets
uses: microsoft/AL-Go-Actions/ReadSecrets@preview
env:
secrets: ${{ toJson(secrets) }}
with:
shell: pwsh
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"
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 -Path $env:GITHUB_OUTPUT -Value "authContext=$authContext"
Write-Host "authContext=$authContext"
Add-Content -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 -Path $env:GITHUB_OUTPUT -Value "projects=$projects"
Write-Host "projects=$projects"
- name: Deploy
uses: microsoft/AL-Go-Actions/Deploy@preview
env:
AuthContext: ${{ steps.authContext.outputs.authContext }}
with:
shell: pwsh
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: [ ubuntu-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: microsoft/AL-Go-Actions/ReadSettings@preview
with:
shell: pwsh
- name: Read secrets
uses: microsoft/AL-Go-Actions/ReadSecrets@preview
env:
secrets: ${{ toJson(secrets) }}
with:
shell: pwsh
settingsJson: ${{ env.Settings }}
secrets: '${{ matrix.deliveryTarget }}Context'
- name: DeliveryContext
id: deliveryContext
run: |
$ErrorActionPreference = "STOP"
Set-StrictMode -version 2.0
$contextName = '${{ matrix.deliveryTarget }}Context'
$deliveryContext = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String([System.Environment]::GetEnvironmentVariable($contextName)))
Add-Content -Path $env:GITHUB_OUTPUT -Value "deliveryContext=$deliveryContext"
Write-Host "deliveryContext=$deliveryContext"
- name: Deliver
uses: microsoft/AL-Go-Actions/Deliver@preview
env:
deliveryContext: ${{ steps.deliveryContext.outputs.deliveryContext }}
with:
shell: pwsh
type: 'CD'
projects: ${{ needs.Initialization.outputs.projects }}
deliveryTarget: ${{ matrix.deliveryTarget }}
artifacts: '.artifacts'
PostProcess:
if: (!cancelled())
runs-on: [ ubuntu-latest ]
needs: [ Initialization, Build, Deploy, Deliver ]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Finalize the workflow
id: PostProcess
uses: microsoft/AL-Go-Actions/WorkflowPostProcess@preview
with:
shell: pwsh
eventId: "DO0091"
telemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }}