掘金 后端 ( ) • 2024-05-06 11:44

大家好,我是孔令飞,字节跳动云原生开发专家、云原生实战营 知识星球星主。欢迎关注我的公众号【令飞编程】,Go、云原生干货不错过。

在 Go 项目开发过程中,我们通常会为组件指定一个版本号,并且版本号通常遵循语义化的版本规范。但是,很多时候,我们的版本号由开发人员根据历史版本号指定,存在以下问题:

  1. 主观性和不一致性: 手动生成版本号容易受到个人主观意见的影响,导致不一致性。不同的开发者可能会根据自己的理解和偏好来生成版本号,导致版本号的规则和格式不统一;
  2. 容易出错: 手动生成版本号容易出现错误。由于版本号通常遵循一定的规则和格式,手动输入可能会导致输入错误,例如错误的数字、错位的标点符号等。这可能导致版本号无法正确解析或识别,造成混淆和困惑;
  3. 难以管理和跟踪: 手动生成的版本号难以管理和跟踪。当软件有多个分支或并行开发时,手动生成的版本号可能无法准确反映软件的演进和变化。这可能导致版本号之间的关系不清晰,难以追踪每个版本的变更和修复;
  4. 效率低下: 开发人员在判断下一次版本号时,需要浏览 Commit 历史,根据语义化版本号,及上一次版本号来计算得出本次版本号,效率低下。

如果靠开发人员人为去指定版本号,会存在版本号不符合规范、版本号很乱等问题,使版本号失去了其所存在的价值。那么如何解决这种问题呢?其实,我们可以靠一些工具,根据 Commit 历史信息,自动化的生成版本号。通过工具来自动生成,我们不仅可以提高发布效率,还可以生成一个正确、规范、可预测的版本号。

本文,我就来给你介绍一个可以根据 Angular 提交规范,自动生成版本号的工具:gsemver

版本号自动生成工具调研

行业中有很多版本号自动生成工具,那么为什么选择 gsemver 工具呢?原因有如下 2 个:

  • 功能满足需求: gsemver 工具提供了可以自动生成版本号的基本功能;
  • 安装便捷: gsemver 工具使用 Go 语言开发,意味着,你只需要安装一个二进制文件即可,而不用根据操作系统类型,安装一堆依赖,这些依赖甚至不存在于操作系统默认的软件源中;
  • 语言栈统一: 都是用 Go 语言开发,使得学习、二次开发成为可能。

这里,也列举下社区中,其他版本号自动生成工具,供你参考:

社区中,也有一些 Go 语言开发的版本号自动生成工具,但是他们不遵循 Angular 提交规范:

gsemver 工具介绍

语义化版本控制是软件开发中重要的一部分,它可以帮助开发者更好地管理软件版本和发布。gsemver 是一个用 Go 语言开发的,简单而强大的命令行工具。它可以根据 Git 提交规范来快速生成语义化的版本号(下一个版本号,版本号符合 Semver 2.0.0规范)。

安装和配置 gsemver

首先,我们需要安装 gsemver 工具。gsemver 工具通过 gsemver 命令,来生成并管理语义化版本号,gsemver 命令行工具,安装命令如下:

$ go install github.com/arnaud-deprez/gsemver@latest # 安装 gsemver 工具
$ gsemver completion bash > $HOME/.gsemver-completion.bash # 配置 bash 自动补全
$ printf "
# gsemver shell completion
source '$HOME/.gsemver-completion.bash'
" >> $HOME/.bash_profile
$ source $HOME/.bash_profile

安装完之后,可以通过 gsemver -h 命令查看其使用方法:

$ gsemver -h
Simple CLI to manage semver compliant version from your git tags

Usage:
  gsemver [flags]
  gsemver [command]

Available Commands:
  bump        Bump to next version
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  version     Print the CLI version information

Flags:
  -c, --config string      config file (default is .gsemver.yaml)
  -h, --help               help for gsemver
      --log-level string   Sets the logging level (fatal, error, warning, info, debug, trace) (default "info")
  -v, --verbose            Enables verbose output by setting log level to debug. This is a shortland to --log-level debug.

Use "gsemver [command] --help" for more information about a command.

安装完 gsemver 工具后,我们还需要配置 gsemver,gsemver 工具默认使用项目根目录下的 .gsemver.yaml 文件作为配置文件。当然,你可以可以通过指定 -c--config 来指定配置文件,例如:

$ gsemver bump --config .gsemver.yaml

以下是一个 .gsemver.yaml 的配置文件示例:

majorPattern: "(?m)^BREAKING CHANGE:.*$"
minorPattern: "^feat(?:\(.+\))?:.*"
bumpStrategies:
- branchesPattern: "^(master|release/.*)$"
  strategy: "AUTO"
  preRelease: false
  preReleaseTemplate:
  preReleaseOverwrite: false
  buildMetadataTemplate:
- branchesPattern: ".*"
  strategy: "AUTO"
  preRelease: false
  preReleaseTemplate:
  preReleaseOverwrite: false
  buildMetadataTemplate: "{{Commits | len}}.{{(.Commits | first).Hash.Short}}"

每个配置项的作用,根据配置项名理解即可。你可以根据自己的需求调整配置。 bumpStrategies 按顺序应用,直到其中一个与当前分支匹 配branchesPattern 正则表达式。这样可以根据自己的 Git 流程定义策略。

gsemver 工具实现原理

gsemver 工具会根据 commit message 自动生成版本号,其所遵循的 commit message 规范为:conventional commits

另外,这里需要注意:由于 gsemver 目前使用 git describe 命令来计算下一个版本,这意味着你应该使用带注释的标签而不是轻量级标签来发布你的代码(参见 lightweight vs annotated tag)。同样,它需要访问整个历史记录或至少到最后一个父 tag。出于这些原因,gsemver 在计算下一个版本之前会执行 git fetch --tags 命令。

另外,gsemver 还需要知道当前分支,它试图用 git symbolic-ref HEAD 命令获取它。然而,大多数 CI 系统在从 HEAD 状态分离时执行构建,所以,难以从 Git 仓库中获取分支。幸运的是,大多数 CI 服务器会将分支名称注入环境变量中。所以,gsemver 工具,还支持从名为 GIT_BRANCH 的环境变量中获取分支名称。

gsemver 工具使用指南

下面是一些常用的 gsemver 命令和用法示例。

  1. 自动根据 commit message 生成版本号(也是最常用的命令):
$ gsemver bump
0.8.0
  1. 手动升级版本号
$ gsemver bump major # 手动升级主版本号
$ gsemver bump minor # 手动升级次版本号
$ gsemver bump patch # 手动升级修订版本号
$ gsemver bump --pre-release alpha # 生成一个预发布版本
$ gsemver bump --build-metadata "issue-1.build.1" # 生成一个带构建元数据的版本

gsemver 还支持更多的版本号生成规则,详细请参考:gsemver bump -h

结论

gsemver 是一个方便的命令行工具,可以帮助你更好地管理和处理语义化版本号。通过安装和使用 gsemver,你可以轻松地自动生成语义化的版本号,从而更好地管理你的软件版本。希望本文对你理解和使用 gsemver 有所帮助!


  • 您的支持是我写作的最大动力!如果这篇文章对您有帮助,感谢点赞和关注;
  • 强烈推荐我写的一个优秀的 Go + 云原生项目开发脚手架:OneX。可以让你轻松开发 Go 项目,解放双手,提高开发效率!