V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gouchaoer
V2EX  ›  程序员

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

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

    现在团队采用 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   ·   我们的愿景   ·   实用小工具   ·   1011 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:05 · PVG 03:05 · LAX 12:05 · JFK 15:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.