Terraform 如何搭建 CLI/Core 开发环境并用 go test 与 TF_ACC 跑测试
2026/9/10 5:49:06 网站建设 项目流程

Terraform 如何搭建 CLI/Core 开发环境并用 go test 与 TF_ACC 跑测试

【免费下载链接】terraformTerraform enables you to safely and predictably create, change, and improve infrastructure. It is a source-available tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned.项目地址: https://gitcode.com/GitHub_Trending/te/terraform

这篇文章对应的工作目标是:为 Terraform CLI/Core(即包含核心引擎与命令行界面的这个仓库)搭建一个可用的开发环境,能编译出terraform可执行文件,并能通过go test运行单元测试、通过设置TF_ACC环境变量运行与外部服务交互的验收测试。依据 Terraform CLI/Core Development Environment 一节,当前 Terraform 开发环境仅针对 Linux 和 Mac OS X 系统——Terraform 本身虽然兼容 Windows,但单元测试套件包含围绕最大路径长度、路径分隔符等的 Unix 特有假设,因此不建议在 Windows 上跑测试套件。

环境要求:Go 版本从哪里确认

按 BUILDING.md 与 CONTRIBUTING 文档的说法,准备工作有两项:

  1. 安装 Go 编译器和 Git 版本控制系统;
  2. 用 Git 把仓库 clone 到你选择的位置。

Go 版本以仓库中的 .go-version 文件为准。该文件当前内容是1.26.4,go.mod 里声明的go 1.26.4则被视为 Terraform 能兼容的最低Go 版本,而.go-version是生产二进制实际使用的构建版本。CONTRIBUTING 文档补充了一个实用细节:从 Go 1.21 起,go命令(如go build中)会自动安装与go.mod指定版本对应的工具链,前提是那个版本比本机已安装的更新。所以如果你的 Go 偏旧,构建时可能触发工具链自动下载,而不是直接报错。

还有一个明确的限制:Terraform 使用 Go Modules,因此不要把仓库 clone 到GOPATH里面,clone 到任意你选择的目录即可。

编译:go install 与可执行文件位置

进入 clone 后的仓库根目录,用标准 Go 工具链方式构建:

cd terraform go install .

这里cd terraform是源文档中的示例,假设你 clone 下来的目录名就是terraform;如果目录名不同,改成实际目录名即可。

首次执行go install时,Go 工具链会下载 Go modules 缓存中尚不存在的库依赖,所以第一次会明显慢一些;后续构建因为依赖已在本地磁盘上会更快。编译成功后,可执行文件位于 Go 可执行目录中:如果没设置GOBIN环境变量,该目录就是go env GOPATH输出路径下的bin目录。可以用这条命令确认位置:

go env GOPATH

如果你需要控制二进制行为,BUILDING.md 记录了两个ldflags选项:默认情况下terraform version会带-dev标记(如1.5.0-dev),除非把version.dev设为no;实验性功能默认禁用,需要把main.experimentsAllowed设为yes才启用,例如:

go build -ldflags "-w -s -X 'github.com/hashicorp/terraform/version.dev=no'" -o bin/ . go build -ldflags "-w -s -X 'main.experimentsAllowed=yes'" -o bin/ .

文档同时提醒:官方构建中只有 alpha 版本才允许 experiments,第三方分发建议沿用这一约定。这两条属于可选分支,普通开发改代码不需要。

单元测试:go test ./... 及缩小到具体包

CONTRIBUTING 文档建议:在开始修改 Terraform 源码之前,先跑一遍单元测试套件,确认初始状态下全部通过,避免把改动前的既有失败误判为自己的问题:

go test ./...

开发过程中可以重复执行这条命令来确认测试仍然通过。如果你只改某个具体包,可以只测该包或其前缀下的包以加快循环,文档给出的两个示例是:

go test ./internal/command/... go test ./internal/addrs

区别在于:前者测试internal/command前缀下的所有包,后者只测试internal/addrs这一个包。按同样方式替换成你正在改的包路径即可。

验收测试:TF_ACC=1 与外部服务

单元测试是自包含的,使用 mock 和本地文件,可以在离线环境运行。而 Terraform 的部分组件(如自动 provider 安装机制、Terraform Registry、HCP Terraform、Terraform Enterprise)会与外部服务交互,覆盖这些交互的是所谓的acceptance tests(验收测试),通过在运行测试时设置环境变量TF_ACC=1来启用。文档给出的示例命令:

TF_ACC=1 go test ./internal/initwd

这里./internal/initwd是文档中验收测试示例使用的具体包路径,你可以按同样方式换成自己正在改的包。文档明确建议启用验收测试时聚焦到具体包上,原因有二:可以让测试跑完更快,也更不容易遇到与当前目标无关的系统漂移导致的失败。

验收测试有一个必须遵守的工作习惯:因为它依赖 Terraform 代码库之外的服务,外部系统的漂移导致测试失败是"常见且预期内"的。所以在动一个被验收测试覆盖的系统之前,应先在未修改的工作树上跑一遍该系统的现有测试,确认哪些失败是改动前就存在的,避免把既有失败误判成新改动引入的 bug。

另可参考 e2etest 包说明:该包会在测试开始时现场编译一个真实的 Terraform 二进制再跑端到端测试,直接go test即可;但其中只有很基础的测试能在不设置TF_ACC时执行,要让测试访问外部网络服务同样必须设置该环境变量。

可选:生成代码与依赖变更的配套流程

如果改动涉及生成文件,CONTRIBUTING 文档给出了两条路径:

  • 普通生成文件用 Go 标准方式:go generate ./...,之后用git diff检查生成结果是否符合预期;
  • protobuf 存根(provider plugin protocol 用 Protocol Buffers 定义,工具链不是 Go 依赖、无法用go get安装)走 Makefile:make protobuf,前提是已安装合适版本的protoc。Makefile 中protobuf目标的实际动作是go run ./tools/protobuf-compile .,注释里说明大多数开发任务不涉及改 protobuf 文件,所以这一目标被单独拆开。

如果改动需要新增或升级依赖,文档要求的完整顺序是:

go get github.com/hashicorp/hcl/v2@2.0.0

该命令下载指定版本并把版本选择记录进go.mod、校验和记录进go.sum;随后:

go mod tidy

清理模块元数据中的冗余;最后至少完整跑一遍单元测试确认升级有效:

go test ./...

依赖变更影响共享的顶层文件,评审中更容易产生冲突,所以文档建议把依赖变更单独提交:git add go.mod go.sum后提交一条只包含上述命令结果和最小兼容改动的 commit,再在后续 commit 里使用新依赖。上面的hcl/v2@2.0.0只是源文档的示例,实际使用时替换为你需要的模块与版本。

如何判断环境搭建完成

按文档标准,环境可用的判断条件是连续的三步:go install .编译成功且能在$(go env GOPATH)/bin(或GOBIN指定目录)下找到terraform可执行文件;改动前基线的go test ./...全部通过;需要覆盖外部服务交互时,TF_ACC=1 go test <具体包>在未修改的工作树上先跑通既有测试。PR 层面,CONTRIBUTING 文档的 PR Checks 一节说明合并前单元测试与验收测试都必须通过(外部贡献者还涉及 CLA 签署等检查),所以本地把这两类测试跑顺是提交前的硬性前提。需要留意的限制是:验收测试失败未必是你的改动导致,先用未修改工作树区分既有失败,是文档明确要求而非可选项。

【免费下载链接】terraformTerraform enables you to safely and predictably create, change, and improve infrastructure. It is a source-available tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned.项目地址: https://gitcode.com/GitHub_Trending/te/terraform

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询