如何提取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
相关产品推荐
相关产品推荐

