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

如何提取GitHub PR修改的Terraform资源生成target参数脚本

GitHub PR变更范围Terraform定向执行实现

核心需求

  • 提取指定GitHub PR内所有Terraform文件中修改的资源、模块列表
  • 将提取结果拼接为-target参数传入terraform plan/terraform apply命令,限制命令作用范围,避免全量执行带来的风险
  • 效果示例:
    当PR内变更的.tf文件包含如下内容时:
    resource "kubernetes_namespace" "sandbox" {
    ...
    }
    
    
    module "sandbox_base" {
      ...
    }
    
    最终生成的执行命令格式为:
    terraform plan -target=kubernetes_namespace.sandbox -target=module.sandbox_base
    

开箱即用实现

不需要拆分2-3个串行任务开发逻辑,直接复用以下单Job整合的GitHub Action工作流即可:

name: Scoped Terraform Plan For PR
on:
  pull_request:
    paths:
      - '**.tf'

jobs:
  terraform-plan:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Extract terraform targets from PR changes
        id: extract-targets
        run: |
          # 替换为你仓库的默认目标分支,比如master、main
          DEFAULT_BRANCH="origin/main"
          CHANGED_TF=$(git diff --name-only $DEFAULT_BRANCH...HEAD -- '*.tf' | tr '\n' ' ')
          TARGET_FLAGS=""

          if [ -n "$CHANGED_TF" ]; then
            for tf_file in $CHANGED_TF; do
              # 提取普通资源,自动跳过注释行
              RES_LIST=$(grep -E '^resource\s+"[^"]+"\s+"[^"]+"' "$tf_file" | sed -E 's/resource\s+"([^"]+)"\s+"([^"]+)".*/\1.\2/')
              # 提取模块,自动跳过注释行
              MOD_LIST=$(grep -E '^module\s+"[^"]+"' "$tf_file" | sed -E 's/module\s+"([^"]+)".*/module.\1/')
              
              for item in $RES_LIST $MOD_LIST; do
                TARGET_FLAGS="$TARGET_FLAGS -target=$item"
              done
            done
          fi

          # 去重、过滤空值后输出参数
          echo "flags=$(echo $TARGET_FLAGS | tr ' ' '\n' | sort -u | grep -v '^$' | tr '\n' ' ')" >> $GITHUB_OUTPUT

      - name: Install Terraform
        uses: hashicorp/setup-terraform@v3

      - name: Terraform Init
        run: terraform init

      - name: Run scoped terraform plan
        run: terraform plan ${{ steps.extract-targets.outputs.flags }}

使用提示:如果你的仓库默认分支不是main,修改脚本里DEFAULT_BRANCH变量对应的值即可;脚本自动过滤注释中的资源/模块声明,同时对提取到的target做去重处理,避免重复传参。

内容的提问来源于stack exchange,提问作者Paresh Deshmukh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:06:32