alz/github/actions/terraform/templates/workflows/cd-template.yaml (124 lines of code) (raw):

--- name: Continuous Delivery on: workflow_call: inputs: terraform_action: description: 'Terraform Action to perform' default: 'apply' type: string root_module_folder_relative_path: description: 'Root Module Folder Relative Path' default: '.' type: string terraform_cli_version: description: 'Terraform CLI Version' default: 'latest' type: string jobs: plan: name: Plan with Terraform runs-on: ${runner_name} concurrency: ${backend_azure_storage_account_container_name} environment: ${environment_name_plan} permissions: id-token: write contents: read env: ARM_CLIENT_ID: "$${{ vars.AZURE_CLIENT_ID }}" ARM_SUBSCRIPTION_ID: "$${{ vars.AZURE_SUBSCRIPTION_ID }}" ARM_TENANT_ID: "$${{ vars.AZURE_TENANT_ID }}" ARM_USE_AZUREAD: true ARM_USE_OIDC: true steps: - name: Checkout Code uses: actions/checkout@v4 - name: Install Terraform uses: hashicorp/setup-terraform@v3 with: terraform_wrapper: false terraform_version: $${{ inputs.terraform_cli_versions }} - name: Terraform Init run: | terraform \ -chdir="$${{inputs.root_module_folder_relative_path}}" \ init \ -backend-config="resource_group_name=$${{vars.BACKEND_AZURE_RESOURCE_GROUP_NAME}}" \ -backend-config="storage_account_name=$${{vars.BACKEND_AZURE_STORAGE_ACCOUNT_NAME}}" \ -backend-config="container_name=$${{vars.BACKEND_AZURE_STORAGE_ACCOUNT_CONTAINER_NAME}}" \ -backend-config="key=terraform.tfstate" - name: Terraform Plan for $${{ inputs.terraform_action == 'destroy' && 'Destroy' || 'Apply' }} run: | # shellcheck disable=SC2086 terraform \ -chdir="$${{inputs.root_module_folder_relative_path}}" \ plan \ -out=tfplan \ -input=false \ $${{ inputs.terraform_action == 'destroy' && '-destroy' || '' }} - name: Create Module Artifact run: | $stagingDirectory = "staging" $rootModuleFolder = "$${{inputs.root_module_folder_relative_path}}" New-Item -Path . -Name $stagingDirectory -ItemType "directory" Copy-Item -Path "./*" -Exclude @(".git", ".terraform", ".github", $stagingDirectory) -Recurse -Destination "./$stagingDirectory" $rootModuleFolderTerraformFolder = Join-Path -Path "./$stagingDirectory" -ChildPath $rootModuleFolder -AdditionalChildPath ".terraform" if(Test-Path -Path $rootModuleFolderTerraformFolder) { Remove-Item -Path $rootModuleFolderTerraformFolder -Recurse -Force } shell: pwsh - name: Publish Module Artifact uses: actions/upload-artifact@v4 with: name: module path: ./staging/ - name: Show the Plan for Review run: | terraform \ -chdir="$${{inputs.root_module_folder_relative_path}}" \ show \ tfplan apply: needs: plan name: Apply with Terraform runs-on: ${runner_name} concurrency: ${backend_azure_storage_account_container_name} environment: ${environment_name_apply} permissions: id-token: write contents: read env: ARM_CLIENT_ID: "$${{ vars.AZURE_CLIENT_ID }}" ARM_SUBSCRIPTION_ID: "$${{ vars.AZURE_SUBSCRIPTION_ID }}" ARM_TENANT_ID: "$${{ vars.AZURE_TENANT_ID }}" ARM_USE_AZUREAD: true ARM_USE_OIDC: true AZAPI_RETRY_GET_AFTER_PUT_MAX_TIME: "60m" # Accounts for eventually consistent management group permissions propagation steps: - name: Download a Build Artifact uses: actions/download-artifact@v4 with: name: module - name: Install Terraform uses: hashicorp/setup-terraform@v3 with: terraform_wrapper: false terraform_version: $${{ inputs.terraform_cli_versions }} - name: Terraform Init run: | terraform \ -chdir="$${{inputs.root_module_folder_relative_path}}" \ init \ -backend-config="resource_group_name=$${{vars.BACKEND_AZURE_RESOURCE_GROUP_NAME}}" \ -backend-config="storage_account_name=$${{vars.BACKEND_AZURE_STORAGE_ACCOUNT_NAME}}" \ -backend-config="container_name=$${{vars.BACKEND_AZURE_STORAGE_ACCOUNT_CONTAINER_NAME}}" \ -backend-config="key=terraform.tfstate" - name: Terraform $${{ inputs.terraform_action == 'destroy' && 'Destroy' || 'Apply' }} run: | terraform \ -chdir="$${{inputs.root_module_folder_relative_path}}" \ apply \ -input=false \ -auto-approve \ tfplan