赞
踩
版本号:V2.0.2
Gerrit是一个基于web的代码评审工具,它基于Git版本控制系统,由Google内部编写用于代码评审管理。Gerrit旨在提供一个轻量级框架,用于在代码入库之前对每个提交进行审阅。Gerrit提供了一个临时区域,将本地提交与远程仓库隔离开,开发人员将更改上传到Gerrit,在它们被审阅通过前并不会直接上传到远程仓库。
要了解Gerrit如何帮助强化开发人员的工作流程,请考虑如下一个典型的项目。该项目有一个中心源存储库作为项目内容的权威副本,例如Git版本控制系统中的远程仓库。开发者从远程仓库中同步数据,或更新数据到远程仓库中;持续集成服务器从远程仓库中获取代码后自动编译验证等。
Figure 1. Central Source Repository
而Gerrit取代了这个中心源存储库,并添加了一个附加的概念:挂起的变更存储区(a store of pending changes)。
Figure 2. Gerrit in place of Central Repository
使用gerrit,当开发人员提交变更时,它将被发送到这个挂起的变更存储区,其他开发人员可以在这里审查、讨论和批准变更。在足够多的审查人员批准后,变更才能成为代码库的正式组成部分。
除此存储挂起的变更外,Gerrit还捕获有关每个变更的说明和评论。这些特性允许开发人员在方便的时候再查看变更,或者当不能面对面地讨论变更时可以线上查看。它们还可以帮助创建有关给定变更的对话记录,从而提供变更发生时间和原因的历史记录。
与任何存储库托管解决方案一样,Gerrit具有强大的访问控制模型,这允许我们控制存储库的访问权限。
我们的CI(可持续集成)体系是Gitosis+Gerrit+Jenkins,Gitosis是远程仓库;Gerrit用于代码审核;Jenkins用于自动化测试Verified(此步可去掉,由提交者自己Verified)。
下面用一个简单例子说明使用的方法。Gitosis和Gerrit上的仓库可以是同名的,为了讲述清楚这里用了两个不同的名字,在Gitosis上有仓库名为DEMO_GITOS(假设仓库在服务器192.168.113.14),在Gerrit Web上对应的仓库名为DEMO_GERRIT;有两个开发者developer1和developer2,有审查者reviewer1和管理员admin,他们都在服务器192.168.113.11中。流程:
管理员配置(新建仓库,定义组权限等)->管理员分发账号给开发者->开发者克隆代码、修改代码并提交审查请求->开发者增加审查者->Jenkins自检通过->审查者审查提交。
管理员需要完成的工作有:
1)编译服务器环境配置及账号管理;
2)新建代码仓库并配置Gerrit、Jenkins协作;
3)代码权限管理;
更新Git版本为2.6.5以上
Gerrit的commit-msg hook中interpret-trailers指令需要Git版本为2.6.5以上,而ubuntu14.04的源中的git版本为1.9.1,解决方法:
[在线安装]
手动增加ppa的源后安装git:
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
[离线安装]
到git官网->Tarballs下载2.20.1版本的源码包:
然后在服务器上解压,安装:
tar -xzvf git-2.20.1.tar.gz
cd git-2.20.1
./configure --prefix=/usr/
其次,为了使gitconfig文件配置为/etc/目录下,修改config.status文件去掉${prefix}:
make -j8
sudo make install
git --version
另外需要解决手动离线安装后无法自动补全git命令的问题:
cd contrib/completion
sudo cp git-completion.bash /etc/bash_completion.d/
然后重新打开一个shell终端登录即可。
设置git commit-msg hook
配置本地仓库的git hook,该过程用来在commit-msg中加入Change-ID,这是gerrit流程必须的,Change-ID就是待审查的变更的标识。
1)管理员克隆All-Projects仓库时下载commit-msg hook
使用admin账号登录Gerrit Web,BROWSE->Repositories->ALL-Projects->Clone with commit msg hook
在Gerrit服务器192.168.113.11登录其Linux账号,克隆代码仓和hook:
git clone ssh://admin@192.168.113.11:29418/All-Projects
scp -p -P 29418 admin@192.168.113.11:hooks/commit-msg All-Projects/.git/hooks/
然后将All-Projects/.git/hooks/commit-msg取出来,用于下一步的服务器git模板配置。
2)管理员配置全局的git hook模板
将步骤1)的commit-msg文件拷贝到服务器中新建的/etc/.git_template目录下,设置:
sudo mkdir -p /etc/.git_template/hooks
sudo cp commit-msg /etc/.git_template/hooks
sudo git config --system init.templateDir /etc/.git_template
以后该服务器的Linux用户在拉取仓库后都会自动设置commit-msg文件。
分配编译服务器账号
管理员为开发者和审查者分配Linux账号(需与其Gerrit上账号同名),并生成sshkey:
sudo adduser developer1
su - developer1
ssh-keygen -t rsa
cd ~/.ssh
mv id_rsa.pub developer1@ubt113-11.pub
chmod 755 developer1@ubt113-11.pub
Gerrit账号的分配见CH 2.2.3 Gerrit上的配置-用户管理。
配置DEMO_GITOS仓库权限
1)添加用户的ssh public key到gitosis的keydir目录中
假设developer1、2是参与开发;reviewer1不参与开发,只评审代码。共3个公钥。
2)管理员在Gitosis中为新仓库DEMO_GITOS进行配置
为Gerrit管理员的Linux账号添加读写权限;为两个developer和reviewer1添加代码只读(下载)权限。在gitosis.conf文件中内容如下:
[group GERRIT_ADMIN] members = gerrit@ubt65-16 writable = GERRIT_TEST DEMO_GITOS [group DEMO_GITOS] members = developer1@ubt65-16 developer2@ubt65-16 reviewer1@ubt65-16 readonly = DEMO_GITOS |
第一组GERRIT_ADMIN只有gerrit用户,对GERRIT_TEST、DEMO_GITOS两个仓库拥有读写权限,其中DEMO_GITOS是新增的,并且写权限是自动同步DEMO_GERRIT与DEMO_GITOS两个仓库所需要的(后文要设置Gerrit和Gitosis自动同步功能);第二组DEMO_GITOS,是待管理的代码仓库,成员包括所有开发人员,只有读权限。
提交以上修改到gitosis仓库使配置生效:
git add gitosis.conf keydir
git commit -m "Add for Gitosis+Gerrit+Jenkins Demo"
git push origin master:master
新建DEMO_GITOS仓库
在服务器192.168.113.11上使用Gerrit管理员账号gerrit新建DEMO_GITOS仓库
su - gerrit
mkdir -p /mnt/external/gerrit/DEMO_GITOS/
cd /mnt/external/gerrit/DEMO_GITOS/
git init
touch init.txt
git add init.txt
git commit -m "Initialize repository"
git remote add origin neoway@192.168.113.14:DEMO_GITOS.git
git push origin master
配置SSH Key
1)若用户linux账号的~/.ssh目录不存在,则运行ssh-keygen -t rsa生成sshkey(若存在则跳过此步骤)
2)将公钥~/.ssh/id_rsa.pub中内容拷贝至gerrit服务器的该用户账号中
以管理员账号admin为例,登录http://192.168.113.11:8090/进入gerrit review code界面,Settint->SSH Keys,然后把刚才的公钥粘贴到New SSH Key那一栏,然后点击ADD NEW SSH KEY即可:
验证sshkey是否配置成功,若成功则可以直接ssh连接:
ssh <username>@<server ip> -p 29418
看到welcome就表示你已配置完成(若链接异常可删除~/.ssh/knows_host重试):
用户管理
使用gerrit账号登录Gerrit所在的Ubuntu服务器。
(1)添加新用户,Linux下的用户名须和管理员给的Gerrit账号名相同
sudo htpasswd -b /etc/apache2/passwords <username> <code>
(2)修改用户密码
sudo htpasswd -b /etc/apache2/passwords <username> <newcode>
(3)删除用户
sudo htpasswd -D /etc/apache2/passwords <username>
此处不赘述为developer1、developer2、reviewer1添加用户的操作。
新建DEMO_GERRIT仓库
详见脚本gerrit_new_proj.sh,也可手动创建。脚本用法:
./gerrit_new_proj.sh <PROJECT>
创建新的代码仓库,并自动写入replication描述; 注意文件内部有一个变量repo_url需要根据仓库地址(深圳/西安)手动修改; 使用的前提: gitosis中已经创建好了远程代码仓库,并且为gerrit管理员账号开通了读写权限; 默认在gitosis和gerrit上的仓库名称一致; |
Code Review是在Gerrit Web上进行的,而Gerrit上现在是没有项目的,想让Gitosis上的项目能在Gerrit Web上被Code Review的话,必须在Gerrit上创建对应项目,并有相同的仓库文件。上文中[Gitosis上的配置]章节中,讲述了在Gitosis上创建对应的DEMO_GITOS仓库的步骤,现在则在Gerrit上创建DEMO_GERRIT仓库。
1)登录Gerrit服务器上Linux账号gerrit,创建DEMO_GERRIT仓库
ssh -p 29418 admin@192.168.113.11 gerrit create-project DEMO_GERRIT
该命令格式:ssh -p <port> <host> gerrit create-project [options] <proj>
2)克隆Gitosis上的DEMO_GITOS仓库到Gerrit上
cd /home/gerrit/repositorys //即登陆到gerrit安装目录的git下
rm -rf DEMO_GERRIT.git //删除空仓库
git clone --bare neoway@192.168.113.14:DEMO_GITOS.git //创建并将远程Gitosis上的项目内容发布到Gerrit上
另外,若仓库地址有变(如迁移到西安),以8909_APP_L.git为例,步骤如下:
git clone --bare neoway@192.168.113.14:8909_APP_L.git
cd 8909_APP_L
git push --mirror neoway@192.168.65.17:8909_APP_L.git
对于非首次建的Gerrit仓库,将其当作新仓库push到新repo时会有很多change分支:
但这并不影响,因为用户重新git clone下来则看不见了。
3)修改项目的名字为上面步骤创建的名字(可选)
mv DEMO_GITOS.git DEMO_GERRIT.git
4)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。