gerrit官网上有最新的release,但是下载服务器应该是在国外的缘故,无法访问(不是慢...),所以只能放弃该方法。另外从网上冲浪得知安装release版还需要准备各种环境,比如Java,jdk,玛利亚数据库(mariaDB),反向代理之类的,还是比较麻烦。种种理由坚定了我曲线review的决心。
1、先搜索一下gerrit的docker镜像
sudo docker search gerrit
2、下载镜像
我找了个标星第二的版本:gerritcodereview/gerrit,描述说是官方镜像,别的不说,官方的感觉就正规一点。
命令:sudo docker pull gerritcodereview/gerrit
默认下载latest版,即最新版。
3、运行(和开机一样简单)
sudo docker run --name gerrit_test -d -p 8090:8080 gerritcodereview/gerrit:latest
-p后面带的是端口映射,这个自行设定,视网络环境而定,有的机器设置了端口的限制。
简单之处在于:不用java环境、数据库、反向代理的设置等。
然后就可以访问gerrit的web页面,比如http://localhost:8090/dashboard/self,http://localhost:8090/login 则是登录界面,系统会默认初始有一个admin的管理员账户。点击“new account”可以注册一个账号,注册之后可以进行一些简单的配置,但要注意的一点是“Email Address”一定要配置,否则后面code review之后push到远程仓库的时候会有认证问题。(可以在push的时候去配置)
4、另一个port
准备结合git玩一下了,这时发现一个问题:现在一般会通过ssh鉴权来clone repository,然而,ssh是tcp协议的,是有端口的,配完ssh的config发现用不了。
.ssh/下的的config配置要如下(ssh访问)
每次远程登录Linux的时候,Linux都要检查一下,当前访问的计算机公钥是不是在~/.ssh/know_hosts中,这个文件时OpenSSH记录的。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告,避免你受到DNS Hijack之类的攻击。SSH对主机的public_key的检查等级是根据StrictHostKeyChecking变量来配置的。默认情况下,StrictHostKeyChecking=ask。简单所下它的三种配置值:
1.StrictHostKeyChecking=no
最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网测试时建议使用。如果连接server的key在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。
2.StrictHostKeyChecking=ask #默认的级别,就是出现刚才的提示了。如果连接和key不匹配,给出提示,并拒绝登录。
3.StrictHostKeyChecking=yes #最安全的级别,如果连接与key不匹配,就拒绝连接,不会提示详细信息。
一般设为“no”。
UserKnownHostsFile /dev/null 表示忽略known host文件
port就是gerrit ssh服务监听的端口,所以在运行docker时的端口映射还需要加上-p 8091:29418,至于8091,是我们随便取的一个docker,而29418则是gerrit监听的默认端口,因为gerrit服务是用docker起的,不能更改默认端口了,所以我们映射的时候需要写成“out_port:29418”.
这样运行docker之后,在客户端执行ssh gerrit -l {username} ,则可以ssh到gerrit了:
5、克个隆
git clone ssh://gerrit/All-Projects, 因为ssh里的Host配的gerrit,所以在ssh://的后面,要写成gerrit,而系统给用户提供的是“git clone ssh://ddcdf266ab73:29418/All-Projects”,一开始我是一头雾水...
6、集成gitlab
这节是个重点,直接来干货:
gerrit本身是有代码仓库功能的,不够现在互联网大小公司一般都会用一些代码版本控制系统,比如,svn,git,更有gitlab来托管代码,所以有必要讲一讲集成应用这一块,这里用gitlab来实操一把。
重点:本地的ssh公钥需要配置在git和gerrit服务器上,gerrt服务器的ssh公钥需要配置在git服务器上!
- 先在gerrit上新建一个项目比如就叫gerritttest,创建方法很简单:
红框内写项目名,和gitlab里的项目对应。
- 此时,gitlab上也有一个“实体”的项目,也叫gerritttest,(也可以说是在gerrit里建gerritttest之前,gitlab就已经建好的)
- 可以执行$git branch -av 来查看分支情况
- 在gerrit里创建同名仓库后,需要删掉仓库目录,然后执行‘git clone --bare git@git.campany.com:{username}/gerritttest.git’
- 然后可以执行$git clone "ssh://yourname@gerrit/gerritttest" && scp -p -P 8091 yourname@gerrit:hooks/commit-msg "gerritttest/.git/hooks/",来从gerrit克隆仓库了。
- 删除gerrit项目命令:ssh -p 8091 admin@ip delete-project delete --yes-really-delete gerritttest,这些命令都有对应的REST的API,可自行百度。
- sudo docker exec -ti -u root ddcdf266ab73 bash 可获取docker的root权限
- replication:一个用于自动同步gerrit仓库到gitlab的工具,可以执行ssh -p 8091 admin@ip gerrit plugin ls|grep replication 来查看插件情况,注:用户需要是admin,其他用户没有查看插件权限。ssh -p 8091 admin@ip gerrit plugin reload replication, 重启replication插件。
replication配置:
[remote "git.example.cc"]
projects = gerritttest
url = git@git.example.cc:user/${name}.git
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/changes/*:refs/changes/*
threads = 3
timeout = 30
replicationMaxRetries = 3
projects就是项目的名字,${name}会自动识别成“gerritttest”,timeout是推送的超时时长,replicationMaxRetries是一次push重试的最大次数,如果重试次数打到配置值,则放弃该次push。
- 修改、提交、推送一套带走:
- add和commit和以前操作git一样,push的时候用’git push -u origin HEAD:refs/for/master‘命令
- 此时的状态是将修改推倒了gerrit里的仓库,等待其他人codereview。
- 这时就可以在gerrit 的web页面里看到一个“change”,就可以进行codereview了,规则是所有组内的成员都可以review代码,并且评论,但是只有admin可以最终确认这份代码是否可以合并到git远程仓库,先点“code_review”,然后再点“submit”,submit表示真正提交并push到git仓库。
- 查看/var/gerrit/logs/replication_log
表示成功推送到git仓库
- 查看git仓库
可以看到修改内容已经推送到了git服务器上