CI/CD #1502
This file contains hidden or 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: | |
| schedule: | |
| - cron: '0 2 * * *' | |
| defaults: | |
| run: | |
| shell: powershell | |
| permissions: | |
| actions: read | |
| contents: read | |
| id-token: write | |
| pages: read | |
| security-events: write | |
| 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 }} | |
| 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 }} | |
| trackALAlertsInGithub: ${{ steps.SetALCodeAnalysisVar.outputs.trackALAlertsInGithub }} | |
| steps: | |
| - name: Dump Workflow Information | |
| uses: microsoft/AL-Go/Actions/DumpWorkflowInfo@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| with: | |
| shell: powershell | |
| - name: Checkout | |
| uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
| with: | |
| lfs: true | |
| - name: Initialize the workflow | |
| id: init | |
| uses: microsoft/AL-Go/Actions/WorkflowInitialize@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| with: | |
| shell: powershell | |
| - name: Read settings | |
| id: ReadSettings | |
| uses: microsoft/AL-Go/Actions/ReadSettings@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| with: | |
| shell: powershell | |
| get: type,powerPlatformSolutionFolder,useGitSubmodules,trackALAlertsInGithub | |
| - name: Set AL Code Analysis Var output | |
| id: SetALCodeAnalysisVar | |
| run: | | |
| Write-Host "trackALAlertsInGithub environment variable: '$($env:trackALAlertsInGithub)'" | |
| Add-Content -Encoding UTF8 -Path $env:GITHUB_OUTPUT -Value "trackALAlertsInGithub=$($env:trackALAlertsInGithub)" | |
| - name: Read submodules token | |
| id: ReadSubmodulesToken | |
| if: env.useGitSubmodules != 'false' && env.useGitSubmodules != '' | |
| uses: microsoft/AL-Go/Actions/ReadSecrets@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| with: | |
| shell: powershell | |
| gitHubSecrets: ${{ toJson(secrets) }} | |
| getSecrets: '-gitSubmodulesToken' | |
| - name: Checkout Submodules | |
| if: env.useGitSubmodules != 'false' && env.useGitSubmodules != '' | |
| uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
| 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: microsoft/AL-Go/Actions/DetermineProjectsToBuild@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| 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@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| with: | |
| shell: powershell | |
| projectsJson: '${{ steps.determineProjectsToBuild.outputs.ProjectsJson }}' | |
| checkContextSecrets: 'false' | |
| - name: Read secrets | |
| id: ReadSecrets | |
| uses: microsoft/AL-Go/Actions/ReadSecrets@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| with: | |
| shell: powershell | |
| gitHubSecrets: ${{ toJson(secrets) }} | |
| getSecrets: ${{ steps.DetermineDeliveryTargetSecrets.outputs.ContextSecrets }} | |
| - name: Determine Delivery Targets | |
| id: DetermineDeliveryTargets | |
| uses: microsoft/AL-Go/Actions/DetermineDeliveryTargets@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| 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@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| env: | |
| GITHUB_TOKEN: ${{ github.token }} | |
| with: | |
| shell: powershell | |
| getEnvironments: '*' | |
| type: 'CD' | |
| CheckForUpdates: | |
| needs: [ Initialization ] | |
| runs-on: [ windows-latest ] | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
| - name: Read settings | |
| uses: microsoft/AL-Go/Actions/ReadSettings@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| with: | |
| shell: powershell | |
| get: templateUrl | |
| - name: Read secrets | |
| id: ReadSecrets | |
| uses: microsoft/AL-Go/Actions/ReadSecrets@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| with: | |
| shell: powershell | |
| gitHubSecrets: ${{ toJson(secrets) }} | |
| getSecrets: 'ghTokenWorkflow' | |
| - name: Check for updates to AL-Go system files | |
| uses: microsoft/AL-Go/Actions/CheckForUpdates@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| env: | |
| GITHUB_TOKEN: ${{ github.token }} | |
| with: | |
| shell: powershell | |
| templateUrl: ${{ env.templateUrl }} | |
| token: ${{ fromJson(steps.ReadSecrets.outputs.Secrets).ghTokenWorkflow }} | |
| 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 | |
| needsContext: ${{ toJson(needs) }} | |
| 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 }} | |
| 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 | |
| needsContext: ${{ toJson(needs) }} | |
| CodeAnalysisUpload: | |
| needs: [ Initialization, Build ] | |
| if: (!cancelled()) && (needs.Initialization.outputs.trackALAlertsInGithub == 'True') | |
| runs-on: [ windows-latest ] | |
| name: Code Analysis Processing | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
| - name: Download artifacts - ErrorLogs | |
| uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 | |
| if: (success() || failure()) | |
| with: | |
| pattern: '*-ErrorLogs-*' | |
| path: '${{ github.workspace }}/ErrorLogs/' | |
| merge_multiple: true | |
| - name: Process AL Code Analysis Logs | |
| id: ProcessALCodeAnalysisLogs | |
| if: (success() || failure()) | |
| uses: microsoft/AL-Go/Actions/ProcessALCodeAnalysisLogs@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| with: | |
| shell: powershell | |
| - name: Upload SARIF file to GitHub | |
| uses: github/codeql-action/upload-sarif@v3 | |
| if: always() | |
| with: | |
| sarif_file: '${{ github.workspace }}/ErrorLogs/output.sarif.json' | |
| category: "ALCodeAnalysis" | |
| DeployALDoc: | |
| needs: [ Initialization, Build ] | |
| if: (!cancelled()) && (needs.Build.result == 'success' || needs.Build.result == 'skipped') && 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@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
| - name: Download artifacts | |
| uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 | |
| with: | |
| path: '.artifacts' | |
| - name: Read settings | |
| uses: microsoft/AL-Go/Actions/ReadSettings@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| 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@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| with: | |
| shell: powershell | |
| artifacts: '.artifacts' | |
| - name: Upload pages artifact | |
| uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0 | |
| 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 }} | |
| env: | |
| ALGoEnvSettings: ${{ vars.ALGoEnvironmentSettings }} | |
| ALGoEnvName: ${{ matrix.environment }} | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
| - name: Download artifacts | |
| uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 | |
| with: | |
| path: '.artifacts' | |
| - name: Read settings | |
| uses: microsoft/AL-Go/Actions/ReadSettings@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| 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@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| 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@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| 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@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| 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@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
| - name: Download artifacts | |
| uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 | |
| with: | |
| path: '.artifacts' | |
| - name: Read settings | |
| uses: microsoft/AL-Go/Actions/ReadSettings@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| with: | |
| shell: powershell | |
| - name: Read secrets | |
| id: ReadSecrets | |
| uses: microsoft/AL-Go/Actions/ReadSecrets@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| with: | |
| shell: powershell | |
| gitHubSecrets: ${{ toJson(secrets) }} | |
| getSecrets: '${{ matrix.deliveryTarget }}Context' | |
| - name: Deliver | |
| uses: microsoft/AL-Go/Actions/Deliver@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| 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@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 | |
| - name: Finalize the workflow | |
| id: PostProcess | |
| uses: microsoft/AL-Go/Actions/WorkflowPostProcess@32e66d69cfd2c1e3eca39e416e27c6aa58de6df3 | |
| env: | |
| GITHUB_TOKEN: ${{ github.token }} | |
| with: | |
| shell: powershell | |
| telemetryScopeJson: ${{ needs.Initialization.outputs.telemetryScopeJson }} | |
| currentJobContext: ${{ toJson(job) }} |