一直以来,因为团队项目迭代节奏很快,每次发布的更新日志和版本更新都是通过人肉来完成的。有时候实在忙的团团转,对于手动的写这些更新信息就显得力不从心了。对于团队新来的小伙伴,有时候遇到些紧急情况,就更显的乱糟糟,还是得麻烦团队资深的同学。显然这些工作,用自动化工具再适合不过了。
本文通过主要内容为介绍 conventional-changelog
的几个常用工具
onventional-changelog
onventional-changelog 是一款根据项目中的commit
和 metadata
信息自动生成 changelogs
和 release notes
的系列工具,并且在辅助 standard-version 工具的情况下,可以自动帮你完成生成version
、打tag
, 生成CHANGELOG
等系列过程。
onventional-changelog。
onventional-changelog 生态主要模块
- conventional-changelog-cli - 全功能的命令行工具
- standard-changelog - 针对 angular commit 格式的命令行工具
- conventional-github-releaser - 根据 git metadata 生成 Github release
- conventional-commits-detector - commit message 规范引用检测
- commitizen - 针对开发者简单的 commit 规范
- commitlint - commit Lint 工具
以上是 onventional-changelog 生态重要的几个主要模块,今天我们主要介绍 commitizen、conventional-changelog-cli 、standard-version 这几个常用工具。
commitizen
commitizen 是一款标准化 git commit 信息的工具。在没有规范的情况下,开发人员的 commit 信息是常常是随意的,这就导致 commit 信息显的很无用。可是当你在做git log
、code review
、编写changelog
等情况时,良好的 commit 规范就显的尤为重要。
标准化 commit message 的安装
- 全局安装
commitizen
工具
npm install -g commitizen
安装适配器(Adapter)
因为不同的项目本身的构建方式的不同,所以commitizen
本身是保持自身作为扩展,从而去满足不同的构建需求的。本文主要使用cz-conventional-changelog
的构建标准,当然你也可以根据具体的情况选择其他的适配器,更多请看。
npm install -g cz-conventional-changelog
安装完成后,需要在项目添加配置,主要有两种方式:
- 在项目根目录下添加
.czrc
文件,文件内容
{ "path": "cz-conventional-changelog" }
- 在
package.json
中添加配置
"config": {
"commitizen": {
"path": "cz-conventional-changelog"
}
}
安装并添加完后,我们便可以使用 git cz
命令替换 git commit
来使用了。我们修改一个文件,git add
后试一下:
可以看到,git cz 给出了 commiting 的几种类型选项,如下:
- feat 新功能
- fix Bug 修复
- docs 文档更新
- style 代码的格式,标点符号的更新
- refactor 代码重构
- perf 性能优化
- test 测试更新
- build 构建系统或者包依赖更新
- ci CI 配置,脚本文件等更新
- chore 非 src 或者 测试文件的更新
- revert commit 回退
使用的时候,我们应该根据项目具体变更情况选择。如果想修改已经打好的 commit 信息,我们可以通过 git reset
命令来修复。
conventional-changelog-cli
conventional-changelog-cli 默认推荐的 commit changelog 标准是来自angular
项目的标准,作为一个标准工具,它自然可以扩展成不同的项目标准,例如 atom, codemirror, ember, eslint, express, jquery
等项目的标准。
安装
npm install -g conventional-changelog-cli
基本使用
conventional-changelog -p angular -i CHANGELOG.md -s
以上命令中参数-p angular
用来指定使用的 commit message 标准,假如想使用atom
的标准,则是:
conventional-changelog -p atom -i CHANGELOG.md -s 参数
-i CHANGELOG.md
表示从 CHANGELOG.md 读取 changelog,-s
表示读写 changelog 为同一文件。需要注意的是,上面这条命令产生的 changelog 是基于上次 tag 版本之后的变更(Feature、Fix、Breaking Changes 等等)所产生的,所以如果你想生成之前所有 commit 产生的 changelog 则需要使用一下命令: conventional-changelog -p angular -i CHANGELOG.md -s -r 0 其中-r
表示生成 changelog 所需要使用的 release 版本数量,默认为 1,0 则表示全部
自定义参数
生成的 changlog 中有些常用内容可以通过自定义参数来根据需求更改,例如版本号、commit 地址等等。
changelog 中生成的版本号即是从 package.json
中获取 version 字段来的,commit 连接的仓库地址 我们需要修改 package.json
中的repository
地址,changelog 中 issuse 默认的连接地址也是根据 repository
来生成的。如果是你使用了第三方协作系统,需要自定义则需要一些方法了。例如 bitbucket, 那么你可以使用这个标准conventional-changelog-angular-bitbucket。或者像我们使用 redmine 来管理 isssue ,那么生成 changelog 后使用replace工具,替换文本中的原有地址:
replace ‘https://github.com/myproject/issues/' ‘https://redmine.example.com’ CHANGELOG.md
最后看看大致生成的效果:
conventional-changelog 更多的选项配置可以看这里。
standard-version
standard-version 是一款遵循语义化版本( semver)和 commit message 标准规范 的打版本和 changlog 自动化工具。通常我们在 master 分支进行如下的版本发布操作:
1. git pull origin master
2. 根据 pacakage.json 中的version, 更新版本号,更新 changelog
3. git add -A, 然后 git commit
4. git tag 打版本操作
5. push 版本 tag 和 master 分支到仓库
其中 2,3,4 则是 standard-version 工具会自动完成的工作,配合本地的 shell 脚本,则可以自动完成一系列版本发布的工作了。
使用
在这里我仍然推荐的全局安装:
npm i -g standard-version
执行生成版本:
# Help standard-version --help <br/>
$ standard-version
这里有几个有用的参数需要注意下:
–release-as, -r 指定版本号
默认情况下,工具会自动根据 主版本(major),次版本( minor) or 修订版(patch) 规则生成版本号,例如如果你 package.json 中的 version 为 1.0.0, 那么执行后版本号则是:1.0.1。自定义可以通过:
$ standard-version -r minor
# output 1.1.0
$ standard-version -r 2.0.0
# output 2.0.0
$ standard-version -r 2.0.0-test
# output 2.0.0-test
需要注意的是,这里的版本名称不是随便的字符,而是需要遵循语义化版本( semver) 规范的
–prerelease, -p 语法版本命名
用来生成预发版本, 如果当期的版本号是 2.0.0,例如
$ standard-version --prerelease alpha
# output 2.0.0-alpha.0
–tag-prefix, -t 语法版本命名
用来给生成 tag 标签添加前缀,例如如果前版本号为 2.0.0,则:
$ standard-version --tag-prefix "stable-"
# output tag: stable-v2.0.0
以上几个参数为我们可能频繁使用的参数,还有其他选项可以通过 standard-version --help
查看。
最后记得把命令集成到package.json
的 scripts 中, 如下:
"scripts": {
"release": "./scripts/release.sh",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0 && git add CHANGELOG.md && npm run changeissueurl",
"changeissueurl": "replace 'https://github.com/myproject/issues/' 'https://redmine.example.com/' CHANGELOG.md"
},
添加 release.sh
:
#!/bin/bash
# Release branch
master="master"
prefix="DTinsight_v"
git pull origin $master
echo "Current pull origin $master."
# Auto generate version number and tag
standard-version -r $release --tag-prefix $prefix
git push --follow-tags origin $master
echo "Git push origin $master"
echo "Release finished."
使用 npm 发布
npm run release
最后
还在犹豫什么?如果不想继续通过人肉的方法解决这些问题的话,赶紧试试吧~!!!
最后修改于 2018-12-08