第62节 对日志的处理 — 自动生成 CHANGELOG


❤️💕💕记录sealosopen in new window开源项目的学习过程。k8s,docker和云原生的学习open in new window。Myblog:http://nsddd.topopen in new window


[TOC]

why

首先,先谈一谈为什么需要 CHANGELOG:

我们在上一节说明了如何设计 Release,那么在这里,我们谈一谈如何针对每一次的 Release 设计优秀的 CHANGELOG。

一个项目最好有 CHANGELOG 用来展示每个版本之间的变更内容,作为 Release Note 的一部分。但是,如果每次都要手动编写 CHANGELOG,会很麻烦,也不容易坚持,所以这里我们可以借助git-chglogopen in new windowopen in new window

版本号

我们知道一个 release 需要一个版本号,即使在贡献者文档有一个体系的 版本号设计方案,但是依旧让我们不满意,如果靠开发者手动打版本号,工作效率低不说,经常还会出现漏打、打的版本号不规范等问题。所以最好的办法是,版本号也通过工具自动生成。采用了gsemveropen in new windowopen in new window工具来自动生成版本号。

我们可以编写一个脚本,来控制 整个 项目的版本号

scripts/ensure_tag.sh:

version=v`gsemver bump`
if [ -z "`git tag -l $version`" ];then
  git tag -a -m "release version $version" $version
fi

scripts/ensure_tag.sh 脚本中,通过 gsemver bump 命令来自动化生成语义化的版本号,并执行 git tag -a 给仓库打上版本号标签,gsemver 命令会根据 Commit Message 自动生成版本号。

之后,Makefile 和 Shell 脚本用到的所有版本号均统一使用scripts/make-rules/common.mk文件中的 VERSION 变量:

VERSION := $(shell git describe --tags --always --match='v*')

或者是:

echo $(git describe --tags --always --match='v*')
v2.3.3-630-gb11bc2f7
❯ echo $(git describe --abbrev=0 --dirty --always --tags | sed 's/-/./g')
v2.3.3.dirty

上述的 Shell 命令通过 git describe 来获取离当前提交最近的 tag(版本号)。

在执行 git describe 时,如果符合条件的 tag 指向最新提交,则只显示 tag 的名字,否则会有相关的后缀,来描述该 tag 之后有多少次提交,以及最新的提交 commit id。例如:

$ git describe --tags --always --match='v*'
v1.0.0-3-g1909e47

这里解释下版本号中各字符的含义

  • 3:表示自打 tag v1.0.0 以来有 3 次提交。
  • g1909e47g 为 git 的缩写,在多种管理工具并存的环境中很有用处。
  • 1909e477 位字符表示为最新提交的 commit id 前 7 位。

最后解释下参数:

  • –tags,使用所有的标签,而不是只使用带注释的标签(annotated tag)。
  • git tag 生成一个 unannotated tag,git tag -a <tagname> -m <massage>'' 生成一个 annotated tag。
  • –always,如果仓库没有可用的标签,那么使用 commit 缩写来替代标签。
  • –match,只考虑与给定模式相匹配的标签。

保持行为的一致性

手动操作:

检查 IAM 的所有 Commit 是否符合 Angular Commit Message 规范:

go-gitlint

也可以通过以下命令,手动来生成 CHANGELOG:

git-chglog v1.0.0 CHANGELOG/CHANGELOG-1.0.0.md

还可以执行 gsemver 来生成版本号:

gsemver bump

我们应该注意的是

这里要强调的是,我们要保证不管使用手动操作,还是通过 Makefile 操作,都要确保 git commit message 规范检查结果、生成的 CHANGELOG、生成的版本号是一致的。这需要我们采用同一种操作方式。

git chglog

CHANGELOG生成器在Go(Golang)中实现。随时随地,写你的更新日志。

git-chglog 在内部使用 git 命令获取要包含在CHANGELOG中的数据。基本步骤如下。

  1. 获取到所有的标签 tag
  2. 获取包含在 tagAtagB 之间的提交。
  3. 使用与步骤1和2中指定的标记查询对应的所有标记执行。

快速开始

git-chglog 需要配置文件和模板来生成CHANGELOG。

但是,从头开始创建配置文件和模板是浪费时间。

因此,我们建议使用 --init 选项,它将以交互方式创建它们 👍

然后我们就创建好了模板和配置文件。

接下来,我们就可以快速的生成让我们项目的CHANGELOG。通过执行以下简单命令,您的CHANGELOG的Markdown将显示在stdout上。

git-chglog

如果你想输出到一个文件而不是stdout,使用 -o--output )选项。

由于我的配置文件在 CHANGELOG/ 目录下面:

git-chglog --config CHANGELOG/.chglog/config.yml -o CHANGELOG/CHANGELOG-0.0.0.md

使用帮助

直接 git-chglog --help 就好了

END 链接