Gerrit Code Review 搭建配置

所需软件

Git:代码版本管理

Java:最低1.7版本

Gerrit:安装包是个war包

数据库:Gerrit支持H2(内置) / MySQL / PostgreSQL,本安装选择PostgreSQL,完全开源且适合大规模数据的部署

身份认证:审核的前提是做身份认证来登陆Web,Gerrit支持OpenID / HTTP / LDAP,本安装选择已经搭建好的LDAP,但会讲解HTTP方式的认证,需要Apache做反向代理。

安装部分以ubuntu为例

Git安装

sudo apt-get install git

JDK安装

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk //当前安装为 jdk1.8.0_101

配置Java环境变量

PATH,指定命令搜索路径,在shell下执行命令时,会到PATH变量指定的路径中查找相应命令程序,如java/javac

CLASSPATH,指定类搜索路径,JVM通过它寻找类

JAVA_HOME,其他软件通过它找到jdk的安装目录

vi /etc/profileexportJAVA_HOME= /usr/java/jdk1.8.0_101/exportCLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATHexportPATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATHsource/etc/profilejava -version

如果安装了多个jdk,就选择一个默认的

sudoupdate-alternatives --config java

PostgreSQL安装(目前用现有的Postgre数据库新建数据库和用户)

sudoapt-get install postgresql

初次安装后,会默认生成名为postgres的Linux系统用户、数据库和数据库用户(作为数据库管理员),首先修改postgres数据库用户的密码,然后增加Gerrit需要的数据库

sudo-u postgres psqlpostgres=# \password postgres(input password twice)postgres=# \q

sudo-u postgres createuser -RDIElPS gerritsudo-u postgres psqlpostgres=# \password gerrit(input password twice)sudo-u postgres createdb -E UTF-8-O gerrit reviewdb

Gerrit安装

从官网下载Gerrit的安装包,为了方便改名为gerrit.war,建议创建一个Linux用户来安装,本人安装在gerrit2用户的review_site目录下

sudoadduser gerritsudosu gerritjava -jar gerrit.war init-d/home/gerrit/review_site

然后就会进行很多配置,大部分默认即可,要注意的是数据库和身份认证,这些配置也可以在安装完成后在~/review_site/etc/gerrit.config文件中修改。

当前gerrit.config配置为:

[gerrit]

basePath = /home/gerrit/git

serverId = 7e182d87-75eb-4046-8547-496b55ea7ad9

canonicalWebUrl =http://gerrit.*****-net.com:8080

[database]

type = postgresql

hostname = 172.17.3.132

database = gerrit

username = gerrit

[auth]

type = LDAP

[ldap]

server =ldap://172.17.3.101

username = svc.jenkins

accountBase = dc=*****-net,dc=com

groupBase = dc=*****-net,dc=com

[receive]

enableSignedPush = false

[sendemail]

smtpServer = 172.17.3.201

smtpUser = svc.jenkins

smtpPass =*******              //具体为邮件用户密码

from=CodeReview*****-net.com>    //发件人显示

[container]

user = gerrit

javaHome = /usr/java/jdk1.8.0_101/jre

[sshd]

listenAddress = *:29418

[httpd]

listenUrl = proxy-http://*:8080/

[cache]

directory = cache

配置好gerrit.config文件后,启动Gerrit,需要用绝对路径

/home/gerrit/review_site/bin/gerrit.shstart

在浏览器输入http://localhost:8080弹出Gerrit的页面。

登录管理员

第一次登录的用户为管理员账号,ID为1000000,默认只有这个系统管理员才有Create权限(创建group和Project)

在gerrit本机上使用下面的命令生成管理员账号(这里将gerrit作为管理员)的公私钥并将公钥上传至gerrit管理员用户下。

ssh-keygen -t rsa #生成sshkey

ls ~/.ssh/ #可查看sshkey

cat ~/.ssh/id_rsa.pub #查看sshkey

Gitlab配置

Gitlab上的项目必须被保护,被保护的项目只允许master权限的用户进行push操作,其他用户无push提交权限。

普通用户没有直接push的权限。需要先review到gerrit上进行审核并commit后,才能更新到代码中心仓库里。

项目赋予gerrit用户master权限,给普通用户只有develop或者reporter权限。

Gerrit用户配置

普通用户登录gerrit,将本机公钥提交到gerrit,设置邮箱。

提交gerrit的用户名和邮箱必须与git配置相同。

Jenkins配置

Jenkins系统已经创建了管理员账户jenkins并安装了Gerrit Trigger插件和Git plugin插件

