首页 > 解决方案 > 在 ConcourseCI 中自动化 semver

问题描述

我有一个 ConcourseCI 管道,它使用此资源类型自动增加我的版本号:https ://github.com/concourse/semver-resource

我的资源声明如下所示:

  - name: version
    type: semver
    source:
      driver: git
      initial_version: 0.0.1
      uri: {{version-repo-uri}}
      branch: {{version-repo-branch}}
      file: {{version-file}}
      private_key: {{git-key}}

我的工作是这样的:

- name: increment-version
    plan:
      - get: {{git-repo-name}}
        trigger: true
      - get: version
        params: {bump: patch}
      - put: version
        params: {file: version/version}

正如你所看到的,现在我总是在更新补丁版本。但是,我想要一种简单且最好是自动化的方式,让管道根据情况增加 MAJOR、MINOR、PATCH 或 RC 版本。

是否有一个 git hook 或类似的东西会知道什么时候碰撞什么?将 semver 自动化到管道中时的任何实施最佳实践?我应该使用其他任何 Concourse 资源类型吗?或者这是我们绝对应该让人类决定的事情?在这种情况下,如何轻松地将“手动”步骤集成到 CD 管道中?

我能想到的最接近的事情是在我的项目(提交到 github)中有一个带有预期版本的版本文件,它将设置 MAJOR、MINOR、PATCH 编号。管道获取该文件,以某种方式将其用作基础,并且仅增加 RC 编号,但这感觉非常容易出错。

需要说明的是,我不是在问理论上如何发布版本,以及主要、次要或补丁的含义。我在实践中询问如何实施https://semver.org/上列出的那些建议。

标签: semantic-versioningconcourse

解决方案


我对这个问题的解决方案是标记提交,以及一个读取 Git 提交消息并根据内容逐步执行版本的脚本:

如果当前提交上存在版本标签:始终执行PATCH。

别的:

列出直到前一个标签的所有提交。

  • 如果任何消息包含“step:major”,则 step MAJOR
  • 否则,如果所有消息都包含“step:patch”或“step:micro”,那么 step PATCH
  • 其他步骤 MINOR

这意味着如果提交者未在消息中声明任何内容,则假定更改是功能更改。

在分发构建的工件之前标记并推送提交。否则,下一个构建可能会生成一个已经存在的版本。

只需根据用例的需要修改逻辑。


推荐阅读