对提交到 gitlab 的代码 message 进行验证以符合 Angular 规范 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
gouchaoer
V2EX    程序员

对提交到 gitlab 的代码 message 进行验证以符合 Angular 规范

  •  
  •   gouchaoer 2020-06-22 14:01:28 +08:00 3632 次点击
    这是一个创建于 1984 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在团队采用 Angular 代码规范,需要对提交到 gitlab 的代码进行验证,由于 gitlab 提供了 hooks 机制,所以做起来还是毕竟方便的,这里写一些我怎么做的

    首先 Angular 代码规范参考: http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html

    gitlab 的 hook 机制参考: https://docs.gitlab.com/ee/administration/server_hooks.html

    也就是说我们可以在 pre-receive 、update 和 post-receive 这 3 个阶段来对 commit message 进行验证,我之前写的的在 update 中验证的,你可以选你熟悉的脚本语言来写。在 gitlab 调用 update 脚本的时候会传入更新的 2 个 commit 的 hash ID,然后在这里可以调用 git 来解析出有哪些 commit 需要验证(你最好找个别人写好的解析 git commit message 的库),如果验证通过就返回 0,否则返回非 0,标准输出可以在 git push 的命令行中看到。需要注意的时候当 push 的为 tag 或者新的分支的时候,hash ID 可能为“0000000000000000000000000000000000000000”,还有就是“Merge branch”的需要考虑边界情况,大部分都是内容处理没啥可说的。如果你们还有别的要求,可以自己加。

    Angular 规范正则可以写成:

    //匹配 Angular 规范关键字

    $res = preg_match("#^\s*(feat|fix|docs|style|refactor|test|chore)(\(.+\))?\:.+#", $message, $matches); if(!$res){ $msg = "your commit message format is wrong, see:'http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html', message:{$message}"; if($NEED_VERIFY){ log_file($msg, true); exit(1); }else{ log_file($msg); } } 

    最后就是,在某些情况下我们需要 skip 掉验证,但是 hook 没有提供额外的参数,这里只有手动去改了,搜了一下 gitlab 用了 git push -o 的参数,在 pre-receive 下,加上这行:

    refs = $stdin.read require_relative '../lib/hooks_utils' push_optiOns= HooksUtils.get_push_options if push_options[0]=="skip" aFile = File.new("/tmp/gitlab-skip", "w") if aFile cOntent= aFile.syswrite(refs) else puts "Unable to open /tmp/gitlab-skip" end end 

    然后在 update 脚本里检查的时候去 /tmp/gitlab-skip 读取 commit 的 hash,看相等就跳过验证

    6 条回复    2020-06-28 10:38:00 +08:00
    flyingfz
        1
    flyingfz  
       2020-06-22 14:19:32 +08:00
    搜一下 git cz
    flyingfz
        2
    flyingfz  
       2020-06-22 14:19:37 +08:00
    gouchaoer
        3
    gouchaoer  
    OP
       2020-06-22 15:58:09 +08:00
    @flyingfz 我是在服务器端验证的,不是客户端,客户端没法分发这个工具。。。。还有我除了要符合 Angular 规范,还有别的定制功能,比如和项目管理之间联动。。。这个 cz 依赖太复杂,我生成 CHANGELOG 调研了一下,选了 golang 一个,直接编译成二进制无依赖
    yuxizhe
        4
    yuxizhe  
       2020-06-22 19:27:03 +08:00
    gitlab ci 配置个 commitlint 就行了,不要瞎造轮子
    https://github.com/conventional-changelog/commitlint
    SoloCompany
       5
    SoloCompany  
       2020-06-22 22:50:35 +08:00
    如果没有 MR, 仅仅靠 Hook 没有多少意义
    如果有 MR, 那干嘛还要 Hook? 有意义的替代品应该是 approval robot
    gouchaoer
        6
    gouchaoer  
    OP
       2020-06-28 10:38:00 +08:00
    @SoloCompany 如果我说要去过认证,基础设施里 message 规范除了这个之外还需要一些特殊的与项目管理的联动呢?你放出来的工具早调研过了,实际项目比你想象的复杂的多。。。你只想到在 ci 里配 lint,实际操作中那么多人不是每个项目都有 ci 好吧?如果是用 repo 管理的许多 git 仓库呢(实际生成 CHANGELOG 的时候需要每个仓库都做一次)?
    @yuxizhe

    说到底我只是简单的对 git commit message 做一个要求,我认为这是很 easy 的工作,我几行正则就搞定了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2815 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 14:25 PVG 22:25 LAX 06:25 JFK 09:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86