Linux 下安装 Gerrit
最近在安装gerrit ,期间遇到了一些问题,这篇文章主要是记录一下gerrit的安装过程
开发环境
记录下本机的安装环境:
- Redhat(CentOS)6.1
- java 1.8.0_201
- git 1.7.1
- Nginx
- httpd
几点说明:
-
关于操作系统
Redhat和CentOS用的是同样的内核,我这里是6.1版本的内核
为了方便后面文章的讲解,我们这里假设gerrit服务器的ip地址是192.62.1.1
-
关于Java环境
在终端中输入java -version
务必确保你的java环境正确安装了;因为整个gerrit的安装是依赖于Java的,另外最好确保Java版本在1.6以上吧,虽然我没有验证过低版本的Java是不是没问题,但是高一点的版本保险一点。 -
Web服务器
网上很多教程有讲到gerrit+apache安装过程的,我这里两种都用到了。先来说说为什么一定要用apache或者nginx,是的就是为了反向代理
。
Gerrit有两种工作方式,我们要采用http
的工作方式,也就是代码审核人员,可以直接通过Web页面对提交的代码进行评审以及后续的操作。
然后Gerrit要求不能直接请求其端口,必须要使用反向代理才能正确登录。而我们知道Nginx的成功正在于其高效、轻量级以及反向代理,虽然Apache也有反向代理的功能,但是如果你在安装Apache时没有开启,后续的开启过程要相对复杂一点,而Nginx就简单的多了。
不过即便我们使用Nginx做为web页面引擎,仍然需要安装Apache,因为我们需要用到apache的一个工具来创建验证密码文件。这个后面我们会看到具体用法。
ps: apache 就是httpd
-
数据库
我用的是mysql
所以,请务必确保以上几个工具正确安装。
在RedHat或者CentOS上可以通过yum
工具来安装,如果yum的源打不开,可以去网上搜一下替换yum源的方法。
安装gerrit
下载gerrit安装包
到gerrit 官网下载最新的包:
我的是gerrit 版本是2.16.7
新建gerrit专用用户
新建一个用户用来专门管理gerrit相关的内容
在root用户下
[root@localhost logs]# adduser gerrit [root@localhost logs]# su gerrit
建好用户以后,我们可以把之前下载好的gerrit安装包(gerrit-2.16.7.war)拷贝到/home/gerrit/
目录下,一会方便gerrit用户来安装。
安装gerrit
在gerrit用户的目录(/home/gerrit/)下面,执行下面的命令:
$ java -jar gerrit-2.16.7.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
然后重新安装就可以了。
其实安装过程真的很简单,只是在Authentication method
方式时输入http
其他的一路回车下去就好了。其他的配置以后都可以改
ps:如果在安装过程遇到如下错误
(1) 执行 java -jar gerrit-2.11.3.war init -d ~/gerrit_site 报错 如下: fatal: DbInjector failed fatal: Unable to determine SqlDialect fatal: caused by java.sql.SQLException: Access denied for user 'root@localhost'@'localhost' (using password: YES) 需要给mysql 给root 用户设置密码123456 ,同理也需要给 新增加的 gerrit 用户设置密码123456 (2)如果死活给gerrit 设置新密码不成功,需要用到如下方法:(终于发现是因为mysql数据库的user表里,存在用户名为空的账户即匿名账户,导致登录的时候是虽然用的是root,但实际是匿名登录的,通过错误提示里的''@'localhost'可以看出来,于是解决办法见方法二。) 1.关闭mysql $ service mysqld stop 2.屏蔽权限 $ mysqld_safe --skip-grant-table 屏幕出现: Starting demo from ..... 3.新开起一个终端输入 $ mysql -u root mysql mysql> delete from user where USER=''; mysql> FLUSH PRIVILEGES;//记得要这句话,否则如果关闭先前的终端,又会出现原来的错误 mysql> \q
启动gerrit
[gerrit@localhost bin]$ su root Password: #先启动 mysqld服务 $ service mysqld restart [root@localhost bin]# /home/gerrit/gerrit_site/bin/gerrit.sh stop Stopping Gerrit Code Review: OK [root@localhost bin]# /home/gerrit/gerrit_site/bin/gerrit.sh start Starting Gerrit Code Review: OK # 如果选择用nginx做反向代理,那么就需要把 nginx服务开起来 $ service nginx restart #如果选择用httpd做反向代理,那么就需要把 httpd服务开起来 $ service httpd restart
安装完成之后,启动gerrit,会开始监听两个端口:29418: 默认的ssh端口;8081: gerrit的web页面端口。因为8080端口被安装jenkins服务占用了
我们可以通过下面命令查看:
[root@localhost bin]# netstat -ltpn |grep -i gerrit tcp 0 0 :::29418 :::* LISTEN 17257/GerritCodeRev tcp 0 0 :::8081 :::* LISTEN 17257/GerritCodeRev
Nginx
在没有配置 nginx 反向代理之前,直接访问 192.62.1.1:8081(我们之前假设gerrit服务器的ip地址是192.62.1.1),会得到一个错误页面,
一旦出现这个页面那就是 nginx 或者httpd的配置文件没对。
nginx的 gerrit.conf 配置
我们首先看一看nginx的默认配置。
注意,你的nginx应该是用root账户安装的,否则可能出现权限问题。我们需要从之前的gerrit用户退出来。
在root用户下面,输入下面的命令:
[root@localhost conf.d]# cd /etc/nginx/conf.d/ [root@localhost conf.d]# ls
默认的nginx只有一个default.conf文件,是nginx的默认配置文件,这里我们不需要修改默认配置文件,只需要新建一个专门用来处理gerrit请求的配置文件,我这里新建了一个gerrit.conf
文件,用来处理gerrit的反向代理。
vim /etc/nginx/conf.d/gerrit.conf server { listen *:8082; server_name localhost; allow all; deny all; auth_basic "Welcomme to Gerrit Code Review Site!"; auth_basic_user_file /home/gerrit/gerrit.password; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; } }
我们来详细解释几个重点:
- 我端口默认的监听端口设置成了8082, 因为8080分配给了jenkins,8081分配给了httpd,8183分配给了httpd
- auth_basic 是用于登录时弹出验证登录对话框, 需要填入的用户名和密码,就是我们下一步要说到的
- auth_basic_user_file 是我们输入用户名和密码之后要去验证是否匹配的文件,看到路径是放在我们的gerrit用户目录下面
- location 部分指的的是当用户访问到192.62.1.1
:82
时,要指向的内容,这里面的proxy_pass 字段表示要做的反向代理,指向的是8081,还记得8081端口是谁在用么?对的,就是我们之前新建好的gerrit的web监听端口,也就是说,当用户访问8082端口时,nginx直接把这个请求代理到8081端口上去了,这个就是所谓的反向代理
。
然后日志文件的路径在/var/log/nginx/
目录下,如果后面登录认证的失败的时候,我们可以在这个目录下面查找日志文件,分析失败的原因。
nginx路径在/usr/share/nginx/
路径下,如果我们进到该目录下,查看其下面的index.html文件,就会发现他就是我们在192.62.1.1页面中看到的关于nginx的介绍的页面。
重启nginx
配置好了之后,我们需要重启nginx
$service nginx restart
登录认证文件
那登录认证有了,我们怎么登录呢??就需要前面的auth_basic_user_file
文件了。
这里我们需要用apach的 htpasswd
工具来新建这个文件,这也是为什么我们虽然不用到httpd的反向代理,仍然需要httpd的原因。
我们通过下面的命令来在/home/gerrit/
路径下创建认证文件
$ htpasswd -c /home/gerrit/gerrit.password admin
这个命令的详细解释:
- -c表示create,也就是新建的意思
- 接下来跟上文件要创建的目录以及文件名,我们直接用绝对路径,表示将在
/home/gerrit
目录下新建一个gerrit.password
文件 - 最后的admin表示要写入的用户名
接下来你需要在命令行中连续输入两次密码,我们就为admin用户设置好了密码,可以通过vim来查看下这个密码文件,会发现里面是经过加密的。
如果我们想新建别的用户,或者修改某个用户的密码,只需要把-c
改成-m
就好了,如果还是用-c
并且路径不变的话,就会覆盖掉原来的文件。
例如:我们想要新增一个用户,master,允许其通过页面登录,只需要执行下面的命令就好了
$ htpasswd -m /home/gerrit/gerrit.password master
修改gerrit配置:
修改 gerrit 配置: vim /home/gerrit/gerrit_site/etc/gerrit.config
vim /home/gerrit/gerrit_site/etc/gerrit.config [gerrit] basePath = git canonicalWebUrl = http://localhost:8081/ serverId = ecbafa4c-455d-4a36-bd26-150ad2fc707e [database] type = mysql hostname = localhost database = gerritdb username = gerrit [container] javaOptions = "-Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance" javaOptions = "-Dflogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance" user = gerrit javaHome = /usr/java/jdk1.8.0_201-amd64/jre [index] type = LUCENE [auth] type = HTTP [receive] enableSignedPush = true [sendemail] smtpServer = localhost [sshd] listenAddress = *:29418 [httpd] listenUrl = proxy-https://127.0.0.1:8081/ [cache] directory = cache
ps:#apache和gerrit的配置问题导致gerrit不能正常访问,建议多多查看apache和gerrit的log
$ tail -f /home/gerrit/gerrit_site/logs/error_log
httpd的配置文件
修改httpd 默认配置文件
httpd 用yum 安装,后。httpd 的默认配置文件需要改两个地方:
httpd的默认配置文件所在路径:
vim /etc/httpd/conf/httpd.conf
在这个文件里面需要修改加 Listen 8183 和 ServerName 127.0.0.1:8183 这两个地方的端口号,且 端口要大于1024 并且没有被其他服务使用,如果被占用否则要报如下错误,而小于1024 会让gerrit 服务启动失败。
httpd的gerrit.conf文件
新建一个专门用于gerrit的配置文件: vim /etc/httpd/conf.d/gerrit.conf
ps:特别注意
- <VirtualHost 192.62.1.1:8183> 一定要写本机ip地址,不能写为127.0.0.1,否则会造成只能本机通过 127.0.0.1:8183登录gerrit ,我就是因为这个原因折腾了好久,重新选择了用nginx做反向代理才恍然大悟。
-
ProxyPass / http://127.0.0.1:8081/ 这个为gerrit 的端口号8081
vim /etc/httpd/conf.d/gerrit.conf <VirtualHost 192.62.1.1:8183> # server ip address ServerName localhost ProxyRequests Off ProxyVia Off ProxyPreserveHost On <Proxy *:> Order deny,allow Allow from all #Require all granted </Proxy> <Location /login/> AuthType Basic AuthName "Gerrit Code Review" AuthBasicProvider file AuthUserFile /home/gerrit/gerrit.password Require valid-user </Location> AllowEncodedSlashes On ProxyPass / http://127.0.0.1:8081/ </VirtualHost>
登录127.0.0.1:8183 页面中看到的关于httpd的介绍的页面: