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

时间:2019-03-29 11:22:43

标签: python git continuous-integration

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

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

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

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

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

我有种感觉,我们走错了路。将版本号保留为ci可能不是一个好的解决方案。

我们如何避免仅增加版本号的“无用” CI提交?

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

更新

我们生活了好几年,没有手动发布。我们没有像MAJOR.MINOR这样的版本控制方案。我们过去从未错过这一点。我知道这并不适用于所有环境。但这适用于我当前的环境。

我们有一个看起来像这样的版本号:YEAR.MONTH.X

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

阅读答案后,我意识到:我需要问自己:我是否有版本号?我想不是。我有一个内部编号。在这种情况下,不需要更多。

(谢谢您的投票。在问这个问题之前,我已经确定这个问题将会结束,因为人们会认为这是“不清楚”或“范围太广”)

6 个答案:

答案 0 :(得分:5)

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

您需要将CI过程分开进行常规构建,发布发布和发布部署。

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

发布发布:只能由发布管理器进行明确的手动操作来触发。
触发操作可以是用新版本号标记提交,将新合并到发行分支中,或者仅是更改保留在特殊文件中的版本号的提交(例如task modify attr:C)。以git flow为例。
发布发布会分配一个新的版本号(自动或手动),如有必要,将其提交到源代码中,使用新版本构建一个二进制软件包,然后将其上传到二进制软件包存储库(例如Nexus,devpi,本地APT存储库,Docker)注册表等)。

发布部署:另一种手动触发的操作,该操作从程序包存储库中获取一个就绪的二进制程序包,并将其安装到目标环境(开发,QA / UAT /登台,金丝雀部署的部分生产或整个生产环境)。

答案 1 :(得分:4)

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

或者我有什么遗漏,但是在我看来,没有理由每次ci运行都会增加版本号。

因此,您最好应该考虑何时将更改“发布”到新版本!

答案 2 :(得分:4)

如果项目保存在git仓库中供生产使用,则只需使用var storageFile = await StorageFile.GetFileFromApplicationUriAsync( new Uri("ms-appx:///Assets/GuitarTest1.mp3") ); 的任何变体使您的船浮起,就无需将其存储在跟踪文件中,因为结果可以识别特定的历史记录,并且您已经那里的历史就在那里。

如果源是单独提供的,则您可以use git archive and the export-subst attribute将几乎所需的任何内容嵌入导出的源中。

答案 3 :(得分:4)

  

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

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

对于 Continuous-Integration (连续集成),对存储库进行标记非常重要,无论是在每次成功配置项之后将其保留在代码中还是仅通过其他任何 git 方式进行存储必须是相应的标记/版本。

如果您有不反对commit的CI标记/版本,那么这里确实有问题。

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

答案 4 :(得分:3)

前提:

我认为这是讨论解决方案的前提。

  1. 当前版本号保存在git跟踪的源文件中,但是您可以摆脱它。
  2. 没有人手动管理版本号,也没有触发发布过程,该过程包括:(a)增加版本号,(b)从源代码构建,以及(c)将构建结果存储在某个地方。这些由CI负责,应该保持这种方式。

解决方案:

  1. CI无需写入源文件并创建新的提交,而只是对通过CI检查的特定提交进行 tag 标记,然后将标签推送到远程仓库。
  2. 构建脚本应读取当前HEAD提交的标记,并将其用作发布发行版的版本号。
  3. (可选)您可能希望使用public void Save() { //Saving the data into Application.persistentDataPath } public void Load() { //Loads the data from Application.persistentDataPath Debug.LogFormat("Loading ARWorldMap {0}", path); var worldMap = ARWorldMap.Load(path); if (worldMap != null) { m_LoadedMap = worldMap; Debug.LogFormat("Map loaded. Center: {0} Extent: {1}", worldMap.center, worldMap.extent); UnityARSessionNativeInterface.ARSessionShouldAttemptRelocalization = true; var config = m_ARCameraManager.sessionConfiguration; config.worldMap = worldMap; UnityARSessionRunOption runOption = UnityARSessionRunOption.ARSessionRunOptionRemoveExistingAnchors | UnityARSessionRunOption.ARSessionRunOptionResetTracking; Debug.Log("Restarting session with worldMap"); session.RunWithConfigAndOptions(config, runOption); } } 来重写现有的git repo历史记录,标记以前的版本提交以保持一致性,删除并停止跟踪版本号源文件,然后摆脱那些CI提交。
  4. li>

答案 5 :(得分:3)

第一个问题:

  

我们如何避免“无用的” CI提交而增加了   版本号?

请注意持续集成(CI)是一种开发实践,它通过自动构建来验证每个check-in,从而使团队能够及早发现问题。

话虽如此,想在这里阐明:

  • 从实践开始: 每个提交都应基于集成 机器

  • 操作方法如下: CI服务器监视存储库并在发生更改时签出更改

简而言之,配置项服务器 应该仅在有新提交的情况下 增强版本 ,并且确保每个代码提交都是可释放的。

从OP看来,在您所在的地区有更多(如您所说)“没用” commits中的CI server

基于您的CI机制,我希望您应该/必须能够控制它,几乎我们可以使用每种工具来处理它。 (例如:bitbucket中的webhooks,版本插件等)。

因此,请确保仅在提交新内容后,我们才有新版本。

现在,如果您正在考虑定期进行夜间集成,请阅读以下内容:

许多组织定期进行定期构建,例如每晚。 这与持续构建不同,并且不足以进行持续集成。持续集成的全部目的是尽快发现问题。每晚生成的内容意味着在任何人发现它们之前,整整一天都不会发现它们。一旦它们在系统中呆了很长时间,就需要很长时间才能找到并删除它们。

您还提到过:每一个通过CI的提交都是一个新版本,因此,您已经使用了真正的CI。

尽管如此,如果您仍然无法确定如何避免使用"useless" commits版本号,那么我建议添加另一个问题,详细说明您的CI机制如何工作以及为什么在给定条件下很难 我敢肯定一定有解决方案。也可以看看GithubFlowVsGitFlow

源:Martin fowler's white paper on 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每个成功的配置项构建。

您可以获取更多详细信息here

希望这会有所帮助。