十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
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 python
import sys,os
import fileinput
import re
import json
import requests
def 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的配置, 使配置生效