Gerrit搭建遇到的一些问题




参考官方文档:https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.2/install.html

  1. 使用centos6.9系统,注意关闭selinux和iptables防火墙,并创建gerrit2用户:adduser gerrit2
  2. 安装MySQL或者mariadb,修改utf8编码
    [mysqld]  ## 该段下增加如下配置:
    character_set_server = utf8
    character_set_client = utf8
    character_set_filesystem = utf8

    之后重启mysql服务。

  3. 安装jre(版本高于1.7,最低1.8):     rpm -i jre-8u144-linux-x64.rpm,下载地址官方安装文档里面有链接
  4. 安装nginx,在/etc/nginx/conf.d/目录下新建或修改文件:
    virtual.conf,内容如下:
    server {
            listen       80;
            server_name  10.0.30.121;   ## 本机IP
            root         /usr/share/nginx/html;
            location / {
              auth_basic              "Gerrit Code Review";
              auth_basic_user_file    /opt/gerrit2/etc/htpasswd.conf;   ### 登录gerrit使用的认证密码文件
              proxy_pass              http://127.0.0.1:8888;    ### gerrit监听的端口
              proxy_set_header        X-Forwarded-For $remote_addr;
              proxy_set_header        Host $host;
            }
            error_page 404 /404.html;
                location = /40x.html {
            }
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
    }

    之后重启nginx服务。

  5. 初始化数据库
    CREATE USER 'gerrit2'@'localhost' IDENTIFIED BY '123456';    ### gerrit2为数据库用户名,123456为密码,或者直接用root用户和密码访问,root用户密码修改方法请百度,则只需要创建reviewdb数据库即可
    CREATE DATABASE reviewdb;    ### reviewdb为gerrit使用的数据库名称
    GRANT ALL ON reviewdb.* TO 'gerrit2'@'localhost';
    FLUSH PRIVILEGES;
  6. 安装gitweb:yum install gitweb
  7. 配置用户登录密码(需要安装httpd-tools,yum install httpd-tools):
    cd /opt/gerrit2/etc
    htpasswd -c htpasswd.conf admin   ###之后输入两次密码,-c表示创建密码文件htpasswd.conf
    htpasswd htpasswd.conf user1   ### 添加其他用户
  8. 初始化gerrit,先下载gerrit-2.14.2.war(https://gerrit-releases.storage.googleapis.com/index.html):
    mkdir /opt/gerrit2
    cp gerrit-2.14.2.war /opt/gerrit2
    chown gerrit2.gerrit2 -R /opt/gerrit2
    su gerrit2
    java -jar /opt/gerrit2/gerrit-2.14.2.war init -d /opt/gerrit2/ # 输入选默认,插件全部安装(选Y),后面会覆盖初始化过程生成的配置文件

    初始化完之后会在/opt/gerrit2/etc/目录下生成2个配置文件:

    [root@gerrit etc]# cat gerrit.config
    [gerrit]
            basePath = git
            serverId = a673cba0-8af3-4f69-90c6-b681bca3b638
            canonicalWebUrl = http://10.0.30.121/    ### 访问gerrit的IP,需要与nginx配置端口相同,80可不加
    [database]
            type = mysql
            hostname = localhost
            database = reviewdb?useUnicode=yes&characterEncoding=UTF-8
            username = root   ### 直接用root用户访问数据库
    [index]
            type = LUCENE
    [auth]
        type = HTTP
        emailFormat = {0}@yunrongtech.com
    [receive]
            enableSignedPush = false
    [sendemail]
            smtpServer = localhost
    [container]
            user = gerrit2
            javaHome = /usr/java/jre1.8.0_144
    [sshd]
            listenAddress = *:29418
    [httpd]
            listenUrl = http://*:8888/   ### gerrit服务监听端口,需要与nginx中配置相同
    [cache]
            directory = cache
    [gitweb]
            type = gitweb
            cgi = /var/www/git/gitweb.cgi

    gitweb这里,我一开始参考了很多资料,都没提到要加type这个配置项,都无法显示gitweb链接,浪费了很多时间,后来在官方文档里找到了这个配置项是必须要配置的,否则就相当于关闭了gitweb。https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.2/config-gerrit.html#gitweb

    打开changeid超链接,以及关联JIRA单号的超链接设置(追加到gerrit.config文件即可):

    gerrit自带插件也可以之后单独安装:java -jar gerrit.war init -d <SITE_PATH> [–install-plugin=PLUGIN_NAME]

    [root@gerrit etc]# cat secure.config
    [database]
            password = 123456   ### 数据库密码
    [auth]
            registerEmailPrivateKey = BfxlQzoFQlk/XGGDgrP75mt0PnLXmMXS6Ak=

    之后启动gerrit服务即可:cd /opt/gerrit2/bin, ./gerrit.sh start。
    这里遇到一个问题,gerrit在有些发行版部署(可能跟发行版有关,也可能是其他原因,此问题没找到解决方法)之后启动很慢,要10分钟左右,而默认超时时间是90s,导致一直提示”Starting Gerrit Code Review: FAILED”,只能修改超时时间来处理,修改方法,在gerrit.conf文件中的[container]段下增加startupTimeout=900,启动慢但是至少能用: ( 。

    2017-09-18补充:今天同事网上找到了一个java程序启动慢的解决方法,试了下果然有效果(我用的是kvm虚拟机启动的gerrit),首先找到jre的安装目录,可以从gerrit etc目录下的配置文件gerrit.config中找到javaHome = /usr/java/jre1.8.0_144,然后进入其下的lib/security/目录,vi打开其中的java.security,找到securerandom.source=file:/dev/random,将file:/dev/random改成file:/dev/urandom即可解决gerrit启动慢的问题。

  9. 自启动配置
    nginx:chkconfig nginx on
    gerrit:cd /etc/init.d, ln -s   /opt/gerrit2/bin/gerrit.sh  gerrit, chkconfig –add gerrit

备份

  1. crontab脚本
    [root@gerrit rsync]# cat /etc/cron.d/gerrit
    39 2 * * * root /opt/gerrit-backup/backup.sh
    [root@gerrit rsync]# cat /opt/gerrit-backup/backup.sh
    #! /bin/bash
    dt=date +%Y%m%d
    # mysql backup
    mysqldump -uroot -p123456 reviewdb > /opt/gerrit-backup/reviewdb-${dt}.sql
    # gerrit backup
    tar Pcf /opt/gerrit-backup/gerrit2-${dt}.tar /opt/gerrit2
  2. rsync server
    [root@gerrit rsync]# cat /etc/rc.local
    #!/bin/sh
    touch /var/lock/subsys/local
    rsync --daemon --config=/etc/rsync/rsyncd.conf &   ### 添加这行,自动启动rsync服务
    [root@gerrit rsync]# cat /etc/rsync/rsyncd.conf
    # Minimal configuration file for rsync daemon
    # See rsync(1) and rsyncd.conf(5) man pages for help
    # This line is required by the /etc/init.d/rsyncd script
    pid file = /var/run/rsyncd.pid
    lock file = /var/lock/rsyncd.lock
    port = 10873
    address = 10.0.30.121
    uid = root
    gid = root
    use chroot = no
    read only = no
    #limit access to private LANs
    hosts allow=0.0.0.0/0
    #hosts deny=*
    max connections = 32
    motd file = /etc/rsync/rsyncd.motd
    #This will give you a separate log file
    log file = /var/log/rsync/rsync.log
    log format = %t %a %m %f %b
    syslog facility = local3
    timeout = 300
    [gerrit]
    path = /opt/gerrit-backup
    list = no
    ignore errors
    auth users = gerrit
    secrets file = /etc/rsync/rsync.pas
    #comment = gerrit backup dir
    #exclude =[root@gerrit rsync]# cat /etc/rsync/gerrit.pas ### 注意文件权限为600
    ********* #### rsync密码[root@gerrit rsync]# cat /etc/rsync/rsync.pas ### 注意文件权限为600
    gerrit:******* #### rsync server认证使用的配置文件,包含用户名及密码,这里的密码要与上面gerrit.pas中的完全一致
  3. rsync client  ### 在一台windows7电脑上,配置定时任务,自动执行rsync同步(Linux客户端也一样的配置):
    d:\blog\gerrit.bat   ### rsync client脚本文件
    cd /d c:\Program Files (x86)\ICW\Bin   ### rsync windows 客户端安装目录
    rsync.exe -vzrtopgu --progress --delete  --port=10873 gerrit@10.0.30.121::gerrit /cygdrive/d/blog/gerrit-backup < gerrit.pas   ### gerrit.pas为密码文件,与server端一致

    windows任务计划(每天早上2:33分自动同步rsync server配置的目录/opt/gerrit-backup到d:\blog\gerrit-backup):

    gerrit-backup.xml:  ### 在任务计划程序中导入这个文件即可
    <?xml version="1.0" encoding="UTF-16"?>
      <RegistrationInfo>
        <Date>2017-08-22T12:34:50.8871484</Date>
        <Author>VisionStack-pc\Administrator</Author>
      </RegistrationInfo>
      <Triggers>
        <CalendarTrigger>
          <StartBoundary>2017-08-23T02:33:37</StartBoundary>
          <Enabled>true</Enabled>
          <RandomDelay>PT1H</RandomDelay>
          <ScheduleByDay>
            <DaysInterval>1</DaysInterval>
          </ScheduleByDay>
        </CalendarTrigger>
      </Triggers>
      <Principals>
        <Principal id="Author">
          <UserId>S-1-5-18</UserId>
          <RunLevel>LeastPrivilege</RunLevel>
        </Principal>
      </Principals>
      <Settings>
        <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
        <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
        <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
        <AllowHardTerminate>true</AllowHardTerminate>
        <StartWhenAvailable>true</StartWhenAvailable>
        <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
        <IdleSettings>
          <StopOnIdleEnd>true</StopOnIdleEnd>
          <RestartOnIdle>false</RestartOnIdle>
        </IdleSettings>
        <AllowStartOnDemand>true</AllowStartOnDemand>
        <Enabled>true</Enabled>
        <Hidden>false</Hidden>
        <RunOnlyIfIdle>false</RunOnlyIfIdle>
        <WakeToRun>false</WakeToRun>
        <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
        <Priority>7</Priority>
      </Settings>
      <Actions Context="Author">
        <Exec>
          <Command>D:\blog\gerrit.bat</Command>
        </Exec>
      </Actions>
    </Task>