在使用Terraform进行升级和自动测试时,需要考虑版本约束的策略
背景 -> 背景情况
在terraform中,您可以使用与maven和rubygems类似的版本约束语法。这种语法可以让您对模块和提供程序的版本进行灵活的指定。
Renovate会根据版本规定灵活地制作升级版本的公关活动(太厉害了!)。
~> X.Y という書き方の場合はその範囲内で最新バージョンにするPRと、 メジャーバージョン(X部分)を上げるPRを別で作成
>= X.Y という書き方の場合はメジャーバージョンアップとマイナーバージョンアップも区別せずPRを作成
可以做出如此熟练的事情(有关 ‘そもそもの ~> と >= 的行为差异,请参阅此处)。
将GitHub Actions与terraform plan自动执行等Renovate组合在一起,版本升级几乎可以自动完成,非常方便。
问题
如果要使用Renovate和GitHub Actions来自动更新模块和提供程序的前提下,应该如何编写版本指定?
2023年7月10日更新
数个月前,Renovate Bot更新后可以使用>=等符号来更新.terraform.lock.hcl文件。因此,现在应该使用>=而不是以下的=或~>。非常感谢Renovate Bot的改进!
建議
-
- モジュールは = X.Y.Z または X.Y.Z 1
プロバイダは ~> X.Y
让我们用中文写吧。
应该使用模块编写的原因是什么?
“「Terraform」模块的5种反模式及其最佳实践”中的第5个反模式是「仅指定模块的最低版本」。
顺便说一下,如果按照常规方法进行操作,版本升级会变得繁琐。但通过renovate,这些过程会自动化,使得这种实践变得非常容易进行。
将供应商写在`~>`中的含义是什么?
服务提供商与模块不同,现在不需要指定锁定文件,因此不需要使用等于(=)来指定。因此,我们会比较大于等于(>=)和波浪符(~>),我认为波浪符(~>)更好。
terraform在普遍情况下推荐语义化版本控制(例如,在模块版本控制方面)。因此,terraform本身和提供者几乎都是基于语义化版本控制的。
因此,当版本X.Y.Z的X部分发生变化时,意味着在提供程序中有不兼容的更改。
如果使用>=的方式进行编写,当使用terraform init -upgrade来升级提供程序时,可能会升级到不兼容的版本,从而导致terraform plan出现错误。
如果这个声明在根模块中,那还好,但如果将其写在分发的子模块的required_version等中,那么在引用该子模块的所有根模块中都会出现问题。
从语义上讲,使用>=意味着它将在可能导致兼容性问题的未来重大版本更新后继续正常工作,这与实际情况不符。
如果您按照这种方式编写,那么在进行主要版本升级时,需要修改version.tf文件,这会导致版本升级被延迟的问题。但如果使用renovate,这个问题也可以通过自动化和降低成本来解决。
总结
Renovate是一个聪明地支持复杂升级的神器,再也不用烦恼了!
赞助商
这篇文章是根据Speee内部的经验和Speee的工作时间来撰写的。