You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:05:02