如何在GitHub Action的Terraform多栈工作流中添加审批环节?
GitHub Workflow实现Terraform多栈顺序部署+Plan后审批流程
完全可以实现你需求的流程——将所有栈整合到单个工作流中,按顺序执行每个栈的Plan,等待人工审批后执行Apply,完成一个栈再启动下一个栈的流程。以下是具体实现方案:
核心实现思路
- 利用GitHub Actions的环境审批机制,在Plan完成后触发人工审核,批准后才执行Apply
- 通过**作业依赖(
needs关键字)**控制栈的执行顺序:前一个栈的Apply完成后,才启动下一个栈的Plan - 将每个栈的流程拆分为两个独立作业:
plan-<stack>生成并保存执行计划,apply-<stack>依赖Plan作业且绑定审批环境
具体步骤与示例代码
1. 配置GitHub环境与审批规则
在仓库的「Settings → Environments」页面创建目标部署环境(如prod),开启Required reviewers选项,指定需要审批的人员或团队。后续Apply作业绑定该环境时,必须经过指定人员批准才能执行。
2. 编写整合式工作流配置
以下是完整的工作流示例,包含两个栈的顺序部署流程,可根据实际栈数量扩展:
name: Terraform Multi-Stack Deployment on: push: branches: [main] # 代码合并到主分支时触发 workflow_dispatch: # 支持手动触发,可添加自定义参数 env: TF_VERSION: "1.5.7" # 指定Terraform版本 DEPLOY_ENV: "prod" # 绑定已配置审批的环境 jobs: # 第一个栈:网络基础设施 plan-network-stack: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 初始化Terraform环境 uses: hashicorp/setup-terraform@v2 with: terraform_version: ${{ env.TF_VERSION }} - name: Terraform初始化 working-directory: ./stacks/network run: terraform init -backend-config="env=${{ env.DEPLOY_ENV }}" - name: 生成执行计划 working-directory: ./stacks/network run: terraform plan -out=tfplan - name: 上传计划文件作为制品 uses: actions/upload-artifact@v3 with: name: tfplan-network path: ./stacks/network/tfplan apply-network-stack: needs: plan-network-stack # 依赖网络栈的Plan作业完成 runs-on: ubuntu-latest environment: ${{ env.DEPLOY_ENV }} # 触发审批流程 steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 初始化Terraform环境 uses: hashicorp/setup-terraform@v2 with: terraform_version: ${{ env.TF_VERSION }} - name: 下载之前生成的执行计划 uses: actions/download-artifact@v3 with: name: tfplan-network path: ./stacks/network - name: Terraform初始化 working-directory: ./stacks/network run: terraform init -backend-config="env=${{ env.DEPLOY_ENV }}" - name: 执行Terraform Apply working-directory: ./stacks/network run: terraform apply tfplan # 第二个栈:数据库服务(依赖网络栈的Apply完成) plan-db-stack: needs: apply-network-stack # 等待网络栈部署完成 runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 初始化Terraform环境 uses: hashicorp/setup-terraform@v2 with: terraform_version: ${{ env.TF_VERSION }} - name: Terraform初始化 working-directory: ./stacks/database run: terraform init -backend-config="env=${{ env.DEPLOY_ENV }}" - name: 生成执行计划 working-directory: ./stacks/database run: terraform plan -out=tfplan - name: 上传计划文件作为制品 uses: actions/upload-artifact@v3 with: name: tfplan-db path: ./stacks/database/tfplan apply-db-stack: needs: plan-db-stack runs-on: ubuntu-latest environment: ${{ env.DEPLOY_ENV }} steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 初始化Terraform环境 uses: hashicorp/setup-terraform@v2 with: terraform_version: ${{ env.TF_VERSION }} - name: 下载执行计划 uses: actions/download-artifact@v3 with: name: tfplan-db path: ./stacks/database - name: Terraform初始化 working-directory: ./stacks/database run: terraform init -backend-config="env=${{ env.DEPLOY_ENV }}" - name: 执行Terraform Apply working-directory: ./stacks/database run: terraform apply tfplan # 后续栈以此类推,每个栈的Plan作业依赖前一个栈的Apply作业
关键注意事项
- 保存执行计划:将Terraform Plan保存为GitHub制品(Artifact),避免审批间隔期间代码变更导致Apply执行的计划与审批内容不一致
- 作业依赖顺序:通过
needs关键字严格控制栈的执行顺序,确保前序基础设施部署完成后再启动后续栈 - 灵活触发:使用
workflow_dispatch事件可手动触发部署,还可添加输入参数指定要部署的栈列表,减少不必要的执行 - 复用代码:如果栈数量较多,可将Plan/Apply的通用步骤封装为复合动作(Composite Actions),减少配置重复
内容的提问来源于stack exchange,提问作者thom4s94
相关产品推荐
相关产品推荐

