tfupdate CI自动化实战:Terraform依赖发版后自动创建PR的完整指南(附CircleCI集成示例)

tfupdate CI自动化实战:Terraform依赖发版后自动创建PR的完整指南(附CircleCI集成示例) tfupdate CI自动化实战Terraform依赖发版后自动创建PR的完整指南附CircleCI集成示例【免费下载链接】tfupdateUpdate version constraints in your Terraform / OpenTofu configurations项目地址: https://gitcode.com/gh_mirrors/tf/tfupdatetfupdate 是一个开源命令行工具用于批量更新 Terraform / OpenTofu 配置和锁定文件中的版本约束。把它接入 CI 后可以做到依赖发版即自动更新、并自动创建 PR——本文带你一步步完成 tfupdate 的 CI 自动化附完整的 CircleCI 集成示例。为什么需要 tfupdate 自动更新依赖Terraform 的最佳实践是把配置拆小、把 Terraform 核心、Provider、Module 的版本锁住避免意外的破坏性变更。但锁住版本后及时更新就成了新的负担目录一多手动逐目录改version又慢又容易漏.terraform.lock.hcl锁定文件需要重新计算哈希手动维护很麻烦更新不及时一次跳多个大版本更容易出问题tfupdate 的核心能力更新 Terraform / OpenTofu 核心、Provider、Module 的版本约束不依赖 Terraform / OpenTofu CLI直接更新.terraform.lock.hcl锁定文件从一个目录开始递归更新所有配置从 GitHub、GitLab、Terraform Registry、OpenTofu Registry 获取最新版本号自动化思路4 步流水线⏰ 定时触发 CI → ① tfupdate release latest 检查新版本 → ② tfupdate provider / terraform 更新版本约束 → ③ tfupdate lock 更新锁定文件 → ④ git push 新分支 自动创建 PR整个方案的关键在于定时任务每天或每周跑一次有新版本才产生 PR没有就安静退出不会制造垃圾提交。一键集成在 CI 中准备 tfupdatetfupdate 提供 Docker 镜像和编译好的二进制CI 中最省事的方式是用 Docker 镜像直接运行docker run --rm minamijoyo/tfupdate release latest --source-type tfregistryProvider hashicorp/awstfupdate 的行为由环境变量控制环境变量作用TFREGISTRY_BASE_URL设为https://registry.opentofu.org/时从 OpenTofu Registry 获取 OpenTofu 模块与 Provider 信息GITHUB_TOKEN访问私有仓库时使用GITLAB_TOKEN/GITLAB_BASE_URL访问 GitLab 仓库的发布版本时使用以更新 AWS Provider 为例核心脚本只有 4 条命令# ① 从 Registry 检查最新版本号 LATEST$(tfupdate release latest --source-type tfregistryProvider hashicorp/aws) # ② 当前已是最新版本直接退出让定时任务安全可重入 if [ $LATEST $CURRENT ]; then echo No new version, skip. exit 0 fi # ③ 递归更新所有 .tf 配置中的版本约束 tfupdate provider aws -v $LATEST -r ./ # ④ 不依赖 Terraform CLI 更新 .terraform.lock.hcl 锁定文件 tfupdate lock ./几个值得注意的参数不带-v时tfupdate 会自动检查并设置最新版本-r表示递归更新目录下所有配置-i可用正则忽略路径例如-i vendor/ -i fixtures/避免扫描测试目录拖慢 CI想了解各命令的完整参数可参考仓库中的 command/provider.go、command/release_latest.go 和 command/lock.go。CircleCI 集成示例定时任务 自动 PR下面是一个最小可运行的 CircleCI 定时管道示例circleci.yml放在仓库根目录即可version: 2.1 workflows: tfupdate-daily: when: pipeline.trigger_date # 定时触发 jobs: - update-and-pr: context: tfupdate-pr # 预置 GITHUB_TOKEN / 仓库凭据 jobs: update-and-pr: docker: - image: cimg/base:2024.06 environment: PROVIDER: aws steps: - checkout - run: name: Install tfupdate command: | curl -sSfL -o /usr/local/bin/tfupdate \ https://github.com/minamijoyo/tfupdate/releases/latest/download/tfupdate_linux_amd64 chmod x /usr/local/bin/tfupdate - run: name: Check update dependency command: ./scripts/tfupdate-ci.sh # 上文 4 步脚本 - run: name: Commit and open PR when: on_fail # 有新版本、产生 diff 时才执行 command: ./scripts/open-pr.sh要点说明定时触发CircleCI 的 Scheduled Pipeline 支持按 cron 表达式触发例如工作日每天上午 9 点跑一次when: on_fail的技巧把无 diff 就退出非零作为信号只有真实产生了变更才走提交和 PR 步骤也可用脚本显式判断 git 状态凭据在 CircleCI 项目设置中创建 Context存放访问仓库的 token 和创建 PR 用的 token通过context:注入官方 README 中还提到两个可直接参考的 CircleCI 方案一个完整的 tfupdate-circleci 示例仓库以及社区维护的circleci-tfupdateorb可以按需选用。有更新时提交并自动创建 PRopen-pr.sh的完整逻辑#!/usr/bin/env bash set -euo pipefail # 没有变更就不做任何事 if [ -z $(git status --porcelain) ]; then echo Nothing to update. exit 0 fi git config user.name ci[bot] git config user.email ciexample.com BRANCHchore/tfupdate-$(date %Y%m%d) git add -A git commit -m chore: update dependency to latest release git push origin $BRANCH if gh pr list --head $BRANCH --state open | grep -q .; then echo PR already exists, skip. # 分支已存在 PR直接复用 else gh pr create --fill fi配合 GitHub CLIgh即可在 CI 里直接创建 PR。若你的 CI 不使用gh也可以用仓库平台的 API 完成同样的事。最佳实践清单 ✅小步快跑每天只追一个最新版本PR 审查成本低出问题也好定位锁文件也要更新tfupdate lock会重新计算.terraform.lock.hcl的哈希避免 CI 构建时哈希校验失败加--platform只包含 CI 实际运行的平台可显著提速忽略无关目录用-i排除vendor/、测试 fixture 等目录加快扫描版本约束写法想保留兼容性区间也可以把-v写成约束表达式例如tfupdate provider aws -v ~ 3.0冲突处理已有更新 PR 时优先合并旧的避免同一分支堆积多个 PR注意前提tfupdate lock要求required_providers中的依赖已锁定到具体版本版本约束表达式和模块间接依赖不支持总结tfupdate 让Terraform 依赖发版后自动更新、自动开 PR变成了一段几十行的 CI 脚本release latest检查新版本provider/terraform更新版本约束lock更新锁定文件最后 git 提交 自动创建 PR。配合 CircleCI 定时任务团队从此告别手工升级依赖永远保持离最新只差一个 PR的状态。【免费下载链接】tfupdateUpdate version constraints in your Terraform / OpenTofu configurations项目地址: https://gitcode.com/gh_mirrors/tf/tfupdate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考