CI/CD #2695
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', 'releases/*' ] | |
defaults: | |
run: | |
shell: powershell | |
permissions: | |
actions: read | |
contents: read | |
id-token: write | |
pages: read | |
env: | |
workflowDepth: 2 | |
ALGoOrgSettings: ${{ vars.ALGoOrgSettings }} | |
ALGoRepoSettings: ${{ vars.ALGoRepoSettings }} | |
jobs: | |
Initialization: | |
needs: [ ] | |
runs-on: [ windows-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 }} | |
projectDependenciesJson: ${{ steps.determineProjectsToBuild.outputs.ProjectDependenciesJson }} | |
buildOrderJson: ${{ steps.determineProjectsToBuild.outputs.BuildOrderJson }} | |
powerPlatformSolutionFolder: ${{ steps.DeterminePowerPlatformSolutionFolder.outputs.powerPlatformSolutionFolder }} | |
workflowDepth: ${{ steps.DetermineWorkflowDepth.outputs.WorkflowDepth }} | |
steps: | |
- name: Dump Workflow Information | |
uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
with: | |
shell: powershell | |
- name: Checkout | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
with: | |
lfs: true | |
- name: Initialize the workflow | |
id: init | |
uses: microsoft/AL-Go/Actions/WorkflowInitialize@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
with: | |
shell: powershell | |
- name: Read settings | |
id: ReadSettings | |
uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
with: | |
shell: powershell | |
get: type, powerPlatformSolutionFolder | |
- 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: microsoft/AL-Go/Actions/DetermineProjectsToBuild@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
with: | |
shell: powershell | |
maxBuildDepth: ${{ env.workflowDepth }} | |
- 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: microsoft/AL-Go/Actions/DetermineDeliveryTargets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
with: | |
shell: powershell | |
projectsJson: '${{ steps.determineProjectsToBuild.outputs.ProjectsJson }}' | |
checkContextSecrets: 'false' | |
- name: Read secrets | |
id: ReadSecrets | |
uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
with: | |
shell: powershell | |
gitHubSecrets: ${{ toJson(secrets) }} | |
getSecrets: ${{ steps.DetermineDeliveryTargetSecrets.outputs.ContextSecrets }} | |
- name: Determine Delivery Targets | |
id: DetermineDeliveryTargets | |
uses: microsoft/AL-Go/Actions/DetermineDeliveryTargets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
env: | |
Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' | |
with: | |
shell: powershell | |
projectsJson: '${{ steps.determineProjectsToBuild.outputs.ProjectsJson }}' | |
checkContextSecrets: 'true' | |
- name: Determine Deployment Environments | |
id: DetermineDeploymentEnvironments | |
uses: microsoft/AL-Go/Actions/DetermineDeploymentEnvironments@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
env: | |
GITHUB_TOKEN: ${{ github.token }} | |
with: | |
shell: powershell | |
getEnvironments: '*' | |
type: 'CD' | |
CheckForUpdates: | |
needs: [ Initialization ] | |
runs-on: [ windows-latest ] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- name: Read settings | |
uses: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
with: | |
shell: powershell | |
get: templateUrl | |
- name: Check for updates to AL-Go system files | |
uses: microsoft/AL-Go/Actions/CheckForUpdates@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
with: | |
shell: powershell | |
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 }} | |
projectDependenciesJson: ${{ needs.Initialization.outputs.projectDependenciesJson }} | |
secrets: 'licenseFileUrl,codeSignCertificateUrl,*codeSignCertificatePassword,keyVaultCertificateUrl,*keyVaultCertificatePassword,keyVaultClientId,gitHubPackagesContext,applicationInsightsConnectionString' | |
publishThisBuildArtifacts: ${{ needs.Initialization.outputs.workflowDepth > 1 }} | |
publishArtifacts: ${{ github.ref_name == 'main' || startswith(github.ref_name, 'release/') || startswith(github.ref_name, 'releases/') || needs.Initialization.outputs.deliveryTargetsJson != '[]' || needs.Initialization.outputs.environmentCount > 0 }} | |
signArtifacts: true | |
useArtifactCache: true | |
Build: | |
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 }} | |
projectDependenciesJson: ${{ needs.Initialization.outputs.projectDependenciesJson }} | |
secrets: 'licenseFileUrl,codeSignCertificateUrl,*codeSignCertificatePassword,keyVaultCertificateUrl,*keyVaultCertificatePassword,keyVaultClientId,gitHubPackagesContext,applicationInsightsConnectionString' | |
publishThisBuildArtifacts: ${{ needs.Initialization.outputs.workflowDepth > 1 }} | |
publishArtifacts: ${{ github.ref_name == 'main' || startswith(github.ref_name, 'release/') || startswith(github.ref_name, 'releases/') || needs.Initialization.outputs.deliveryTargetsJson != '[]' || needs.Initialization.outputs.environmentCount > 0 }} | |
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: [ windows-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: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
with: | |
shell: powershell | |
- name: Setup Pages | |
if: needs.Initialization.outputs.deployALDocArtifact == 1 | |
uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 | |
- name: Build Reference Documentation | |
uses: microsoft/AL-Go/Actions/BuildReferenceDocumentation@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
with: | |
shell: powershell | |
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, Build1, Build ] | |
if: (!cancelled()) && (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: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
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: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
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: microsoft/AL-Go/Actions/Deploy@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
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: microsoft/AL-Go/Actions/DeployPowerPlatform@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
env: | |
Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' | |
with: | |
shell: powershell | |
environmentName: ${{ matrix.environment }} | |
artifactsFolder: '.artifacts' | |
deploymentEnvironmentsJson: ${{ needs.Initialization.outputs.deploymentEnvironmentsJson }} | |
Deliver: | |
needs: [ Initialization, Build1, Build ] | |
if: (!cancelled()) && (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: [ windows-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: microsoft/AL-Go/Actions/ReadSettings@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
with: | |
shell: powershell | |
- name: Read secrets | |
id: ReadSecrets | |
uses: microsoft/AL-Go/Actions/ReadSecrets@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
with: | |
shell: powershell | |
gitHubSecrets: ${{ toJson(secrets) }} | |
getSecrets: '${{ matrix.deliveryTarget }}Context' | |
- name: Deliver | |
uses: microsoft/AL-Go/Actions/Deliver@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
env: | |
Secrets: '${{ steps.ReadSecrets.outputs.Secrets }}' | |
with: | |
shell: powershell | |
type: 'CD' | |
projects: ${{ needs.Initialization.outputs.projects }} | |
deliveryTarget: ${{ matrix.deliveryTarget }} | |
artifacts: '.artifacts' | |
PostProcess: | |
needs: [ Initialization, Build1, Build, Deploy, Deliver, DeployALDoc ] | |
if: (!cancelled()) | |
runs-on: [ windows-latest ] | |
steps: | |
- name: Checkout | |
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | |
- name: Finalize the workflow | |
id: PostProcess | |
uses: microsoft/AL-Go/Actions/WorkflowPostProcess@a46044fa1ffca4b1ff05d2d1844fd7d5922c6984 | |
env: | |
GITHUB_TOKEN: ${{ github.token }} | |
with: | |
shell: powershell | |
telemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} | |
currentJobContext: ${{ toJson(job) }} |