phabricator + gitlab 强制 code review
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了phabricator + gitlab 强制 code review相关的知识,希望对你有一定的参考价值。
前言
在团队合作中,code review 不仅能更好的发现代码中可能存在的隐患,也能让大家有一个平台能互相交流学习,那么选用合适的工具来做 code review 就很关键了,本文介绍使用 phabricator 来做 code review。
在做 code review 时,提交的代码只有在 review 通过后,才能入库,所以我们需要通过拦截用户的提交,来强制做 code review。强制拦截的方式有两种:
- 将代码托管在 phabricator 上,通过 heraId 的方式进行拦截;
- 在代码托管服务器上增加服务端 hook 来实现;
大家都习惯在 gitlab 上进行代码托管,故本文结合 gitlab 喝 phabricator 来实现 code review。
gitlab server 添加 hook
gitlab 服务端 hook 分为两种,一种是针对单个仓库局部生效,一种是针对所有仓库全局生效。
局部 hook
局部 hook 配置的方式如下
1、gitlab server进入到具体的仓库路径下;
2、创建自定义hook目录,mkdir custom_hooks;
3、创建pre-receive文件;
4、修改文件权限为755;
备注:可以参考文章 https://xie.infoq.cn/article/b077c8d4b793369de4c4eb347 进行局部 hook 的配置。
全局 hook
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的配置, 使配置生效
code review 脚本
code review 的服务端 hook 脚本代码如下,根据 hook 的部署方式进行局部部署或者全部部署即可。
#!/bin/bin/env python
# -*- encoding: utf-8 -*-
import sys
import re
import requests
import os
import json
import fileinput
PhabricatorUrl = "*"
ApiToken = "*"
def has_been_reviewed(origin_commit, curr_commit):
@name: 该commit是否被review通过
@msg:
@param *
@return True/False
pattern = re.compile(rDifferential Revision: (.*))
cmd = git rev-list --format= + %s%b + --max-count=1 %s % curr_commit
res = os.popen(cmd).readlines()[-2]
match_str = pattern.match(res)
if not match_str:
print("Please use arc diff to commit")
sys.exit(1)
http_url = match_str.group(1)
phcid = int(http_url.split("/")[-1][1:])
url = "?api.token=&ids[0]=".format(PhabricatorUrl, ApiToken, phcid)
info = json.loads(requests.get(url).text)
for i in info[result]:
if i[uri] != http_url:
continue
if int(i[status]) == 2:
sys.exit(0)
else:
print("Current Status: %s, Need Review and Accepted" % i[statusName].encode(utf-8))
sys.exit(1)
if __name__ == "__main__":
"""获取用户提交的信息"""
origin_commit, curr_commit, branch = None, None, None
# 读取用户试图更新的所有引用
for line in fileinput.input():
line_list = line.strip().split()
if len(line_list) >= 3:
origin_commit, curr_commit, branch = line_list[:3]
break
has_been_reviewed(origin_commit, curr_commit)
复制代码
代码详解:
1、12-13 行是 pharicator 的部署域名及 API token;
2、56-62 行从 gitlab 标准输入中获取本次提交的 commit id;
3、28 行从 git log 中获取使用 arc diff 命令提交到 phabricator 系统中 review 的 url;
4、36-47 行从 phabricator 获取到本次 review 的状态,来决定是否将本次提交入库;
code review 流程
需要提前配置好项目的 phabricator,见文章(TODO)
1、本地编写代码完成后,直接 git add;
2、调用 arc diff 命令,填写信息将提交推送到 phabricator 系统中;
输入提交的信息
填写reviewer等信息
3、然后就能 review 的人就能收到邮件,但 review 未通过,要将代码提交到 gitlab 时,便会报错
4、review 通过后,便可以正常提交,这里用 git push 和 arc land 都可以。
参考链接
1、phabricator 官网:https://www.phacility.com/phabricator/
2、phabricator 安装教程
以上是关于phabricator + gitlab 强制 code review的主要内容,如果未能解决你的问题,请参考以下文章