【Gerrit】Linux + Gerrit + Nginx + gitweb安装全过程
阅读数:
最近公司的项目打算启用gerrit做为代码审核的工具,最近3天彻底研究了下gerrit的安装配置过程,这里做个记录,期间很多细节都一一记录下来,以便之后有同学需要用到。
这篇博文先介绍下gerrit的安装过程,然后之后还准备写一篇文章,介绍如何利用gerrit和sourceTree进行协同工作,换句话说,就是gerrit的详细工作流程。
开发环境
先记录下我的开发环境以及要正确安装gerrit需要用到的工具:
- Redhat(CentOS) 6.5
- Java 1.7.0 (至少1.6以上)
- git 1.7,1
- Nginx 1.10.2
- Apache 2.2.15
几点说明:
关于操作系统
Redhat和CentOS用的是同样的内核,我这里是6.5版本的内核;其他linux系统上安装过程照猫画虎应该也差不多,只不过可能比如Java或者Nginx等工具的安装方式有所差别。
为了方便后面文章的讲解,我们这里假设gerrit服务器的ip地址是192.168.1.100
关于Java环境
在终端中输入java -version
务必确保你的java环境正确安装了;因为整个gerrit的安装是依赖于Java的,另外最好确保Java版本在1.6以上吧,虽然我没有验证过低版本的Java是不是没问题,但是高一点的版本保险一点。Web服务器
网上很多教程有讲到gerrit+apache安装过程的,我这里是用nginx。先来说说为什么一定要用apache或者nginx,是的就是为了反向代理
。
Gerrit有两种工作方式,我们要采用http
的工作方式,也就是代码审核人员,可以直接通过Web页面对提交的代码进行评审以及后续的操作。
然后Gerrit要求不能直接请求其端口,必须要使用反向代理才能正确登录。而我们知道Nginx的成功正在于其高效、轻量级以及反向代理,虽然Apache也有反向代理的功能,但是如果你在安装Apache时没有开启,后续的开启过程要相对复杂一点,而Nginx就简单的多了。
不过即便我们使用Nginx做为web页面引擎,仍然需要安装Apache,因为我们需要用到apache的一个工具来创建验证密码文件。这个后面我们会看到具体用法。数据库
我们使用gerrit自带的H2数据库。网上也有其他数据库的安装教程,我这里想说的是,H2就够用,而且,我们不推荐直接对数据库进行操作,所有的操作,都可以通过命令行的方式完成,所以,尽量简单我们就使用自带的默认的数据库好了。
所以,请务必确保以上几个工具正确安装。
在RedHat或者CentOS上可以通过yum
工具来安装,如果yum的源打不开,可以去网上搜一下替换yum源的方法。
安装gerrit
下载gerrit安装包
gerrit的下载地址:
https://www.gerritcodereview.com/releases/README.md
我使用的gerrit版本是2.13.4。 下载完成之后会发现是一个war
的包,所以我们的Java环境一定要安装正确。
新建gerrit专用用户
新建一个用户用来专门管理gerrit相关的内容。
在root用户(或者使用sudo
命令)下面输入下面的命令:
1 | $ adduser gerrit |
建好用户以后,我们可以把之前下载好的gerrit安装包(gerrit-2.13.4.war)拷贝到/home/gerrit/
目录下,一会方便gerrit用户来安装。
安装gerrit
在gerrit用户的目录(/home/gerrit/)下面,执行下面的命令:
1 | $ java -jar gerrit-2.13.4.war init -d ~/gerrit_site |
这个命令的意思是执行安装gerrit,会在当前目录下新建一个文件夹gerrit_site
用来作为gerrit的根目录,在这个目录中,会安装git仓库,以及gerrit的web页面,还有gerrit的bin,etc等文件夹。
然后就开始安装过程了,安装的过程会询问很多问题,有一些判断性的问题会用[y/N]
这样的形式,大写的字母表示默认,我们直接敲回车就表示采用默认的安装选项。
- 我们安装的时候,可以只在
Authentication method
时输入http
,其他全部回车用默认值,因为其他配置我们待会可以通过etc/gerrit.config
文件进行修改 - 期间可能会下载两个文件,这两个文件虽然都很小(不到3M),但是可能是因为GFW的原因,下载速度很慢。你可以到
/lib
文件夹下面查看他们是不是已经下载完了,或者你手动把那两个文件下载完之后,scp到/lib
下面。
如果你发现已经下完了,但是安装过程卡主了,没有关系,直接ctrl+c
然后重新安装就可以了。
下面我就把整个安装过程全部贴出来,加上一些注释,好让大家看清楚都安装了什么:
1 | *** Gerrit Code Review 2.13.4 |
其实安装过程真的很简单,只是在Authentication method
方式时输入http
其他的一路回车下去就好了。
启动gerrit
安装完成之后,gerrit会自动启动,而且会开始监听两个端口:
- 29418: 默认的ssh端口;
- 8080: gerrit默认的web页面端口。
我们可以通过下面命令查看:
1 | $ netstat -ltpn | grep -i gerrit |
Nginx
接下来就该Nginx上场了。
在没有配置nginx反向之前,我们直接访问192.168.1.100:8080/login
(我们之前假设gerrit服务器的ip地址是192.168.1.100),会得到一个错误页面,这个页面对于初次使用http方式的gerrit用户可能会让你感到非常。。。绝望,笔者至少看到这个页面不下10多次。。。
就是这样图片:
下面我们就来看一下nginx需要怎样配置吧。
nginx默认配置
我们首先看一看nginx的默认配置。
注意,你的nginx应该是用root账户安装的,否则可能出现权限问题。我们需要从之前的gerrit用户退出来。
在root用户下面,输入下面的命令:
1 | $ cd /etc/nginx/conf.d |
默认的nginx只有一个default.conf文件,是nginx的默认配置文件,我们这里需要新建一个专门用来处理gerrit请求的配置文件,先来看一下我的目录吧:
我这里新建了一个gerrit.conf
文件,用来处理gerrit的反向代理。待会我们来看里面需要配置些什么,我们先来研究下nginx默认的配置文件, default.conf
吧。
上面就是默认的配置,看到这里我把端口默认的监听端口设置成了82, 因为80分配给了apache;
然后日志文件的路径在/var/log/nginx/
目录下,如果后面登录认证的失败的时候,我们可以在这个目录下面查找日志文件,分析失败的原因。
nginx路径在/usr/share/nginx/
路径下,如果我们进到该目录下,查看其下面的index.html文件,就会发现他就是我们在192.168.1.100:82
页面中看到的关于nginx的介绍的页面。
之后还有一些注释掉的关于php的配置部分,这里不做多余的介绍。
gerrit.conf配置
重点来看下我们的gerrit.conf
文件如何设置。
我们用vim gerrit.conf
创建这个文件,然后输入下面的内容:
1 | server { |
最终是这样的:
我们来详细解释几个重点:
- 我们监听
81
端口,原因和前面一样,80端口被apache占用了,当然你还可以设置成其他没有被占用的端口 auth_basic 是用于登录时弹出验证登录对话框,我盗一张图来说明一下
图片中 服务器提示: 后面的文字,就是我们在配置中当前选项的内容
auth_basic_user_file 是我们输入用户名和密码之后要去验证是否匹配的文件,看到路径是放在我们的gerrit用户目录下面;这个详细的内容我们一会再来说。
- location 部分指的的是当用户访问到
192.168.1.100:81
时,要指向的内容,这里面的proxy_pass 字段表示要做的反向代理,指向的是8080,还记得8080端口是谁在用么?对的,就是我们之前新建好的gerrit的web监听端口,也就是说,当用户访问81端口时,nginx直接把这个请求代理到8080端口上去了,这个就是所谓的反向代理
。
重启nginx
配置好了之后,我们需要重启nginx
1 | $ service nginx restart |
然后我们去访问http://192.168.1.100:81
页面,就能看到和上图一样的登录认证界面了。
登录认证文件
那登录认证有了,我们怎么登录呢??就需要前面的auth_basic_user_file
文件了。
这里我们需要用apach的 htpasswd
工具来新建这个文件,这也是为什么我们虽然不用到apache的反向代理,仍然需要apache的原因。
我们通过下面的命令来在/home/gerrit/
路径下创建认证文件
1 | $ htpasswd -c /home/gerrit/gerrit.password admin |
这个命令的详细解释:
- -c表示create,也就是新建的意思
- 接下来跟上文件要创建的目录以及文件名,我们直接用绝对路径,表示将在
/home/gerrit
目录下新建一个gerrit.password
文件 - 最后的admin表示要写入的用户名
接下来你需要在命令行中连续输入两次密码,我们就为admin用户设置好了密码,可以通过vim来查看下这个密码文件,会发现里面是经过加密的。
如果我们想新建别的用户,或者修改某个用户的密码,只需要把-c
改成-m
就好了,如果还是用-c
并且路径不变的话,就会覆盖掉原来的文件。
例如:我们想要新增一个用户,master,允许其通过页面登录,只需要执行下面的命令就好了
1 | $ htpasswd -m /home/gerrit/gerrit.password master |
同样的输入两遍密码,就设置好了master用户的登录密码了。
注意:如果你是在root用户下输入上面的命令 创建了gerrit.password
文件到/home/gerrit/
目录中,你会发现在登录的时候永远登录不成功,永远会得到服务器500的错误页面。原因是/homt/gerrit/
文件夹的权限问题。
我们知道,/home/gerrit/
是我们之前新建的gerrit用户的,那么这个文件夹的权限是700,也就是只允许gerrit用户访问,其他组的用户是访问不了的,虽然这个文件的权限拥有root用户的所有权限,但是因为它放在700权限的文件夹下面,所以同样其他用户是访问不到的。
这个问题之前纠缠了我好久,通过nginx的日志可以清楚的看到访问拒绝的错误。
所以,我们需要通过下面的命令,来改变gerrit目录的权限
1 | $ chmod 755 /home/gerrit |
这样,当前目录权限就变成了drwxr-xr-x
,也就是其他组的用户也拥有了读取和执行的权利。
修改gerrit配置
好了,配置好了nginx,我们接下来修改下gerrit的配置,我们要做下面几个事情:
- 配置SMTP邮件发送
- 配置反向代理
先来看一下我最终成品图,红框里面的东西是需要我们特别注意的:
- canonicalWebUrl 就是gerrit的主页地址。开篇时,我们假设gerrit服务器的ip地址是192.168.1.100,这里我们就需要设置成
http://192.168.1.100:8080
- auth的类型一定要是http,这是我们在安装的时候唯一需要手动设置的地方
sendemail选项就是我们的邮件发送设置,如果你的gerrit服务器上没有搭建邮件服务器,那你可以用smtp发件代理,我这里去我们公司的邮箱注册了一个gerrit专用邮箱`gerrit@microwu.com
,我们公司使用的是阿里云的服务,所以smtp服务器地址是
smtp.mxhichina.com,端口使用
465,因为使用的是
SSL认证,然后
smtpPass`填写上之前专用邮箱的密码。sendemail有什么作用呢?
- 当有新的允许登录web页面的成员需要修改自己的邮箱时,点击注册邮箱,我们这个专用邮箱就会向该成员申请的邮箱中发送一封确认邮件。
位于Administrator组中的用户,设置了想要watch的项目之后,所有和该项目相关的事件,都能收到一封邮件提醒,发送来自于这个专有邮箱
具体的细节我们在下一篇文章中再详细介绍
- sshd就是ssh监听的端口,这个我们在安装gerrit时采用的是默认的配置,也就是
29418
这个端口 - httpd表示反向监听的端口,这里注意要修改成
proxy-http://*:8080/
,默认值是没有proxy的
重启gerrit
完成上面的配置之后,我们重启一下gerrit
gerrit的可执行文件位于/home/gerrit/gerrit_site/bin
目录下,我们直接执行
1 | $ /home/gerrit/gerrit_site/bin/gerrit.sh restart |
这样,gerrit就会重新启动,并且加载我们刚才修改的配置。
重启完成之后,我们可以在浏览器中输入192.168.1.100:81
看看是不是可以弹出输入用户名和密码的对话框(如果没有,请检查你的Nginx配置);然后输入正确的用户名(我们创建的密码文件用户是admin)和密码,如果你能登录到这个页面,就表示你的gerrit已经成功配置好了!
需要注意的是,gerrit配置了之后,第一个登录成功的用户,自动成为管理员,gerrit会给他分配一个id,1000000
,之后登录的成员会依次自增1,初始时 Full Name 和 Email Address字段都是空的。
关于Gerrit的安装和配置Nginx实现反向代理的内容都介绍完了,关于如何使用Gerrit以及Gerrit的工作原理和流程,我们在下一个章节再介绍。
gitweb(可选)
gitweb可以让你的git工程变得更加方便阅读,它相当于网页版的sourceTree或者其他git可视化工具,让你清楚地看到每一次改变的详情。
配置了gitweb之后,可以在gerrit的主页project中增加一个gitweb的连接。
说明:gitweb部分的内容是可选的,不配置gitweb一样可以正常使用gerrit。
下面简要介绍一下集成gitweb的步骤。
安装gitweb
- ubuntu:
apt-get install gitweb
- redhat/centOS:
yum install gitweb
默认gitweb是安装到apache目录中的,也就是/var/www/
目录下会有一个git
文件夹,专门用来显示gitweb页面
修改gitweb配置文件
gitweb的配置文件地址在:/etc/gitweb.conf
默认的文件中所有的内容应该都被注释掉了,我们直接在最后面执行git仓库的位置:
1 | $projectroot = "/home/gerrit/gerrit_site/git" |
注:可能你的gerrit位置和我的不一样。如果你按照我这篇文章的教程安装gerrit,则和上面代码一样,只要正确指向所有git仓库的根目录就好了。
修改Apache配置文件
这里先说明一下,gitweb同样可以通过nginx来代理,不过因为默认是在apache目录下,这里我就只介绍下apache的配置,nginx的配置请自行google。
同nginx一样,apache的配置目录(/etc/httpd/
)下也有两个文件夹,conf
和conf.d
,前面是默认的所有配置,后面是可以自定义的配置。
我们可以选择修改默认配置(/etc/httpd/conf/httpd.conf
)或者新建一个配置,然后在配置文件中加入下面的代码:
1 | # |
接下来重启一下apache服务器(service httpd restart
),你就可以在http://192.168.1.100/gitweb
页面中看到你的git项目了。
修改gerrit配置
修改/home/gerrit/gerrit_site/etc/gerrit.conf
文件,添加如下内容:
1 | [gitweb] |
然后重启一下gerrit服务(/home/gerrit/gerrit_site/bin/gerrit.sh restart
),并重新登录web页面,就可以了!!
补充内容
卸载Gerrit
如果你的安装过程出错了,或者觉得安装的不够好,比如文件位置什么的,你可以重新安装。
如果你的gerrit服务已经处于运行中,需要先执行下面的命令把它停掉
1 | $ /home/gerrit/gerrit_site/bin/gerrit.sh stop |
然后直接删除/home/gerrit/gerrit_site/
整个文件夹就好了。
如果你的gerrit服务没有正常退出,可能会发现这个文件夹删除不掉(cache 和 db这两个文件夹一直都会存在),其实是因为还有gerrit的进程在跑,我们要做的是找出gerrit的进程,然后kill掉就好了
1 | $ ps -ef | grep gerrit |
看上图中的最后一条,就是当前gerrit的进程,49513就是其进程id
我们接着执行
1 | $ kill -9 49513 |
就强制关闭了gerrit进程,然后再试着删除整个gerrit_site
文件夹就好了。
删除git工程
如果你想删除一些无用的或者测试的git工程,只需要去/home/gerrit/gerrit_site/git
目录下删除掉相应的工程,然后重启一下gerrit服务,同时,把浏览器整个关闭,然后再重新登录,就可以了。至于为什么要关闭掉整个浏览器,接着往下看:
退出gerrit网页
如果你已经成功登录了gerrit的网页,那么如果你想退出,请直接关闭整个浏览器,gerrit没有做logout的session清除,所以如果你直接点击网页右上角的logout,要么会出错,要么就会进入到之前那个提示需要反向代理的错误页面。关于登出,gerrit给出的原因是:
You are using HTTP Basic authentication. There is no way to tell abrowser to quit sending basic authentication credentials, to logout with basicauthentication is to close the Webbrowser.