在“系统管理”->“插件管理"->”可选插件"->搜索上面两个插件进行安装。

设置Gerrit Trigger

Add New Server :gerrit.*****-net.com

勾选 Gerrit Server With Default Configurations

配置trigger信息并测试连接

如果上一步在点击“Test Connection”测试的时候,出现下面报错:

解决办法:

管理员登录gerrit

Projects->List->All-Projects

Projects->Access

Global Capabilities->Stream Events 点击 Non-Interactive Users

添加[email protected]用户到 ‘Non-Interactive Users’ 组。

Gerrit 和 Jenkins 整合

让Gerrit支持Jenkins

如果安装Gerrit时没有或者没有选择添加Verified标签功能[‘lable Verified’],需要自己添加。

如下是手动添加Verified标签功能的设置

[如果在安装gerrit的时候没有选择安装这个标签功能,就需要在此处手动安装下。具体可以登陆gerrit,ProjectS->list->All-Projects->Access->Edit->Add Permission 看里面是否有Verfied的选项]

# su - gerrit

$ git init cfg; cd cfg

$ git config --globaluser.name'gerrit'

$ git config --global user.email 'gerrit@devops_gerrit'

$ git remote add originssh://gerrit@http://gerrit.*****-net.com:29418/All-Projects

$ git pull origin refs/meta/config

$ vim project.config

[label "Verified"]

function = MaxWithBlock

value = -1 Fails

value = 0 No score

value = +1 Verified

$ git commit -a -m 'Updated permissions'

$ git push origin HEAD:refs/meta/config

$ rm -rf cfg

用gerrit管理员账号登录Gerrit

现在提交的Review请求只有Code Review审核,我们要求的是需要Jenkins的Verified和Code Review双重保障,在 Projects 的 Access 栏里,针对 Reference: refs/heads/ 项添加 Verified 功能,如下如下:

Projects -> List -> All-Projects

