
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 文档的说法准备工作有两项安装 Go 编译器和 Git 版本控制系统用 Git 把仓库 clone 到你选择的位置。Go 版本以仓库中的 .go-version 文件为准。该文件当前内容是1.26.4go.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.devno -o bin/ . go build -ldflags -w -s -X main.experimentsAllowedyes -o bin/ .文档同时提醒官方构建中只有 alpha 版本才允许 experiments第三方分发建议沿用这一约定。这两条属于可选分支普通开发改代码不需要。单元测试go test ./... 及缩小到具体包CONTRIBUTING 文档建议在开始修改 Terraform 源码之前先跑一遍单元测试套件确认初始状态下全部通过避免把改动前的既有失败误判为自己的问题go test ./...开发过程中可以重复执行这条命令来确认测试仍然通过。如果你只改某个具体包可以只测该包或其前缀下的包以加快循环文档给出的两个示例是go test ./internal/command/... go test ./internal/addrs区别在于前者测试internal/command前缀下的所有包后者只测试internal/addrs这一个包。按同样方式替换成你正在改的包路径即可。验收测试TF_ACC1 与外部服务单元测试是自包含的使用 mock 和本地文件可以在离线环境运行。而 Terraform 的部分组件如自动 provider 安装机制、Terraform Registry、HCP Terraform、Terraform Enterprise会与外部服务交互覆盖这些交互的是所谓的acceptance tests验收测试通过在运行测试时设置环境变量TF_ACC1来启用。文档给出的示例命令TF_ACC1 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安装走 Makefilemake protobuf前提是已安装合适版本的protoc。Makefile 中protobuf目标的实际动作是go run ./tools/protobuf-compile .注释里说明大多数开发任务不涉及改 protobuf 文件所以这一目标被单独拆开。如果改动需要新增或升级依赖文档要求的完整顺序是go get github.com/hashicorp/hcl/v22.0.0该命令下载指定版本并把版本选择记录进go.mod、校验和记录进go.sum随后go mod tidy清理模块元数据中的冗余最后至少完整跑一遍单元测试确认升级有效go test ./...依赖变更影响共享的顶层文件评审中更容易产生冲突所以文档建议把依赖变更单独提交git add go.mod go.sum后提交一条只包含上述命令结果和最小兼容改动的 commit再在后续 commit 里使用新依赖。上面的hcl/v22.0.0只是源文档的示例实际使用时替换为你需要的模块与版本。如何判断环境搭建完成按文档标准环境可用的判断条件是连续的三步go install .编译成功且能在$(go env GOPATH)/bin或GOBIN指定目录下找到terraform可执行文件改动前基线的go test ./...全部通过需要覆盖外部服务交互时TF_ACC1 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),仅供参考