【问题标题】:Global build number for Jenkins pipelineJenkins 管道的全局内部版本号
【发布时间】:2018-09-06 10:04:45
【问题描述】:

我们正在为构建管理环境从 VSoft Continua CI 切换到 Jenkins。由于我们使用稍微修改的 Gitflow 流程,我们希望 Jenkins 能够从任何功能、发布或修补程序分支和拉取请求构建,我们决定使用 Jenkins 流水线。

release 和 hotfix 分支构建的版本号基于分支名称(例如 release/2.1.0),而任何其他分支或 pull request 的构建基于日期(例如 2018 年 9 月 6 日解析为 18.9 .6)。 Continua CI 为所有构建配置提供自动递增构建号,这就是为什么我们使用此构建号作为构建号的最后部分(例如 2.1.0.10、18.9.6.11、2.1.0.12 ......)。此生成的版本号作为参数传递给 MSBuild,使用此版本号作为 .NET 二进制文件的文件版本和程序集版本。

我正在 Jenkins 中寻找类似的解决方案。 Jenkins Pipeline 为每个分支和拉取请求分配一个单独的自动增量构建号,这可能导致来自不同分支的两个构建具有相同的版本。我已经尝试使用全局环境变量来存储版本并在每次构建时增加值,但似乎无法从管道任务中设置全局环境变量。

Jenkins Pipeline 项目有没有办法在所有分支/拉取请求之间共享内部版本号?

【问题讨论】:

  • 我认为没有“内置”机制可以做到这一点。在不了解您的工作设置(如多分支、GitHub 组织文件夹等)的情况下,很难尝试并推荐特定的解决方案。立即出现在我脑海中的一种方法是从管道中调用build 的单独工作,从中获取编号,然后在构建中使用它。那份工作只是一个柜台。不是说这是一个很好的解决方案,但它是一个解决方案。

标签: jenkins jenkins-pipeline


【解决方案1】:

这里有一些想法:

  • 让它基于文件:让你的舞台在master节点上执行;选择一个文件并确定格式(属性文件可能是一个好的开始); lockread,更新,写,unlock

  • 将此委托给外部服务(例如,具有 REST 端点,用于request 一个 ID)。

  • 为它写一个插件。

【讨论】:

  • 感谢您的想法,我们尝试了@mkobit 提出的方法,使用专用分支作为参考,但这感觉很奇怪。我想我们现在将使用外部服务并考虑编写一个插件。此处显示了基于 Python 的 Web 服务器的示例实现:quernus.co.uk/2016/08/12/…