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

时间:2015-11-20 07:26:59

标签: continuous-integration 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中创建标记?

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

我有点困惑,我希望以实用的方式理解CD工作流程。

3 个答案:

答案 0 :(得分:23)

一般来说,你应该:

  1. 手动管理的版本号。
  2. 任意数量的"参考"号。
  3. 如果你关心semver或者你必须提供其他工具/库的兼容性信息,第一点是至关重要的。只有你能分辨出一个新的"发布"打破任何东西 - 最流行的指示系统遵循semver版本规则。

    第二点("参考"号码)对您来说可能重要,也可能不重要。您通常不需要多个CI / CD版本的版本号(每个流行的CI / CD服务都有一个构建版本号ID,它指的是特定的#34;构建") 。这个数字的要点是,如果需要,您可以快速检查工件的相关CI / CD构建/日志。

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

    分开&#34;版本&#34;并不罕见和&#34;构建&#34;数字。事实上,每个iOS项目默认都有。在这种情况下,您拥有&#34;版本&#34;手动管理的号码,以及单独的&#34;构建&#34;号码自动管理。内部版本号可以是工件的名称,也可以在有人检索--version信息时打印(如果是二进制文件)(例如:$ brew info - &gt; 0.9.5 (git revision 18c48; last commit 2015-11-02) < / p>

    或者你可以向semver(x.x.x.BUILDNUM)添加新组件,使用semver的最后一个组件(x.x.BUILDNUM - 如果你有一个严格的增量{{1}我也不建议这样做或者只是包含&#34; build&#34;工件名称中的数字。

    这些都是可能的,你必须为你的案例挑选最好的。你必须定义这些数字的含义并决定数字的呈现位置(例如,它应该是BUILDNUM调用的一部分还是应该只是文件名的一部分。)

    编辑:反思您的问题&#34; CI服务器是否应该增加构建版本并在VCS中创建标记?&#34; - 我永远不会推荐这个。 CI服务器也可能存在问题,您永远不应该从CI流程修改代码。意外覆盖(例如强制推动)某些事情可能非常危险。这就是为什么只使用CI / CD服务公开的内部版本号更好的原因。

答案 1 :(得分:0)

<块引用>

版本控制怎么样?如何管理构建版本?

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

所以请忽略另一个答案中关于不标记您的存储库的建议 - 始终标记您的存储库。

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

<块引用>

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

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

答案 2 :(得分:-1)

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

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

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