千家信息网

phabricator强制进行code review的方法

发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,1.拦截方式强制进行code review,有两种方式:将仓库托管在phabricator上,通过herald的方式来进行在代码托管服务器上增加hook来实现由于我们的代码托管到gitlab上,所有我
千家信息网最后更新 2025年02月07日phabricator强制进行code review的方法

1.拦截方式
强制进行code review,有两种方式:


将仓库托管在phabricator上,通过herald的方式来进行在代码托管服务器上增加hook来实现由于我们的代码托管到gitlab上,所有我们采用第二种方式进行code review

2.gitlab server端添加hook


gitlab添加hook的方式有两种:    局部添加,作用于当前这个仓库    全局添加,作用于全部仓库 

2.1 局部配置


cd /srv/gitlab/data/git-data/repositories/root/pipeline-example-go.git ###gitlab serve端进入到具体的仓库路径下mkdir custom_hooks  #创建自定义hook目录touch pre-receive   #创建pre-receive 文件chmod 755 pre-receive #修改文件权限pre-receive 钩子,在有人用 git push 向仓库推送代码时被执行,其内容如下:

#!/usr/bin/env pythonimport sys,osimport fileinputimport reimport jsonimport requestsdef has_been_reviewed(start_commit, end_commit):    cmd = 'git rev-list %s...%s' % (start_commit, end_commit,)    Flag = False    commits = os.popen(cmd).readlines()    pattern = re.compile(r'Differential Revision: (.*)')    for commit in commits:        cmd = 'git rev-list --format=' + '%s%b ' + '--max-count=1 %s' % commit        res  = os.popen(cmd).readlines()[-2]        match_str = pattern.match(res)        if not  match_str:            print("Please use 'arc diff' to commit")            continue        http_url = match_str.group(1)        url = "https://xxx/api/differential.query?api.token=*****"        info = json.loads(requests.get(url).text)        for i in info['result']:            if i['uri'] != http_url: continue            if i['statusName'] == 'Accepted':                Flag = True            else:                print("Current Status: %s, Need Review and Accepted" % i['statusName'])            break    if Flag:        sys.exit(0)    else:        sys.exit(1)if __name__  == "__main__":    for line in fileinput.input():        args = line.split(' ')    start_commit = args[0]    end_commit = args[1]    if start_commit != '0000000000000000000000000000000000000000' and  end_commit != '0000000000000000000000000000000000000000':        has_been_reviewed(start_commit, end_commit)

代码解释:1.git rev-list --format=%s%b  --max-count=1  ${commit_id} #获取git commit 的提交信息,默认git commit -m 后的信息,但是使用arc diff 之后,arc diff的信息会覆盖之前的git commit 的内容2.requests.get("https://***/api/differential.query?api.token=***") #通过ph的api接口获取到所有的differential 信息,其中token 可通过https://***/conduit/login/ 获取3.#获取differential的信息之后,选取uri为当前提交的revision,若状态Accepted,表示代码review通过,退出程序,返回状态码0,表示不拦截4.#若获取状态不为Accepted,则返回状态码非0,表示执行失败,拦截git push请求

***

2.2 全局配置


1.开启gitlab的自定义hook参数vim  /etc/gitlab/gitlab.rb   #配置如下 gitlab_shell['custom_hooks_dir'] = "/opt/gitlab/embedded/service/gitlab-shell/hooks/custom_hooks"  #取消这行注释,默认是注释2.mkdir -p  /opt/gitlab/embedded/service/gitlab-shell/hooks/custom_hooks/pre-receive.d  # 创建目录3.touch /opt/gitlab/embedded/service/gitlab-shell/hooks/custom_hooks/pre-receive.d/pre-receive  #创建文件pre-receive 4.chmod 755 /opt/gitlab/embedded/service/gitlab-shell/hooks/custom_hooks/pre-receive.d/pre-receive 5.pre-receive #文件内容如上6.gitlab-ctl reconfigure  #重新加载gitlab的配置, 使配置生效
0