如何跨不同的构建工具管理发布版本?

时间:2018-01-15 21:23:20

标签: git version-control version project versioning

我正在考虑改进发布版本在我的项目中的工作方式。发布的结果由多个工件组成,涉及多个工具及其相应的控制文件,具体取决于其域:

  • CMake(CMakeFiles.txt)for C / C ++
  • Maven(pom.xml)for Java
  • Node.js的NPM(package.js
  • Sphinx(conf.py)用于ReadTheDocs托管的文档
  • 任何其他工具(例如,我认为我们很快就会为每个版本生成Docker镜像,因此请在此处添加Dockerfile

其中每个通常都包含一个 Project Version 字段,其中写入了发行版本,发布工件从那里获取其版本号。我想将散布在多个文件周围的重复版本号统一到一个单一的事实来源中。我搜索过但找不到令人满意的解决方案,所以我在这里问:

有哪些最佳实践或标准可用于强健&在跨越多种语言/构建工具的项目中轻松管理版本号?特别是至少对于表示avobe的4种第一类型,尽管通用解决方案是首选。

一个重要的要求是我宁愿避免包装脚本(例如用sed进行字段替换),以使工具独立于更多外部工具(即我希望构建命令保持“ cmake “而不是” cmake_prepare_and_run.sh “)。

更新:我认为一般的良好做法将CI限制为代码库上的只读操作,这是我在项目中强制执行的策略。我真的不需要也不想要CI太聪明,并且决定在没有任何监督的情况下自动发布新版本。

2 个答案:

答案 0 :(得分:1)

通常,解决方案A是最常实施的解决方案。

  • 版本控制系统通常不会改变(如果有的话)
  • 大多数构建过程已经有一个插件调用正确的git命令并生成一个包含版本信息的属性文件。

例如,对于maven,那将是ktoso/maven-git-commit-id-plugin

答案 1 :(得分:1)

我对这个问题的解决方案 - 到目前为止,这些是我遇到的两个想法:

一个。从Git标签获取发行版。在构建任何模块时,构建工具必须在git describe --tags(可能带有--always和/或--abbrev=0)的行中执行某些操作,并将结果提取到包含版本的变量中。我会在Git中有一个“ release ”分支,它只会用于发行版,而新发布工件只会发布给这个分支中用某个版本号标记的提交。这就要求每个单独的构建工具都能够使用命令轻松运行子shell并获取命令的结果。这也意味着版本号与版本控制系统相关联。

B中。在存储库的根目录中创建一个名为VERSION的文本文件,其中包含版本号。然后,在执行正常的构建步骤之前,将每个构建工具配置为首先读取该文件并从中加载版本号。它仍然取决于编辑文件,但至少这将集中到一个文件,它将始终是相同的,坐在同一个地方。

两种解决方案都要求构建工具允许执行这些操作;对于像CMake和Python这样的人来说这很容易,但是我对Maven,NPM甚至是解析Dockerfiles等工具都不熟悉,所以我不确定这些是否是通用的解决方案。