如何避免在源代码中保留版本号?

共6个回答,已解决, 标签: python git continuous-integration

到目前为止, 我们将巨蟒源代码的版本号保留在 setup. py 中。

每次成功的 ci 运行后, 此版本都会增加。

这意味着中央库的版本每天会增加几次。

由于版本号存储在 git 存储库中的文件中, 因此每次增加版本号都是一个新的提交。

这意味着大约 50% 的提交不是由人类做出的, 而是由 CI 做出的。

我有一种感觉, 我们走错了方向。也许它不是一个好的解决方案, 保持版本号在词。

我们怎么能避免 "无用" 的 CI 提交, 只是增加版本号?

如何避免在源代码中保留版本号?

更新

我们生活在没有人工释放几年。我们没有像 MAIN 这样的版本控制方案。小。而我们过去并没有错过这一点。我知道这并不适用于所有环境。但它适用于我目前的环境。

我们有一个版本号, 它看起来是这样的: 年。月。X

这意味着每个通过 CI 的提交都是一个新版本。

看完答案后, 我意识到: 我需要问自己: 我到底有一个版本号吗?我想没有, 我有一个车牌号。在这方面不需要做更多的工作。

(谢谢你的投票。在提出这个问题之前, 我确信这个问题会被关闭, 因为人们会认为它 "不清楚" 或 "太宽泛")

第1个答案(采用)

处所:

我想这些是讨论解决方案的前提。

  1. 当前版本号保存在一个小跟踪的源文件中, 但您可以摆脱它。
  2. 没有人手动管理版本号, 也不会触发发布过程, 其中包括: (a) 增加版本号, (b) 从源生成, (c) 将生成的结果存储在某个位置。这些都是由 CI 照顾的, 应该保持这样的状态。

解决 方案:

  1. CI 不写入源文件并创建新提交, 只需标记通过 ci检查的特定提交, 然后将标记推送到远程存储库。
  2. 生成脚本应读取当前 HEAD 提交的标记, 并将其用作发布版本的版本号。
  3. 或者, 您可能希望使用 git filter-branch 重写现有的 git 存储库历史记录, 标记以前的版本提交以确保一致性, 删除并停止跟踪版本号源 cile, 然后删除这些 ci 提交。
第2个答案

在源代码中保留版本号是一种常见的做法, 这其中没有什么问题。

您需要将 CI 过程与常规生成、发布发布和发布部署分开。

常规生成: 每天运行, 甚至在每次提交后运行, 可以包括静态代码分析和自动测试, 检查是否可以生成代码。常规生成不应更改版本号。

发布: 只能通过发布管理器的显式手动操作触发。
触发操作可以是用新版本号标记提交、将新合并到发布分支或只使用更改保存在特殊文件中的版本号的提交 (例如 pom.xml )。例如, 请参考 git 流。
发布发布分配一个新的版本号 (自动或手动), 在必要时将其提交到源代码中, 使用新版本生成二进制包并将其上载到二进制包存储库 (例如 Nexus、devpi、本地 APT 存储库,Docker 注册表等)。

发布部署: 另一个手动触发的操作, 该操作从包存储库中获取现成的二进制包并将其安装到目标环境 (开发、QA/UAT/暂存、CANARY 部署生产的一部分或整个生产环境)。

第3个答案

我认为你应该使用 git 流。并创建一个主分支和开发分支。每次 CI 检查开发版本号保持不变。每次创建版本 (如合并到 master) 时, 您都可以通过 CI 增加版本号。

或者我错过了什么, 但在我的意见中, 没有理由每次词人运行时版本号都会增加。

所以总之, 你最好考虑什么时候 "发布" 改变一个新版本!!

第4个答案

如果项目保存在 git 存储库中用于生产, 只需使用您的 git describe 船的任何版本的浮子, 不需要将其存储在跟踪的文件中, 因为结果标识了特定的历史记录, 并且您已经获得了该历史记录。

如果源是单独发送的, 则可以使用 git archive 该属性, 并 export-subst导出的源中嵌入所需的几乎任何内容。

第5个答案

PS: 作为一个新用户不能添加评论。

支持并通过 @VibrantVivek扩展此答案。

对于连续集成,存储库的标记是非常重要的, 无论您是将其保留在代码中, 还是简单地通过任何其他git方式, 在每次成功的 ci 之后都必须有相应的标记版本。

如果你有 CI tags\ 版本, 这不是反对提交, 那么真正的错误是在这里工作。

和 + 1 为马丁·福勒, 这里另一个链接更详细的文章 (或多或少由同一个人) https://www.thoughtworks.com/continuous-integration (建议阅读请)

第6个答案

关于你的第一个问题:

我们怎么能避免 "无用" 的 CI 提交, 只是增加版本号?

请使用持续集成 (ci)是一种开发实践, 它通过自动生成对每个集成进行验证 check-in , 从而使团队能够及早发现问题。

话虽如此, 但要在此阐明:

  • 从实践中: 每次提交都应建立在集成计算机上

  • 在如何执行下: ci 服务器监视存储库, 并在更改发生时将其签出

简单地说, ci 服务器应该只在有新提交的情况下增强版本,从而确保每个代码提交都是可发布的.

看起来从 OP, 在你的地区有更多 (正如你说) "无用" commits CI server 从。

基于您的 CI 机制, 我希望您必须能够控制它, 几乎有方法可以处理我们使用的每个工具。(例如: 比特桶的网络钩子, 版本插件等)。

所以, 确保只有在新的提交之后, 我们才有了新的版本。

现在, 如果您正在考虑这些常规的夜间集成版本, 请阅读以下内容:

许多组织都会定期建立在一个有时间的时间表上, 比如每晚。这与连续生成不是一回事, 也不足以实现连续集成。持续集成的全部意义在于尽快发现问题。夜间构建意味着, 在任何人发现错误之前, 它们就会在整整一天内没有被发现。一旦他们在系统中呆了那么久, 就需要很长时间才能找到并删除它们。

你也提到过:每一次通过 ci 的提交都是一个新的版本, 因此在某种程度上你已经在真正的 ci 上了。

尽管如此, 如果你仍然无法找出你如何可以避免 "useless" commits 版本号, 那么我建议添加另一个问题, 详细说明你的 ci mecahnism 是如何工作的, 为什么它是困难的, 在给定的条件下。 我打赌一定有解决办法。也可以看看githubflowvsgitflow

资料来源:马丁·福勒关于 ci 的白皮书

如何避免在源代码中保留版本号?

在这方面, 希望进一步阐述 @void 的答案, 因为它是在那里说:

It is a common practice to keep a version number in the source code, there is nothing wrong in that.

有些项目必须知道 version 在这种情况下的确切部署 (出于一些重要的 xy 原因), 它们将版本保留在源代码中 HTTP GET , 并从 api 中获取版本(一种方法) , 以了解当前部署在_x 上的版本_**_服务器_**上。

然而, 它更多的是在要求上, 假设对于另一个项目没有这样的情况, 然后推荐的保持 version 方式是使用 commit 哈希/ tagging 每个成功的 ci 生成.

您可以在这里获得更多详细信息:

希望这有所帮助。

相关问题

通过随机抽样其他列数据创建新列 如何使用熊猫获得包括每一个组合的计数 如何有效地展开矩阵的值与小块? 如何避免在源代码中保留版本号? 为什么 “git 状态” 显示我在主分支上,而 “git 分支” 不显示? 缺少 inotify 事件 (在。Git 目录