Projects -> Access -> Edit -> 找到 Reference: refs/heads/* 项 -> Add Permission -> Label Verified -> Group Name 里输入 Non-Interactive Users -> 回车 或者 点击Add 按钮 -> 在最下面点击 Save Changes 保存更改。

(注意:提前把jenkins用户添加到Non-Interactive Users组内)

权限修改结果如下:

如不需要经过jenkins Verified仅经过code review,则去掉Label Verified设置并暂停jenkins上gerrit trigger服务。

Gerrit工程建立

登录gerrit页面,CreateNewProject。想让gitlab上的项目能在gerrit上review的话,必须在gerrit上创建相同的项目,并有相同的仓库文件。

需要确认gerrit账户在gitlab上是否有权限,如没有权限需要在gitlab上为svc.gerrit用户导入gerrit服务器的id_rsa.pub

ssh登录gerrit服务器

$ /home/gerrit/git

$ rm -rf gerrittest.git

$ git clone [email protected]:boyang.chen/gerrittest.git

gerrit即存在与gitlab相同的项目。

Gerrit同步到Gitlab配置

当用户修改文件,git add、git commit,提交push到gerrit的repo后,代码通过 jenkins 测试、人工review后,代码只是 merge 到了 Gerrit 的 gerrittest项目中,并没有 merge 到 Gitlab 的 test-project1 项目中,所以需要当Gerrit  项目仓库有变化时自动同步到 Gitlab 的 gerrittest 项目仓库中。

Gerrit 自带一个 Replication 功能,同时我们在安装 Gerrit 时候默认安装了这个 Plugin。

1、现在只需要添加一个 replication.config 给 Gerrit

$ cd /home/gerrit/etc/

$ vim replication.config为项目配置同步信息

[remote "DCode"]

projects = DCode

url =git@gitlab.*****-net.com:sen.zhao/DCode.git

push = +refs/heads/*:refs/heads/*

push = +refs/tags/*:refs/tags/*

push = +refs/changes/*:refs/changes/*

threads = 3

[remote "ProjectC"]

projects = ProjectC

url =git@gitlab.*****-net.com:boyang.chen/ProjectC.git

push = +refs/heads/*:refs/heads/*

push = +refs/tags/*:refs/tags/*

push = +refs/changes/*:refs/changes/*

threads = 3

[remote "gerrittest"]

projects = gerrittest

url =git@gitlab.*****-net.com:boyang.chen/gerrittest.git

push = +refs/heads/*:refs/heads/*

push = +refs/tags/*:refs/tags/*

push = +refs/changes/*:refs/changes/*

threads = 3

2、设置gerrit用户的 ~/.ssh/config

$ vim /home/gerrit/.ssh/config

Hostgitlab.*****-net.com

Hostnamegitlab.*****-net.com

Protocol 2

HostKeyAlgorithms ssh-rsa,ssh-dss

上面设置的~/.ssh/config文件的权限已定要设置成600

不然会报错:“Bad owner or permissions on .ssh/config“

3、在gerrit用户的~/.ssh/known_hosts 中,给gitlab服务器和gerrit服务器 添加 rsa 密钥

$ sh -c "ssh-keyscan -t rsagitlab.*****-net.com,172.17.3.60 >> /home/gerrit/.ssh/known_hosts"

$ sh -c "ssh-keygen -H -f /home/gerrit/.ssh/known_hosts"

$ sh -c "ssh-keyscan -t rsa [gerrit.*****-net.com]:29418,[172.21.129.31] >> /home/gerrit/.ssh/known_hosts"

$ sh -c "ssh-keygen -H -f /home/gerrit/.ssh/known_hosts"

配置后如下:

重新启动 Gerrit 服务

$/home/gerrit/bin/gerrit.sh restart

Gerrit 的复制功能配置完毕。

在 Jenkins 上对 gerrittest项目创建构建任务

Jenkins上首先安装git插件:Git Plugin

登陆jenkins,“系统管理”->“管理插件”->“可选插件”->选择Git Pluin插件进行安装

Jenkins上创建项目

添加 gerrittest工程

下面添加url(gerrit项目地址):ssh://svc.jenkins@gerrit.*****-net.com:29418/gerrittest

添加分支:$GERRIT_BRANCH

添加项目具体单元测试build脚本

Gerrit+Jenkins+Gitlab实现code review流程

普通用户操作:

Git Bash:

1、clone gerrit上项目并下载commit-msg文件:

git clonessh://svc.jenkins@gerrit.*****-net.com:29418/gerrittest&& scp -p -P 29418svc.jenkins@gerrit.*****-net.com:hooks/commit-msg gerrittest/.git/hooks/

2、修改本地文件

3、添加修改文件

git add .

4、提交修改

git commit

输入提交信息

5、提交push到代码审核分支:

git push origin HEAD:refs/for/master

Jenkins自动执行build,build成功

登录Gerrit页面,会看到jenkins自动检测了提交操作并且执行了build操作,build成功,标记Verified +1

开发者可指定审核人进行Review操作,或者管理员及ProjectOwner有权限进行Review评分。

可添加或删除审核人

添加审核人后,审核人会收到邮件提示

开发者等待审核人提交审核反馈,审核人CodeReview评分+2则通过审核。

代码审核者(Administrator,ProjectOwner,CodeReviewer)操作:

收到审核邮件后登陆Gerrit

选择要进行审核的提交记录(Open)

经过jenkins自动评分Verified时:

不经过jenkins进行Verified评分时:

执行Submit后,gerrit会自动同步修改到gitlab库。

可通过查看replication日志了解同步情况:

其他操作:

gerrit手动同步代码到gitlab中心仓库上

[gerrit@devops_gerrit]$ ssh-gerrit gerrit --help//查看帮助,发现gerrit COMMAND --help可查找命令帮忙

[gerrit@devops_gerrit]$ ssh-gerrit replication start --help//查看replication同步命令的用法

replication start [PATTERN ...] [--] [--all] [--help (-h)] [--url PATTERN] [--wait]

PATTERN : project name pattern

-- : end of options

--all : push all known projects

--help (-h) : display this help text

--url PATTERN : pattern to match URL on

--wait : wait for replication to finish before exiting

[gerrit@devops_gerrit]$ ssh-gerrit replication start --all//同步所有工程

重载replication的同步服务

[gerrit@devops_gerrit]$ ssh-gerrit gerrit plugin reload replication

如果报错:fatal: remote plugin administration is disabled

解决办法:

在/home/gerrit/etc/gerrit.config文件里添加下面内容:

[plugins]

allowRemoteAdmin = true

然后重启gerrit服务即可:

[gerrit@devops_gerrit]$ /home/gerrit/bin/gerrit.sh restart

Stopping Gerrit Code Review: OK

Starting Gerrit Code Review: OK

窍门:

Gitbash Push简洁操作:

在工程路径下写入下面的命令:

$ git config remote.origin.push refs/heads/*:refs/for/*

这行命令的意思是,当执行 push 命令时,将会推送到refs/for/当前head所在的分支上。

设置之后即可按照之前的方式提交:

提交时

git push origin master或git push    即push修改内容到refs/for/分支

你可能感兴趣的:(Gerrit Code Review 搭建配置)