如何在GitLab CI中执行Commitizen提交信息格式检查?
问题场景
本地使用commitizen和pre-commit,配置如下:
- repo: https://github.com/commitizen-tools/commitizen rev: v3.27.0 hooks: - id: commitizen name: commit message check
本地pre-commit可正常触发commitizen校验提交信息,但在GitLab CI流水线执行pre-commit run --all-files --show-diff-on-failure时,仅commitizen钩子未触发。需解决两个问题:
- 如何检查Merge Request(MR)中的提交是否符合commitizen格式?
- 如何通过pre-commit run执行commitizen钩子?
解决方案
一、为什么pre-commit run --all-files不触发commitizen钩子
commitizen的pre-commit钩子属于commit-msg阶段的钩子,仅在提交时校验提交信息文件;而--all-files参数只会触发针对文件内容变更的pre-commit阶段钩子,因此不会自动执行commitizen钩子。
二、检查MR中提交是否符合commitizen格式
直接使用commitizen的内置命令校验指定范围的提交,在GitLab CI中可利用内置环境变量确定MR的提交范围:
- 在CI脚本中添加以下命令:
cz check --rev-range $CI_MERGE_REQUEST_TARGET_BRANCH_SHA..$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA
- 该命令会校验从目标分支到MR源分支的所有提交信息格式
- 如果有不符合规范的提交,命令会返回非0状态码,终止CI流水线
- 若需要兼容非MR场景(比如分支推送校验),可以调整为校验当前分支与主分支的差异:
cz check --rev-range origin/main..HEAD
三、通过pre-commit run执行commitizen钩子
由于commitizen钩子属于commit-msg阶段,需要明确指定钩子阶段或ID来触发:
- 若要测试钩子本身(需提供提交信息文件):
- 先创建临时提交信息文件:
echo "feat: add new feature" > .git/COMMIT_EDITMSG - 运行钩子:
pre-commit run commitizen --hook-stage commit-msg
- 先创建临时提交信息文件:
- 若要批量校验历史提交,更推荐直接使用
cz check命令(如上文所述),而非通过pre-commit触发,因为pre-commit的commit-msg钩子设计用于单次提交的实时校验,而非历史提交批量检查。
内容的提问来源于stack exchange,提问作者kostek
相关产品推荐
相关产品推荐

