Azure DevOps中Terraform计划含破坏性变更时触发手动审批的配置求助
实现Terraform破坏性变更触发手动审批的Azure DevOps流水线配置
核心逻辑
借助TerraformCLI任务内置的TERRAFORM_PLAN_HAS_DESTROY_CHANGES变量检测计划中的破坏性变更,通过阶段条件控制手动审批步骤的触发:仅当存在破坏性变更且启用手动验证参数时,才启动审批;普通变更或无变更时直接跳过。
完整配置代码
1. 调整Terraform计划阶段,捕获破坏性变更标记
在生成tfplan的任务后,执行terraform show触发变更检测,并将结果变量设为跨阶段输出:
- stage: terraform_plan displayName: 'Terraform Plan' jobs: - job: terraform_plan_job displayName: '生成Terraform部署计划' steps: # 省略Terraform初始化、工作区配置等前置步骤 # 生成并保存Terraform计划文件 - task: TerraformCLI@0 displayName: 'terraform plan' inputs: command: plan arguments: '-out=$(System.DefaultWorkingDirectory)/$(Build.Repository.Name)/tfplan' environmentServiceName: '你的Azure服务连接名称' # 执行show命令,自动检测破坏性变更并设置内置变量 - task: TerraformCLI@0 displayName: '检测破坏性变更' inputs: command: show inputTargetPlanOrStateFilePath: '$(System.DefaultWorkingDirectory)/$(Build.Repository.Name)/tfplan' # 将破坏性变更标记设为阶段输出,供后续阶段调用 - script: echo "##vso[task.setvariable variable=TERRAFORM_PLAN_HAS_DESTROY_CHANGES;isOutput=true]$(TERRAFORM_PLAN_HAS_DESTROY_CHANGES)" name: produceVar
2. 更新手动审批阶段的触发条件
修改manual_validation阶段的条件,仅在满足指定条件时触发审批:
- stage: manual_validation displayName: "破坏性变更手动审批" # 触发条件:流水线执行成功 + 启用手动验证参数 + 存在破坏性变更 condition: and(succeeded(), eq('${{ parameters.RequireManualValidation }}', true), eq(stageDependencies.terraform_plan.outputs['terraform_plan_job.produceVar.TERRAFORM_PLAN_HAS_DESTROY_CHANGES'], 'true')) pool: server jobs: - job: 'manual_validation' displayName: '请确认破坏性变更' timeoutInMinutes: ${{ parameters.ApprovalTimeoutMinutes }} steps: - task: ManualValidation@0 inputs: notifyUsers: '${{ parameters.PlanApprovers }}' instructions: 'Terraform部署计划中包含资源删除/替换等破坏性操作,请核实后批准继续' onTimeout: 'reject'
关键注意点
TERRAFORM_PLAN_HAS_DESTROY_CHANGES是TerraformCLI任务的内置变量,当计划包含destroy类操作时自动设为true,否则为false。- 必须通过
task.setvariable将变量标记为isOutput=true,才能实现跨阶段的变量传递。 - 若仅需对破坏性变更触发审批,当前逻辑已满足:普通变更或无变更时,审批阶段会自动跳过。
内容的提问来源于stack exchange,提问作者Techiescorner
相关产品推荐
相关产品推荐

