tfnotify×GitHub Actions集成指南:Terraform plan通知完整配置(附CircleCI、CloudBuild、CodeBuild方案)
【免费下载链接】tfnotifyA CLI command to parse Terraform execution result and notify it to GitHub项目地址: https://gitcode.com/gh_mirrors/tf/tfnotify
📬tfnotify是一款开源的 Terraform 通知工具:它解析terraform plan/terraform apply的执行结果(包括退出码与错误详情),并自动以评论形式发布到 GitHub 的 Pull Request、Issue 或 Commit 页面。结合 GitHub Actions 使用,你无需再手动翻 CI 日志——每次 Terraform 执行后,plan 结果会直接出现在 PR 里,还能自动打上destroy、no-changes等标签。
什么是 tfnotify:解决"去哪里看 Terraform 结果"的痛点
Terraform 的plan和apply命令通常跑在 CI 里,结果要登进 CI 页面才能看到,非常不便。tfnotify 的定位很简单:
- 🧠智能解析:基于正则引擎从 Terraform 输出中提取关键信息(如
Plan: 1 to add、No changes) - 💬PR 评论通知:将结果以 Go 模板渲染后发布为 GitHub 评论,支持更新已有评论避免刷屏
- 🏷️标签管理:根据 plan 结果自动给 PR 打标签(新增/更新、销毁、无变更、报错)
- ⚠️删除资源警告:plan 包含资源销毁时可自动附加醒目警告
- 🤖AI 摘要(可选):调用 OpenAI / Anthropic / LiteLLM 等生成变更摘要
- 🔐脱敏:内置 mask 机制防止敏感信息外泄
安装 tfnotify:一行命令搞定
$ go get -u github.com/mercari/tfnotify也可以从 Releases 下载二进制。tfnotify 是纯 CLI 工具,它直接从标准输入读取 Terraform 的输出,因此使用方式是把 terraform 命令"管道"给 tfnotify 的子命令:
$ tfnotify plan -- terraform plan $ tfnotify apply -- terraform apply配置文件默认为当前目录下的tfnotify.yaml,可用--config指定其他路径(参考 example.tfnotify.yaml)。
GitHub Actions 集成:最快配置方法
第 1 步:准备 tfnotify.yaml
在项目根目录创建配置,核心只需两段:
ci: owner: "my-org" repo: "my-infra" terraform: plan: template: | ## Plan Result {{if .Result}} <pre><code>{{ .Result }} </pre></code> {{end}} <details><summary>Details (Click me)</summary> <pre><code>{{ .CombinedOutput }} </pre></code></details>💡
owner/repo支持环境变量替换;在 CI 中它们会自动从当前平台的环境变量补齐,无需手写。
第 2 步:在 workflow 中运行
- name: Terraform Plan with tfnotify env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | tfnotify plan -pr ${{ github.event.number }} -- terraform plan几个关键点:
- 🔑Token 只写环境变量名(如
$GITHUB_TOKEN),不要硬编码真实值 - 📍 tfnotify 会自动识别 GitHub Actions 环境(
GITHUB_SERVER_URL、GITHUB_RUN_ID等),{{ .Link }}占位符会渲染成对应的 Actions 运行页面链接 - 🏷️ 加上
when_destroy: label: "destroy"等配置,即可实现"plan 有销毁操作 → PR 自动打红色 destroy 标签",完整示例见 example-with-destroy-and-result-labels.tfnotify.yaml - 模板中若用代码块展示原始输出,建议开启
use_raw_output: true避免 HTML 转义,见 example-use-raw-output.tfnotify.yaml
常用模板占位符速查
| 占位符 | 含义 |
|---|---|
{{ .Title }} | 标题,如## Plan result |
{{ .Result }} | 解析出的结果(如Plan: 1 to add) |
{{ .Body }}/{{ .CombinedOutput }} | Terraform 完整输出 |
{{ .Link }} | CI 构建页面链接 |
{{ .HasDestroy }} | 布尔值:是否包含资源销毁 |
CircleCI、CloudBuild、CodeBuild 集成方案
tfnotify 通过 pkg/platform/ci.go 自动探测 9+ 种 CI 平台,并适配各自的构建链接:
| CI 平台 | 构建链接来源 | 说明 |
|---|---|---|
| GitHub Actions | GITHUB_SERVER_URL+GITHUB_RUN_ID | 自动拼装运行页链接 |
| CircleCI | CIRCLE_BUILD_URL | 环境变量直接可用 |
| AWS CodeBuild | CODEBUILD_BUILD_URL | 环境变量直接可用 |
| Google Cloud Build | BUILD_ID+PROJECT_ID+_REGION | 需通过 substitutions 注入 |
🌐 CircleCI 方案
CircleCI 的环境变量开箱即用,tfnotify.yaml中把ci段写为ci: circleci即可,其余配置与 GitHub Actions 完全一致,{{ .Link }}会自动指向 CircleCI 构建页。
☁️ Google Cloud Build 方案
CloudBuild 需要通过substitutions注入以下变量(README 有详细说明):
COMMIT_SHA、BUILD_ID、PROJECT_ID_PR_NUMBER(PR 号)、_REGION(可选,缺省为global)
检测与链接拼装逻辑见 pkg/platform/google_cloud_build.go。官方推荐的触发策略:
terraform plan:Pull Request触发terraform apply:分支推送触发
📦 AWS CodeBuild 方案
CodeBuild 下仅需确保CODEBUILD_BUILD_URL存在(平台默认提供),tfnotify 会自动读取CODEBUILD_BUILD_URL作为{{ .Link }}。若环境无法自动识别仓库信息,可在配置中显式写出ci.owner/ci.repo,或用全局参数--owner、--repo、--pr、--sha、--build-url兜底。
进阶:AI 摘要让 plan 结果更易读
给plan/apply加上--summary参数,tfnotify 会把变更清单(创建/更新/删除/替换的资源)交给 AI 生成简短摘要与风险提示:
$ tfnotify plan --summary --summary-provider openai -- terraform plan默认提示词模板见 templates/default.md,可通过--summary-template或配置的ai_summary段自定义,相关实现在 pkg/ai/。
常见问题速查
- ❓没有变更时不想刷屏?使用
--skip-no-changes,此时只更新标签不发评论;有 warning 时加--ignore-warning - ❓多次运行评论太多?开启
--patch(或plan_patch: true),更新已有评论而不是新建 - ❓Terragrunt 多模块评论太散?加
--consolidated合并为单条评论 - ❓不想发 GitHub,只想存文件?
tfnotify --output result.md可直接输出到本地文件
相关文件参考
| 文件 | 作用 |
|---|---|
| README.md | 完整文档与 CloudBuild 注意事项 |
| example.tfnotify.yaml | 基础配置示例 |
| pkg/platform/ci.go | CI 平台探测与链接拼装 |
| pkg/config/config.go | 配置结构与校验逻辑 |
| templates/default.md | AI 摘要默认提示词 |
按照以上步骤配置完成后,你的 PR 页就会变成"plan 结果展示板":新增/销毁一目了然,危险操作自动警告并打标签,团队审查 Terraform 变更的效率会显著提升 🚀
【免费下载链接】tfnotifyA CLI command to parse Terraform execution result and notify it to GitHub项目地址: https://gitcode.com/gh_mirrors/tf/tfnotify
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考