在持续交付中构建版本控制

Build versioning in continuous delivery

我对持续交付中的版本控制有一些具体问题。我想我理解的全局工作流程或多或少是这样的:

1) Code
2) Push to version Control
3) Continuous Integration (unit, integration and end-to-end auto testing)
4) Artifacts deployment

版本控制呢?如何管理构建版本?

假设我们正在开发一个基于 Maven 的带有语义版本控制的项目:major.minor.build.

当开发人员向 VCS 提交更改并且 CI 服务器执行构建时,CI 服务器是否应该增加构建版本并在 VCS 中创建标签?

源代码中是否存在此构建版本?如果是这样,在每次推送到 VCS 之后,开发人员应该更新项目,因为 CI 服务器在项目上提交了更改(版本增量)。

我有点困惑,我想以实际的方式了解 CD 工作流程。

一般来说你应该:

  1. 手动管理的版本号。
  2. 任意数量的 "reference" 个数字。

如果您关心 semver 或者您必须为其他 tools/libs 提供兼容性信息,那么第一点至关重要。只有您可以判断新 "release" 是否会破坏任何东西 - 最流行的指示系统遵循 semver 版本控制规则。

第二点("reference" 号)对您来说可能重要也可能不重要。您通常不需要多个 CI/CD 构建版本号(每个流行的 CI/CD 服务都有一个构建版本号 ID,它指的是特定的 "build")。这个号的意义在于,如果需要可以快速查看神器的相关CI/CDbuild/logs

如何合并两个(或更多)部分?

分开 "version" 和 "build" 号码的情况并不少见。事实上,每个 iOS 项目默认都有。在这种情况下,您需要手动管理 "version" 号码,并自动管理单独的 "build" 号码。内部版本号可以在工件的名称中,或者可以在有人检索二进制文件的 --version 信息时打印出来(例如:$ brew info -> 0.9.5 (git revision 18c48; last commit 2015-11-02)

或者,您可以向 semver 添加新组件 (x.x.x.BUILDNUM),使用 semver 的最后一个组件 (x.x.BUILDNUM - 如果您有严格的增量 BUILDNUM) 或者简单地在工件名称中包含 "build" 数字。

这些都是可能的,您必须选择最适合您的情况。您必须定义这些数字的含义并决定数字应该出现在哪里(例如,它应该是 --version 调用的一部分还是应该只是文件名的一部分)。

edit:反思你关于 "should CI server increment the build version and create a tag in VCS?" 的问题 - 我永远不会推荐这个。 CI 服务器也可能有问题,你不应该从 CI 进程修改你的代码。不小心覆盖(例如强行推动)某些东西可能非常危险。这就是为什么最好只使用 CI/CD 服务公开的内部版本号。

您会在这里找到详细的解决方案

Single click code-versioning (Complimenting cloud-native Architecture)

我们的想法是使用 maven 插件 jgit-flow 插件并使用 Jenkins 和这个插件我们创建了整个管道来自动化这个过程。

What about versioning? How manage build versions?

与其他方式相同;在生成要分发的工件(通过云或通过软盘)时,工件和组件应标有唯一且可追溯的版本号。这个数字应该与创建它的源代码直接相关。我们这样做是因为它可以帮助我们正确修复生产系统中的问题、跟踪程序行为变化以及其他一些 support/maintenance/design 事情。无论交付机制如何,我们都应该这样做,因为它很容易做到,并且在您没有能力将源代码与正在执行的程序连接起来的情况下,它可以为您省去很多麻烦,您将做出艰难的假设并且猜测(你的工作 and/or 声望就行了)。

所以请忽略另一个答案中关于不标记你的回购的建议 - 总是标记你的回购。

此外,只要有可能,请尝试确保为要使用的构建生成的版本号已设置在正在构建的程序可执行文件或库中。

When developer commit changes to VCS and CI server perform a build, should CI server increment the build version and create a tag in VCS?

大多数构建系统都具有版本控制或编号功能,Maven included。但是,只有生成部署工件的构建才应该分配版本编号和标记 repos。通常这将排除连续 Integration/Gated 签入构建,因为它们仅用于将传入的开发人员更改与主分支集成。