Continuous integration CI如何影响语义版本控制?

Continuous integration CI如何影响语义版本控制?,continuous-integration,semantic-versioning,Continuous Integration,Semantic Versioning,在中,建议将所有内容(包括CI脚本)保留在版本控制中。实际上,像gitlab CI这样的当前CI系统已经遵循这一经验法则,并在同一代码库中搜索CI脚本。 另一方面,每当代码库发生变化时,我们都在对其进行版本控制(以及它的构建工件)。为此,我们遵循语义版本控制;增加修补程序的修补程序字段,减少非破坏性功能的修补程序字段,等等… 我们通过在CI中检查版本来确保在提交之间增加版本。 但是,有些提交只更改CI脚本;i、 e.添加分析作业、优化另一个作业等 在这冗长乏味的前言之后,我的问题是,对CI的这些

在中,建议将所有内容(包括CI脚本)保留在版本控制中。实际上,像gitlab CI这样的当前CI系统已经遵循这一经验法则,并在同一代码库中搜索CI脚本。
另一方面,每当代码库发生变化时,我们都在对其进行版本控制(以及它的构建工件)。为此,我们遵循语义版本控制;增加修补程序的修补程序字段,减少非破坏性功能的修补程序字段,等等…
我们通过在CI中检查版本来确保在提交之间增加版本。
但是,有些提交只更改CI脚本;i、 e.添加分析作业、优化另一个作业等
在这冗长乏味的前言之后,我的问题是,对CI的这些更改进行版本控制的最佳实践是什么?因为它可能会影响最终生成的工件(例如更改CI作业中的生成标志以进行优化或…。

在这种情况下可以增加版本吗?

Git是一个版本控制系统。每次您向git repo提交某个内容时,它都会使用表示该版本repo的内容哈希值来标记repo的内容。git repo内容的语义版本控制是多余和无意义的。SemVer的全部目的是为生产者提供一种向消费者传达风险的手段。换句话说,语义版本控制用于构建产品标签,而不是用于生成构建的位

如果您试图对回购协议应用语义,那么您是在标记产品输入,而不是产品本身。在执行所有单元/回归/验收测试之前,不应应用SemVer字符串。否则,您如何确定代码/构建脚本更改是否破坏了任何东西


预构建标签无法工作。能够连续两次复制完全相同的输出的构建过程非常罕见,如果有的话。在世界上有多个API/包并附加了相同的SemVer字符串,这违反了最佳实践。如果标记repo内容,然后将该标签转发到生成输出,则每次运行生成时,都会生成包含不同内容的包。总有一些风险,其中一个以上的输出将被释放到野外。许多有安全意识的消费者密切关注他们所消费的包的内容散列。如果检测到某个特定的生产商在不影响版本号的情况下发布了多个包哈希,将发出危险信号,并导致对该生产商内部流程的不信任


这是一个非常深刻的话题,在这里无法完全涵盖。其他需要考虑的问题是OS/编译器/工具链更新。您是否也会将整个构建工具链提交给同一个repo?这是一个站不住脚的方法,充满了我无法完全列举的危险,如果不花几个月的时间来记录它们的话

最佳做法:

  • 使用语义提交消息,明确说明开发人员的意图
  • 在包装/贴标签之前验证构建输出
  • 对于非预发布的出版物,始终让人参与其中

为了清楚起见,让我补充一点,在repo中维护构建脚本和工具清单被认为是一种最佳实践。它将脚本和工具的版本与正在构建的代码的版本联系起来。Git很好地完成了这项工作,它创建了一个包含整个repo状态的提交散列(如果我没记错的话,减去标记)。但随着旧版本的工具从文件共享/提要中退出,最终会出现问题,特别是当发现它们会产生安全漏洞时

有时,您的产品的旧版本无法使用早期构建过程进行复制。签入二进制文件通常会被提升为解决此问题的一种方法,但我认为这是一种反模式。您将来可能永远不会想要或需要的二进制文件不应该存储在您的repo中。它只是把一切都阻塞了

考虑使用备用的归档系统。维护旧工具的单独存档不是一个坏主意,但您经常会发现,如果不对构建机器进行重大重新配置并重新引入众所周知的安全风险,您就无法在当前硬件和操作系统上运行它们。您应该根据最新的已知风险,并权衡需要从非常旧的提交散列中构建的额外工作(如果/当有一天到来时)的成本,经常删减此类归档


最好是维护一个最新的构建系统,该系统可以将所有代码库构建回其历史中的某个合理点。这一点通常是您愿意在bug修复中积极支持的最古老的部分。

对git repo的内容进行版本控制是多余的。问问你自己,你用SemVer来翻译的是什么?是产品的包输出还是API?这个代码库是否生成了多个API包?您是说每次提交到git repo都会更改包的版本吗?我想确保我正确理解了你的前言和问题。@g7p,不,我是说git已经有了用于此目的的提交哈希。将SemVer标签应用于git哈希可以说是不错的,但您使用该标签进行版本控制的具体内容是什么?是git散列还是回购协议中的其他随机内容?如果包含SemVer字符串的标签还包含对该字符串应用的API或包目标的引用,则可以。记住,它是回购协议的一个版本(git hash),为版本化产品的生产提供了机器和素材。将git哈希添加到输出端的build meta标记中总是正确的