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

添加Jenkins@zjc.com用户到 ‘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 --baregit@172.17.3.60: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/分支

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容