我们目前正在使用Jenkins进行CI。 我选择了Jenkins,因为我们在许多不同的平台(Linux,Windows,嵌入式系统)上部署了许多程序。这对我们有很大帮助,但我们很难正确管理程序版本号。 一些开发人员使用他们自己的符号,我希望稍微规范一切...
我考虑两个基本面版本号:
#define MAJOR 1
#define MINOR 0
我考虑添加两个额外的数字,例如:
#define BUILD_NUMBER 66
#define SVN_REVISION 77
但我面临的问题是:
首先,例如,程序FooServer依赖于X库(我们开发的),每个lib trunk可能具有不同的SVN版本。 因此,如果应该包含SVN修订号,那么使用FooServer修订号或项目SVN URL(程序+依赖项)的最高SVN修订号是否更相关?
其次,我考虑使用Jenkins BuildNumber变量将程序与Jenkins中的(存档)作业相关联。我只是想知道它是否足够相关。
此外,我需要在版本字符串中添加一个信息,以区分夜间快照构建(不是开发人员构建)和正在生产中部署的版本。 也许通过添加其他信息?
最后,这些#define
当然会存储在Build时生成的cpp头文件中,永远不会被提交到repo。为了防止开发人员从他们的工作站中释放出来(我们遇到了太多问题)。
在SVN repo上,头文件将保持在开发阶段:
#define MAJOR 1
#define MINOR 0
#define BUILD_NUMBER X
#define SVN_REVISION dev
嗯,欢迎您的体验。我们团队的开发人员不需要太多限制,但另一方面我需要建立一些符号规则以提高稳健性。
答案 0 :(得分:1)
如果所有代码都在一个SVN仓库中,那么只使用最新的版本号就可以了。实际上,如果某个库更改并触发项目的新构建,则新构建不应具有与旧构建相同的rev,因为它不相同。
我还没有找到很多用于在编译中包含内部版本号的内容。使用构建日期可以提供更好的构建标识。有一个名为ZenTimestamp Plugin的插件,它为您提供了一个BUILD_TIMESTAMP变量,可以在您选择的日期格式的脚本中使用。
如果您正在为作业本身的每个构建存档PDB,那么构建号可能仍然对您有用。我将它们存储在其他地方,由SVN修订版命名,所以它并不是真的必要。
你的最后一步是明智的。我们(我工作的公司)也这样做,除非在SVN中甚至没有硬编码的。
我不知道您如何处理跨平台项目,但我们使用CMake进行项目生成,因此我们只需在配置时生成包含正确值的头文件({{1}等等)。这样,Jenkins构建步骤可以使用SVN_REVISION和BUILD_TIMESTAMP变量的内容生成CMake预加载配置文件。在这个阶段添加额外的信息很容易,例如它是生产版本还是每晚。