Merge pull request #197 from BusinessCentralApps/update-al-go-system-… #759
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' | ||
concurrency: | ||
group: ${{ github.workflow }}-${{ github.ref }} | ||
cancel-in-progress: true | ||
on: | ||
workflow_dispatch: | ||
push: | ||
paths-ignore: | ||
- '**.md' | ||
- '.github/workflows/*.yaml' | ||
- '!.github/workflows/CICD.yaml' | ||
branches: [ 'main', 'release/*', 'feature/*', 'development' ] | ||
schedule: | ||
- cron: 'cron: '5 4 * * *'' | ||
defaults: | ||
run: | ||
shell: pwsh | ||
permissions: | ||
actions: read | ||
contents: read | ||
id-token: write | ||
pages: read | ||
env: | ||
workflowDepth: 3 | ||
ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} | ||
ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} | ||
jobs: | ||
Initialization: | ||
needs: [ ] | ||
runs-on: [ ubuntu-latest ] | ||
outputs: | ||
telemetryScopeJson: ${{ steps.init.outputs.telemetryScopeJson }} | ||
environmentsMatrixJson: ${{ steps.DetermineDeploymentEnvironments.outputs.EnvironmentsMatrixJson }} | ||
environmentCount: ${{ steps.DetermineDeploymentEnvironments.outputs.EnvironmentCount }} | ||
deploymentEnvironmentsJson: ${{ steps.DetermineDeploymentEnvironments.outputs.DeploymentEnvironmentsJson }} | ||
generateALDocArtifact: ${{ steps.DetermineDeploymentEnvironments.outputs.GenerateALDocArtifact }} | ||
deployALDocArtifact: ${{ steps.DetermineDeploymentEnvironments.outputs.DeployALDocArtifact }} | ||
deliveryTargetsJson: ${{ steps.DetermineDeliveryTargets.outputs.DeliveryTargetsJson }} | ||
githubRunner: ${{ steps.ReadSettings.outputs.GitHubRunnerJson }} | ||
githubRunnerShell: ${{ steps.ReadSettings.outputs.GitHubRunnerShell }} | ||
projects: ${{ steps.determineProjectsToBuild.outputs.ProjectsJson }} | ||
skippedProjects: ${{ steps.determineProjectsToBuild.outputs.SkippedProjectsJson }} | ||
projectDependenciesJson: ${{ steps.determineProjectsToBuild.outputs.ProjectDependenciesJson }} | ||
buildOrderJson: ${{ steps.determineProjectsToBuild.outputs.BuildOrderJson }} | ||
baselineWorkflowRunId: ${{ steps.determineProjectsToBuild.outputs.BaselineWorkflowRunId }} | ||
baselineWorkflowSHA: ${{ steps.determineProjectsToBuild.outputs.BaselineWorkflowSHA }} | ||
workflowDepth: ${{ steps.DetermineWorkflowDepth.outputs.WorkflowDepth }} | ||
powerPlatformSolutionFolder: ${{ steps.DeterminePowerPlatformSolutionFolder.outputs.powerPlatformSolutionFolder }} | ||
steps: | ||
- name: Dump Workflow Information | ||
uses: freddydk/AL-Go/Actions/DumpWorkflowInfo@partial | ||
with: | ||
shell: pwsh | ||
- name: Checkout | ||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||
with: | ||
lfs: true | ||
- name: Initialize the workflow | ||
id: init | ||
uses: freddydk/AL-Go/Actions/WorkflowInitialize@partial | ||
with: | ||
shell: pwsh | ||
- name: Read settings | ||
id: ReadSettings | ||
uses: freddydk/AL-Go/Actions/ReadSettings@partial | ||
with: | ||
shell: pwsh | ||
get: type,powerPlatformSolutionFolder,useGitSubmodules | ||
- name: Read submodules token | ||
id: ReadSubmodulesToken | ||
if: env.useGitSubmodules != 'false' && env.useGitSubmodules != '' | ||
uses: freddydk/AL-Go/Actions/ReadSecrets@partial | ||
with: | ||
shell: pwsh | ||
gitHubSecrets: ${{ toJson(secrets) }} | ||
getSecrets: '-gitSubmodulesToken' | ||
- name: Checkout Submodules | ||
if: env.useGitSubmodules != 'false' && env.useGitSubmodules != '' | ||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||
with: | ||
lfs: true | ||
submodules: ${{ env.useGitSubmodules }} | ||
token: '${{ fromJson(steps.ReadSubmodulesToken.outputs.Secrets).gitSubmodulesToken }}' | ||
- 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: freddydk/AL-Go/Actions/DetermineProjectsToBuild@partial | ||
with: | ||
shell: pwsh | ||
maxBuildDepth: ${{ env.workflowDepth }} | ||
publishSkippedProjectArtifacts: 'true' | ||
- name: Determine PowerPlatform Solution Folder | ||
id: DeterminePowerPlatformSolutionFolder | ||
if: env.type == 'PTE' | ||
run: | | ||
Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "powerPlatformSolutionFolder=$($env:powerPlatformSolutionFolder)" | ||
- name: Determine Delivery Target Secrets | ||
id: DetermineDeliveryTargetSecrets | ||
uses: freddydk/AL-Go/Actions/DetermineDeliveryTargets@partial | ||
with: | ||
shell: pwsh | ||
projectsJson: '${{ steps.determineProjectsToBuild.outputs.ProjectsJson }}' | ||
checkContextSecrets: 'false' | ||
- name: Read secrets | ||
id: ReadSecrets | ||
uses: freddydk/AL-Go/Actions/ReadSecrets@partial | ||
with: | ||
shell: pwsh | ||
gitHubSecrets: ${{ toJson(secrets) }} | ||
getSecrets: ${{ steps.DetermineDeliveryTargetSecrets.outputs.ContextSecrets }} | ||
- name: Determine Delivery Targets | ||
id: DetermineDeliveryTargets | ||
uses: freddydk/AL-Go/Actions/DetermineDeliveryTargets@partial | ||
env: | ||
Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' | ||
with: | ||
shell: pwsh | ||
projectsJson: '${{ steps.determineProjectsToBuild.outputs.ProjectsJson }}' | ||
checkContextSecrets: 'true' | ||
- name: Determine Deployment Environments | ||
id: DetermineDeploymentEnvironments | ||
uses: freddydk/AL-Go/Actions/DetermineDeploymentEnvironments@partial | ||
env: | ||
GITHUB_TOKEN: ${{ github.token }} | ||
with: | ||
shell: pwsh | ||
getEnvironments: '*' | ||
type: 'CD' | ||
CheckForUpdates: | ||
needs: [ Initialization ] | ||
runs-on: [ ubuntu-latest ] | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||
- name: Read settings | ||
uses: freddydk/AL-Go/Actions/ReadSettings@partial | ||
with: | ||
shell: pwsh | ||
get: templateUrl | ||
- name: Check for updates to AL-Go system files | ||
uses: freddydk/AL-Go/Actions/CheckForUpdates@partial | ||
with: | ||
shell: pwsh | ||
templateUrl: ${{ env.templateUrl }} | ||
downloadLatest: true | ||
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.projectName }} (${{ matrix.buildMode }}) | ||
uses: ./.github/workflows/_BuildALGoProject.yaml | ||
secrets: inherit | ||
with: | ||
shell: ${{ matrix.githubRunnerShell }} | ||
runsOn: ${{ matrix.githubRunner }} | ||
project: ${{ matrix.project }} | ||
projectName: ${{ matrix.projectName }} | ||
buildMode: ${{ matrix.buildMode }} | ||
skippedProjectsJson: ${{ needs.Initialization.outputs.skippedProjects }} | ||
projectDependenciesJson: ${{ needs.Initialization.outputs.projectDependenciesJson }} | ||
baselineWorkflowRunId: ${{ needs.Initialization.outputs.baselineWorkflowRunId }} | ||
baselineWorkflowSHA: ${{ needs.Initialization.outputs.baselineWorkflowSHA }} | ||
secrets: 'licenseFileUrl,codeSignCertificateUrl,*codeSignCertificatePassword,keyVaultCertificateUrl,*keyVaultCertificatePassword,keyVaultClientId,gitHubPackagesContext,applicationInsightsConnectionString' | ||
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.projectName }} (${{ matrix.buildMode }}) | ||
uses: ./.github/workflows/_BuildALGoProject.yaml | ||
secrets: inherit | ||
with: | ||
shell: ${{ matrix.githubRunnerShell }} | ||
runsOn: ${{ matrix.githubRunner }} | ||
project: ${{ matrix.project }} | ||
projectName: ${{ matrix.projectName }} | ||
buildMode: ${{ matrix.buildMode }} | ||
skippedProjectsJson: ${{ needs.Initialization.outputs.skippedProjects }} | ||
projectDependenciesJson: ${{ needs.Initialization.outputs.projectDependenciesJson }} | ||
baselineWorkflowRunId: ${{ needs.Initialization.outputs.baselineWorkflowRunId }} | ||
baselineWorkflowSHA: ${{ needs.Initialization.outputs.baselineWorkflowSHA }} | ||
secrets: 'licenseFileUrl,codeSignCertificateUrl,*codeSignCertificatePassword,keyVaultCertificateUrl,*keyVaultCertificatePassword,keyVaultClientId,gitHubPackagesContext,applicationInsightsConnectionString' | ||
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.projectName }} (${{ matrix.buildMode }}) | ||
uses: ./.github/workflows/_BuildALGoProject.yaml | ||
secrets: inherit | ||
with: | ||
shell: ${{ matrix.githubRunnerShell }} | ||
runsOn: ${{ matrix.githubRunner }} | ||
project: ${{ matrix.project }} | ||
projectName: ${{ matrix.projectName }} | ||
buildMode: ${{ matrix.buildMode }} | ||
skippedProjectsJson: ${{ needs.Initialization.outputs.skippedProjects }} | ||
projectDependenciesJson: ${{ needs.Initialization.outputs.projectDependenciesJson }} | ||
baselineWorkflowRunId: ${{ needs.Initialization.outputs.baselineWorkflowRunId }} | ||
baselineWorkflowSHA: ${{ needs.Initialization.outputs.baselineWorkflowSHA }} | ||
secrets: 'licenseFileUrl,codeSignCertificateUrl,*codeSignCertificatePassword,keyVaultCertificateUrl,*keyVaultCertificatePassword,keyVaultClientId,gitHubPackagesContext,applicationInsightsConnectionString' | ||
signArtifacts: true | ||
useArtifactCache: true | ||
DeployALDoc: | ||
needs: [ Initialization, Build ] | ||
if: (!cancelled()) && needs.Build.result == 'Success' && needs.Initialization.outputs.generateALDocArtifact == 1 && github.ref_name == 'main' | ||
runs-on: [ ubuntu-latest ] | ||
name: Deploy Reference Documentation | ||
permissions: | ||
contents: read | ||
actions: read | ||
pages: write | ||
id-token: write | ||
environment: | ||
name: github-pages | ||
url: ${{ steps.deployment.outputs.page_url }} | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||
- name: Download artifacts | ||
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | ||
with: | ||
path: '.artifacts' | ||
- name: Read settings | ||
uses: freddydk/AL-Go/Actions/ReadSettings@partial | ||
with: | ||
shell: pwsh | ||
- name: Setup Pages | ||
if: needs.Initialization.outputs.deployALDocArtifact == 1 | ||
uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 | ||
- name: Build Reference Documentation | ||
uses: freddydk/AL-Go/Actions/BuildReferenceDocumentation@partial | ||
with: | ||
shell: pwsh | ||
artifacts: '.artifacts' | ||
- name: Upload pages artifact | ||
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1 | ||
with: | ||
path: ".aldoc/_site/" | ||
- name: Deploy to GitHub Pages | ||
if: needs.Initialization.outputs.deployALDocArtifact == 1 | ||
id: deployment | ||
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5 | ||
Deploy: | ||
needs: [ Initialization, Build2, Build1, Build ] | ||
if: (!cancelled()) && (needs.Build2.result == 'success' || needs.Build2.result == 'skipped') && (needs.Build1.result == 'success' || needs.Build1.result == 'skipped') && (needs.Build.result == 'success' || needs.Build.result == 'skipped') && needs.Initialization.outputs.environmentCount > 0 | ||
strategy: ${{ fromJson(needs.Initialization.outputs.environmentsMatrixJson) }} | ||
runs-on: ${{ fromJson(matrix.os) }} | ||
name: Deploy to ${{ matrix.environment }} | ||
defaults: | ||
run: | ||
shell: ${{ matrix.shell }} | ||
environment: | ||
name: ${{ matrix.environment }} | ||
url: ${{ steps.Deploy.outputs.environmentUrl }} | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||
- name: Download artifacts | ||
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | ||
with: | ||
path: '.artifacts' | ||
- name: Read settings | ||
uses: freddydk/AL-Go/Actions/ReadSettings@partial | ||
with: | ||
shell: ${{ matrix.shell }} | ||
get: type,powerPlatformSolutionFolder | ||
- 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 secrets | ||
id: ReadSecrets | ||
uses: freddydk/AL-Go/Actions/ReadSecrets@partial | ||
with: | ||
shell: ${{ matrix.shell }} | ||
gitHubSecrets: ${{ toJson(secrets) }} | ||
getSecrets: '${{ steps.envName.outputs.envName }}-AuthContext,${{ steps.envName.outputs.envName }}_AuthContext,AuthContext' | ||
- name: Deploy to Business Central | ||
id: Deploy | ||
uses: freddydk/AL-Go/Actions/Deploy@partial | ||
env: | ||
Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' | ||
with: | ||
shell: ${{ matrix.shell }} | ||
environmentName: ${{ matrix.environment }} | ||
artifactsFolder: '.artifacts' | ||
type: 'CD' | ||
deploymentEnvironmentsJson: ${{ needs.Initialization.outputs.deploymentEnvironmentsJson }} | ||
- name: Deploy to Power Platform | ||
if: env.type == 'PTE' && env.powerPlatformSolutionFolder != '' | ||
uses: freddydk/AL-Go/Actions/DeployPowerPlatform@partial | ||
env: | ||
Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' | ||
with: | ||
shell: pwsh | ||
environmentName: ${{ matrix.environment }} | ||
artifactsFolder: '.artifacts' | ||
deploymentEnvironmentsJson: ${{ needs.Initialization.outputs.deploymentEnvironmentsJson }} | ||
Deliver: | ||
needs: [ Initialization, Build2, Build1, Build ] | ||
if: (!cancelled()) && (needs.Build2.result == 'success' || needs.Build2.result == 'skipped') && (needs.Build1.result == 'success' || needs.Build1.result == 'skipped') && (needs.Build.result == 'success' || needs.Build.result == 'skipped') && needs.Initialization.outputs.deliveryTargetsJson != '[]' | ||
strategy: | ||
matrix: | ||
deliveryTarget: ${{ fromJson(needs.Initialization.outputs.deliveryTargetsJson) }} | ||
fail-fast: false | ||
runs-on: [ ubuntu-latest ] | ||
name: Deliver to ${{ matrix.deliveryTarget }} | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||
- name: Download artifacts | ||
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | ||
with: | ||
path: '.artifacts' | ||
- name: Read settings | ||
uses: freddydk/AL-Go/Actions/ReadSettings@partial | ||
with: | ||
shell: pwsh | ||
- name: Read secrets | ||
id: ReadSecrets | ||
uses: freddydk/AL-Go/Actions/ReadSecrets@partial | ||
with: | ||
shell: pwsh | ||
gitHubSecrets: ${{ toJson(secrets) }} | ||
getSecrets: '${{ matrix.deliveryTarget }}Context' | ||
- name: Deliver | ||
uses: freddydk/AL-Go/Actions/Deliver@partial | ||
env: | ||
Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' | ||
with: | ||
shell: pwsh | ||
type: 'CD' | ||
projects: ${{ needs.Initialization.outputs.projects }} | ||
deliveryTarget: ${{ matrix.deliveryTarget }} | ||
artifacts: '.artifacts' | ||
PostProcess: | ||
needs: [ Initialization, Build2, Build1, Build, Deploy, Deliver, DeployALDoc ] | ||
if: (!cancelled()) | ||
runs-on: [ ubuntu-latest ] | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||
- name: Finalize the workflow | ||
id: PostProcess | ||
uses: freddydk/AL-Go/Actions/WorkflowPostProcess@partial | ||
env: | ||
GITHUB_TOKEN: ${{ github.token }} | ||
with: | ||
shell: pwsh | ||
telemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} | ||
currentJobContext: ${{ toJson(job) }} |