GitHub Environment下terraform plan与apply间人工审批配置方法
实现方案
你现在的配置没法实现需求的核心原因是:GitHub Environment的人工审批规则是在绑定该环境的Job启动时触发,你把plan和apply放在同一个绑定了testing环境的Job里,工作流一触发就会先弹审批,此时plan步骤还没执行,根本看不到变更结果。
正确的实现思路是拆分Job,让无需审批的plan阶段先执行输出结果,再触发绑定了审批环境的apply阶段,具体操作如下:
配置步骤
- 拆分原有单Job为两个独立Job
terraform-plan:负责执行代码拉取、工具安装、AWS鉴权、init、plan操作,不绑定需要审批的environment,代码推送到test分支后自动执行,同时把plan结果打印到日志、把生成的tfplan文件上传为工作流产物留存,避免后续apply阶段重新计算plan导致和审批看到的结果不一致。terraform-apply:仅负责执行apply操作,绑定testing环境,配置依赖terraform-planJob,只有plan Job执行成功后才会启动,启动时自动触发testing环境的人工审批流程。
- 配置Environment审批规则
进入仓库Settings > Environments > 选中testing环境,开启Required reviewers规则,添加有权限审批的人员名单保存即可,不需要额外安装第三方审批插件,用GitHub原生能力就能实现。 - 修正原有工作流的语法问题
原配置存在缩进错误、continue-on-error写法错误,以及plan命令把输出全重定向到/dev/null的问题——必须保留plan输出到日志,才能在审批前核查变更内容。
修正后的完整工作流配置
name: Testing Environment on: push: branches: - test jobs: terraform-plan: name: "Terragrunt Init & Plan" runs-on: ubuntu-20.04 # plan阶段不绑定审批环境,自动执行 defaults: run: working-directory: ${{ env.TERRAFORM_WORKING_DIR }} steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Terraform uses: hashicorp/setup-terraform@v1.3.2 with: terraform_version: ${{ env.TERRAFORM_VERSION }} terraform_wrapper: true - name: Setup Terragrunt uses: autero1/action-terragrunt@v1.1.0 with: terragrunt_version: ${{ env.TERRAGRUNT_VERSION }} - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1.6.1 with: aws-region: us-east-1 role-to-assume: ${{ env.ORCHESTRATION_ROLE_ARN }} - name: Terragrunt Init id: init run: terragrunt run-all init -no-color --terragrunt-non-interactive - name: Terragrunt Plan id: plan # 去掉原配置的>/dev/null,打印plan结果到日志供审批核查 run: | terragrunt run-all plan -no-color --terragrunt-non-interactive -out=tfplan continue-on-error: true # 上传tfplan为产物,供apply阶段直接使用,避免配置漂移 - name: Upload Terraform Plan Artifact uses: actions/upload-artifact@v3 with: name: tfplan path: ${{ env.TERRAFORM_WORKING_DIR }}/tfplan if-no-files-found: error terraform-apply: name: "Terragrunt Apply (Need Approval)" runs-on: ubuntu-20.04 # 仅apply阶段绑定testing环境,启动时触发人工审批 environment: testing needs: terraform-plan # 强制等待plan阶段执行完成才启动 defaults: run: working-directory: ${{ env.TERRAFORM_WORKING_DIR }} steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Terraform uses: hashicorp/setup-terraform@v1.3.2 with: terraform_version: ${{ env.TERRAFORM_VERSION }} terraform_wrapper: true - name: Setup Terragrunt uses: autero1/action-terragrunt@v1.1.0 with: terragrunt_version: ${{ env.TERRAGRUNT_VERSION }} - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1.6.1 with: aws-region: us-east-1 role-to-assume: ${{ env.ORCHESTRATION_ROLE_ARN }} - name: Terragrunt Init id: init run: terragrunt run-all init -no-color --terragrunt-non-interactive # 下载plan阶段生成的tfplan文件 - name: Download Terraform Plan Artifact uses: actions/download-artifact@v3 with: name: tfplan path: ${{ env.TERRAFORM_WORKING_DIR }} - name: Terragrunt Apply id: apply # 直接使用已核查的tfplan执行部署,保证审批内容和实际部署一致 run: terragrunt run-all apply -no-color --terragrunt-non-interactive tfplan continue-on-error: true
运行效果说明
- 代码推送到test分支后,plan Job自动启动,跑完init、plan后会把完整的资源变更结果打印到对应步骤的日志中,同时留存tfplan文件。
- plan Job执行成功后,apply Job进入等待状态,GitHub会自动给配置的审批人发送通知。
- 审批人进入工作流详情页,先查看plan步骤的输出日志,确认资源变更符合预期后再点击审批通过,apply Job才会开始执行测试环境部署;如果发现plan结果有问题,直接拒绝审批即可终止部署流程。
内容的提问来源于stack exchange,提问作者bibi
相关产品推荐
相关产品推荐

