Should .terraform.lock.hcl be included in the .gitignore file?

从我目前的知识,没有理由 .terraform.lock.hcl应该包括在 .gitignore。这个文件没有隐私,是吗?

44450 次浏览

根据 依赖锁定文件上的 Terraform 文档:

Terraform 自动创建或更新依赖关系锁文件 每次运行 terraform init 命令时,都应该包含以下内容 文件,以便您可以讨论 通过代码审查对外部依赖性进行的潜在更改,只需 因为您将讨论对配置本身的潜在更改。

理解为什么要提交这个文件的关键在依赖安装行为的下面部分:

当 terraforminit 正在安装所有提供程序时 配置所需的,< strong > Terraform 考虑了两个版本 配置中的约束和记录的版本选择 在锁文件 .

如果某个特定的提供程序没有现有的记录选择,Terraform 将选择与给定的 版本约束,然后更新锁文件以包含 选择。

如果锁中已经记录了某个特定提供程序的选择 文件,Terraform 将总是重新选择该版本进行安装, 即使更新的版本已经可用 ,您也可以覆盖它 behavior by adding the -upgrade option when you run terraform init, in 这样 Terraform 就会忽略现有的选择 再次选择与该版本匹配的最新可用版本 约束。

本质上,这是为了让 Terraform 继续使用您添加它时选择的提供程序版本。如果你没有签入锁定文件,你将总是自动升级到最新版本,遵守代码中的约束,这可能导致意外后果。

注意: 在执行 init 调用时,您可以通过传递-update 标志来强制 Terraform 升级。

terraform init -upgrade

跨平台发展的最新情况

From the Terraform documentation on the 提供程序锁定命令:

指定环境中的目标平台,例如, 让使用 Terraform 配置的两个开发人员 他们的 Windows 或 MacOS 工作站和自动化系统应用 在 Linux 上运行时的配置。

在这种情况下,您可以选择验证 提供程序支持所有这些平台,并预填充锁 文件必要的校验和,通过运行地形提供程序锁定 并具体规定了这三个平台:

terraform providers lock \
-platform=windows_amd64 \
-platform=darwin_amd64 \
-platform=linux_amd64 \
-platform=darwin_arm64 \
-platform=linux_arm64

The above example uses Unix-style shell wrapping syntax for readability. If you are running 那么你需要用插入符号(对于 cmd)或反勾(对于 PowerShell)替换反斜杠。

因此您仍然应该将锁文件签入到版本控制中,但是您应该确保锁文件包含所有平台上的提供程序的校验和。

我认为上面的建议只有在源代码控制存储库被一组同质的工程师和/或一个工程师使用时才有用。对于一个庞大的异构群体,它将失败,并出现以下错误:

│ Error: Failed to install provider
│
│ Error while installing hashicorp/null v3.1.1: the local package for registry.terraform.io/hashicorp/null 3.1.1 doesn't match any of the checksums previously recorded in the dependency lock file
│ (this might be because the available checksums are for packages targeting different platforms)

要解决这个错误,删除.terraform.lock.hcl 文件,然后重新初始化。它将为您自己的工作站重新生成该文件。

我很乐意承认我们做错了但至少在我们的案子里,我们需要把这个加到。Gitignore,或者每次一个工程师提交,所有使用不同操作系统的工程师都会得到这个错误,必须再次使用 terraform init

您还可以执行以下命令,以便在您的环境中建立平台:

terraform providers lock -platform=darwin_amd64 -platform=darwin_arm64 -platform=linux_amd64