1. 资源规划

组件 cicd-server-1 cicd-test-2 cicd-prod-3
OS redhat-8.2 redhat-8.2 redhat-8.2

2. 安装介质

版本:gerrit-2.12.war
下载:https://gerrit-releases.storage.googleapis.com/index.html

3. 环境准备

3.1. 基础环境准备

  • 安装RedHat

参考:《Vagrant-安装RedHat-8.2》。

  • 安装JDK

参考:《RedHat-安装JDK-1.8.221》。

  • 安装Git

参考:《RedHat-安装Git-2.19.2》,注意:Gerrit-2.16以后的版本使用Git-1.8(CentOS默认安装的),会报错:“git: ‘interpret-trailers’ is not a git command. See ‘git —help’.”,建议升级至Git-2.x以上。

  • 安装MySQL

参考:《RedHat-安装MySQL-5.7.30》。

  • 安装OpenLDAP

参考:《RedHat-安装OpenLDAP(Docker)》。

3.2. 创建Gerrit账户

  1. sudo adduser gerrit
  2. sudo passwd gerrit
  3. su - gerrit
  4. git config --global core.quotepath false
  5. git config --global i18n.logoutputencoding utf8
  6. git config --global i18n.commitencoding utf8
  7. git config --list
  8. exit

赋值权限:

  1. sudo chmod u+w /etc/sudoers
  2. sudo vi /etc/sudoers
  3. sudo visudo

内容如下:

  1. # 在root后追加gerrit
  2. gerrit ALL=(ALL) NOPASSWD: ALL

复原权限:

  1. sudo chmod u-w /etc/sudoers
  2. sudo cat /etc/sudoers |grep gerrit

3.3. 安装说明

1. Gerrit验证模式

  • OpenID模式(默认,**需提OpenID账户,如:GoogleAccounts**)

默认的鉴权方式为OpenID,即使用任何支持OpenID的认证源(如:Google、Yahoo!)进行身份认证。此模式支持用户自建帐号,用户通过OpenID认证源的认证后,Gerrit会自动从认证源获取相关属性如用户全名和邮件地址等信息创建帐号。如果是开放服务的Gerrit服务,使用OpenId认证是最好的方法,就像谷歌Android项目的代码审核服务器配置的那样。任何人只要在具有OpenId provider的网站上(如Google、Yahoo等)具有帐号,就可以直接通过OpenId注册,Gerrit会在用户登录OpenId provider网站成功后,自动获取(经过用户的确认)用户在OpenId provider站点上的部分注册信息(如用户全名或者邮件地址)在Gerrit上自动为用户创建帐号。

  • LDAP模式(推荐,需提供LDAP/OpenLDAP账户)

如果有可用的LDAP/OpenLDAP服务器,可以直接使用LDAP中的已有帐号进行认证,不过此认证方式下Gerrit的自建帐号功能是关闭的。如果架设有LDAP/OpenLDAP服务器,并且用户帐号都在LDAP中进行管理,那么采用LDAP认证也是非常好的方法。登录时提供的用户名和口令通过LDAP服务器验证之后,Gerrit会自动从LDAP服务器中获取相应的字段属性,为用户创建帐号。创建的帐号的用户全名和邮件地址因为来自于LDAP,因此不能在Gerrit更改,但是用户可以注册新的邮件地址。

  • HTTP(需配置反向代理服务)

此认证方式需要架设反向代理服务(可选用Ngnix/Apache/IHS),并在配置Web站点的口令认证(HTTP认证,口令文件管理上需要管理员手工维护),通过口令认证后Gerrit在创建帐号的过程中会询问用户的邮件地址并发送确认邮件。

  • development_become_any_account(实验性质,用于体验测试,不适用于日常使用)

由用户自动登录,任何访问者都可以使用管理账号。

2. Gerrit数据库

Gerrit数据库默认为H2(文件数据库),无须任何配置即可使用。默认数据库的名称是reviewdb,数据库存放的路径是可以进行配置的。不过Gerrit新版本(Gerrit-2.13+)中会把一些数据从它的默认数据库移出来,用H2来存放,例如:“account_patch_reviews.h2.db”,之前Gerrit-2.11版本的时候是和主数据库放在一起的,后面在Gerrit-2.13版本中独立出来放到里H2数据库当中。
Gerrit支持的数据库有:H2、Apache Derby、PostgreSQL、MySQL、MariaDB、Oracle、SAP MaxDB、DB2、SAP、HANA等。
此次选择MySQL数据库用于存储Gerrit相关信息,库表初始化过程如下:

  1. # mysql -uroot -p123456
  2. create database reviewdb;
  3. CREATE USER 'gerrit'@'localhost' IDENTIFIED BY 'gerrit';
  4. CREATE USER 'gerrit'@'127.0.0.1' IDENTIFIED BY 'gerrit';
  5. flush privileges;
  6. grant all privileges on reviewdb.* to gerrit@localhost identified by 'gerrit';
  7. grant all privileges on reviewdb.* to gerrit@'127.0.0.1' identified by 'gerrit';
  8. -- 以下两行正式环境无需安装,此处为本地测试使用,方便宿主机连接虚拟机
  9. grant all privileges on reviewdb.* to gerrit@'192.168.56.101' identified by 'gerrit';
  10. grant all privileges on reviewdb.* to gerrit@'192.168.56.1' identified by 'gerrit';
  11. flush privileges;
  12. quit

4. Gerrit安装

  1. 安装Gerrit。 ```bash su - gerrit mkdir -p /home/gerrit/gerrit_site/lib

    临时声明${GERRIT_SITE},或配置到环境变量(/etc/profile或~/.bashrc)

    export GERRIT_SITE=/home/gerrit/gerrit_site

上传MySQL相关jar包

cp /share/mysql-connector-java-5.1.21.jar ${GERRIT_SITE}/lib/ cp /share/bcpkix-jdk15on-1.52.jar ${GERRIT_SITE}/lib/

sudo chown -R gerrit.gerrit /home/gerrit

首次安装执行

java -jar /share/gerrit-2.12.war init -d ${GERRIT_SITE}

再次安装执行

java -jar ${GERRIT_SITE}/bin/gerrit*.war init -d ${GERRIT_SITE}

重建索引,修改配置后执行

java -jar ${GERRIT_SITE}/bin/gerrit*.war reindex -d ${GERRIT_SITE}

  1. 配置过程:
#

……

############ 数据库配置

Database server type : mysql # 数据库采用MySQL Server hostname : 192.168.56.101 # Gerrit服务器对应的域名(bocom.com) Server port : 3306 # 数据库端口(默认:3306) Database name : reviewdb # 数据库名称(默认:reviewdb) Database username : gerrit # 数据库用户名(默认:root/123456) gerrit’s password : # 输入数据库密码并确认

############ 认证配置

Authentication method : ldap # 认证类型 LDAP server : ldap://192.168.56.101:389 LDAP username : cn=admin,dc=bankcomm,dc=uat # admin/${LDAP_ADMIN_PASSWORD} Account BaseDN :ou=People,dc=bankcomm,dc=uat Group BaseDN :ou=Groups,dc=bankcomm,dc=uat

Enable signed push support :N Install Verified label :N

############ 邮箱配置

SMTP server hostname :smtp.qq.com SMTP server port :465 SMTP encryption :ssl SMTP username :450733605@qq.com

Gerrit Code Review is not shipped with Bouncy Castle Crypto SSL v152 Download and install it now :N

############ Gerrit Web UI配置

Run as : gerrit Behind reverse proxy :N # 是否使用反向代理:N-不使用 Use SSL (https://) :N # 是否启用HTTPS加密:N-不使用 Listen on port : 7081 Canonical URL : http://192.168.56.101:7081/ ……

#
  1. 2. 配置检查。
  2. ```bash
  3. cat ${GERRIT_SITE}/etc/gerrit.config
  4. # 修复邮箱发送问题
  5. vi ${GERRIT_SITE}/etc/gerrit.config

内容如下:

  1. ...
  2. [sendemail]
  3. smtpServer = ***
  4. smtpServerPort = ***
  5. smtpEncryption = ***
  6. smtpUser = ***
  7. from = 450733605@qq.com # 添加项
  8. ...

生效配置:

  1. # 重建索引,修改配置后执行
  2. java -jar ${GERRIT_SITE}/bin/gerrit*.war reindex -d ${GERRIT_SITE}

5. Gerrit设置

  • 防火墙开放端口**(若防火墙关闭则无需下述操作)** ```bash

    查看firewall的状态

    sudo firewall-cmd —state

    查看防火墙状态(RedHat7之前的版本,防火墙默认采用firewall)

    sudo service iptables status

    查看firewall服务状态

    sudo systemctl status firewalld

开放端口(根据需要放行端口7081、29418)

sudo firewall-cmd —zone=public —permanent —add-port=7081/tcp

关闭端口

sudo firewall-cmd —remove-port=7081/tcp —permanent

重新加载防火墙

sudo firewall-cmd —reload

查看防火墙端口开放情况

sudo firewall-cmd —list-all

  1. <a name="wDpGz"></a>
  2. # 6. 服务启停
  3. 1. 启停脚本。
  4. ```bash
  5. sudo vi /usr/lib/systemd/system/gerrit.service
  6. sudo vi /lib/systemd/system/gerrit.service

配置如下:

  1. ExecStatus=/home/gerrit/gerrit_site/bin/gerrit.sh status
  2. ExecRestart=/home/gerrit/gerrit_site/bin/gerrit.sh restart
  3. [Unit]
  4. Description=Gerrit Web System.
  5. After=network.target
  6. [Service]
  7. Type=forking
  8. User=gerrit
  9. EnvironmentFile=/home/gerrit/gerrit_site/etc/gerrit.config
  10. StandardOutput=syslog
  11. StandardError=syslog
  12. SyslogIdentifier=gerrit
  13. ExecStart=/home/gerrit/gerrit_site/bin/gerrit.sh start
  14. ExecStop=/home/gerrit/gerrit_site/bin/gerrit.sh stop
  15. PIDFile=/home/gerrit/gerrit_site/logs/gerrit.pid
  16. [Install]
  17. WantedBy=multi-user.target

启停服务:

  1. sudo systemctl enable gerrit
  2. sudo systemctl start gerrit
  3. sudo systemctl stop gerrit
  4. sudo systemctl restart gerrit
  5. sudo systemctl status gerrit
  6. # 修改服务配置后,需要重新加载
  7. sudo systemctl daemon-reload
  1. 查看状态。

    1. systemctl status gerrit
    2. sudo netstat -ltpn |grep -i gerrit
    3. sudo ps -aux |grep -i gerrit
    4. sudo ps -ef |grep gerrit
    5. tail -f ${GERRIT_SITE}/logs/error_log

    7. 验证

    Web UI:http://bankcomm.uat:7081 (gerrit001~gerrit010/密码与用户名相同,第一次登录的用户,默认为管理员)

    8. 集成

    8.1. 集成GitLab

    Gerrit本身提供了两大功能:一是Code Review;二是Git仓库。Replication插件通常用于提供changes的镜像,或热备份。此外,许多现有的项目可能是用另外一套系统来管理Git代码仓库的,比如GitLab,或者GitHub。需要引入Gerrit做Code Review,同时对接这些已有的Git仓库系统时,replication插件比较有用。配置replication 将代码同步到GitLab的方法如下。

    1. GitLab配置

  2. 创建项目组: 例如:HKG_deploymentTeam。

  3. 创建项目: 例如:HKG_test_project。
  4. 创建用户:例如:gerrit001、gerrit002,确保有maintainer或ower权限。
  5. 把Gerrit服务器上,Gerrit的运行用户(root或者gerrit,根据Gerrit安装实际情况,此处按照Gerrit配置文件为gerrit用户)的公钥添加进“SSH Keys”。

    1. # 切换用户为Gerrit运行用户
    2. su - gerrit
    3. # 生成密钥和公钥
    4. rm -rf ~/.ssh/
    5. ssh-keygen -t rsa -m PEM -C 'gerrit@bankcomm.uat'

    如果通过SSH来从Gerrit同步代码到GitLab,需要确保远程系统,也就是GitLab服务器的主机密钥已经在Gerrit用户的“~/.ssh/known_hosts”文件中了。复制“/home/gerrit/.ssh/id_rsa.pub”内容添加到GitLab账户“SSH Keys”内。

    2. Gerrit配置

  6. 配置push到GitLab的私钥。

    1. su gerrit
    2. rm -rf ~/.ssh/config
    3. vi ~/.ssh/config

    内容如下:

    1. Host 192.168.56.101:
    2. IdentityFile ~/.ssh/id_rsa
    3. PreferredAuthentications publickey
    4. StrictHostKeyChecking no
    5. UserKnownHostsFile /dev/null

    权限赋值:

    1. chmod 600 ~/.ssh/config
    2. # R:清除所有属于远程服务器${remote hostname/ip}的缓存和公钥信息
    3. # ssh-keygen -R 192.168.56.101 -f ~/.ssh/known_hosts
    4. # p:指定指定连接远程主机的端口
    5. ssh-keyscan -p 7082 192.168.56.101 >> ~/.ssh/known_hosts
    6. # t:指定要创建的密钥类型
    7. sh -c "ssh-keyscan -t rsa 192.168.56.101 >> ~/.ssh/known_hosts"
    8. # H:对known_hosts文件进行散列计算
    9. sh -c "ssh-keygen -H -f ~/.ssh/known_hosts"
  7. 配置复制。

    1. rm -rf ${GERRIT_SITE}/etc/replication.config
    2. vi ${GERRIT_SITE}/etc/replication.config

    内容如下:

    1. [remote "192.168.56.101"]
    2. url = git@192.168.56.101:hkg_deploymentteam/${name}.git
    3. push = +refs/heads/*:refs/heads/*
    4. push = +refs/tags/*:refs/tags/*
    5. push = +refs/changes/*:refs/changes/*
    6. thread = 3
    7. rescheduleDelay = 30
  8. 重启Gerrit服务。

    1. sudo systemctl restart gerrit
  9. Gerrit创建同名项目。

使用Gerrit管理员登录(gerrit001),选择 Projects -> Create New Project:在“Project Name”一栏输入工程的名字(hkg_test_project),并点击 “Create Project”按钮即可完成工程的创建。在Gerrit的配置文件“${GERRIT_SITE}/etc/gerrit.config”中,“basePath”定义了这些工程的位置。注意:工程名字要与GitLab上对应的工程名字相同。

  1. 从GitLab上克隆项目。

    1. cd ${GERRIT_SITE}/git/
    2. rm -rf hkg_test_project.git
    3. git clone --bare git@192.168.56.101:hkg_deploymentteam/hkg_test_project.git
  2. 开发人员拉取代码。 ```bash

    配置git

    git config —global user.name gerrit003 git config —global user.email gerrit003@bankcomm.uat

生成密钥和公钥

rm -rf ~/.ssh ssh-keygen -t rsa -C “gerrit003@bankcomm.uat”

添加公钥到Gerrit SSH Keys

cat ~/.ssh/id_rsa.pub

vi ~/.ssh/config

  1. 内容如下:

Host * KexAlgorithms +diffie-hellman-group1-sha1 User gerrit003 Port 29418 IdentityFile C:/Users/Administrator/.ssh/id_rsa

  1. 拉取代码:
  2. ```bash
  3. # 该命令行从Gerrit复制,请先点击“Clone with commit-msg hook”后复制
  4. git clone ssh://gerrit003@192.168.56.101:29418/hkg_test_project && scp -p -P 29418 gerrit003@192.168.56.101:hooks/commit-msg hkg_test_project/.git/hooks/
  5. # 变更代码并提交
  6. git add .
  7. git commit -m'test'
  8. git push origin master:refs/for/master
  1. 查看日志。

    1. tail -f ${GERRIT_SITE}/logs/replication_log

    8.2. 集成Jenkins

    1. 集成准备

  2. 辅助插件安装。

此处采用离线安装方式,先从镜像站下载插件,之后上传至Gerrit插件目录(${GERRIT_SITE}/plugins/),最后重启即可。

  1. 启用Verified label。
  • 初始化方式

    1. java -jar ${GERRIT_SITE}/bin/gerrit*.war init -d ${GERRIT_SITE}

    配置修改如下:

    1. #############################################################################
    2. ......
    3. ################## 启动Verified label ##################
    4. Install Verified label Y
    5. ......
    6. #############################################################################
  • 使用git**方式**

    1. git clone ssh://gerrit001@192.168.56.101:29418/All-Projects
    2. cd All-Projects
    3. vi project.config

    配置如下(末尾添加):

    1. [label "Verified"]
    2. function = MaxWithBlock
    3. value = -1 Fails
    4. value = 0 No score
    5. value = +1 Verified
    6. copyAllScoresIfNoCodeChange = true

    提交更新:

    1. git commit -am "change project"
    2. git push origin meta/config:meta/config
  1. 账号基本配置。

在Gerrit网站上,使用Jenkins用户登录,依次进入菜单:“Settings”-> “SSH Public Keys”。

  1. su - jenkins
  2. ssh-keygen -t rsa -m PEM -C 'jenkins@bankcomm.uat'
  3. ssh-keygen -t rsa -C "jenkins@bankcomm.uat"
  4. cat ~/.ssh/id_rsa.pub # 把公钥内容复制一下,添加到Gerrit的SSH Keys
  1. 群组配置。

在Gerrit网站上,使用管理员登陆,依次进入菜单:“PeopleList GroupsNon-Interactive Users”,之后添加Jenkins用户(gerrit006/gerrit006@bankcomm.uat)。

  1. 权限配置。

在Gerrit网站上,使用管理员登陆,依次进入菜单:“ProjectsAll-ProjectsAccessEdit”。


- Global Capabilities
- Stream Events:ALLOW for Non-Interactive Users
- Reference: refs/*
- Read:ALLOW for Non-Interactive Users
- Reference: refs/heads/*
- Label Code-Review:-1, +1 for Non-Interactive Users
- Label Verified:-1, +1 for Non-Interactive Users

2. Gerrit Trigger插件安装

采用离线安装的方式,先下载插件(.hpi,https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/),登录Jenkins管理控制台,依次进入:“Manage Jenkins”(系统管理) → “Manage Plugins”(管理插件) → “Advanced”(高级特性) → “Upload Plugin”,之后上传.hpi离线安装包即可自动开启安装。

3. Gerrit Trigger插件配置

登录Jenkins管理控制台,依次进入:“Manage Jenkins”(系统管理) → “Gerrit Trigger” → “Add New Server”(新增服务器) 。


- Gerrit Reporting Values(该项配置完成后需确保“Test Connection”成功)
- Name: 名称(gerrit-2.12_server)
- Hostname:服务器域名或者IP(192.168.56.101)
- Frontend URL: Gerrit UI地址(http://192.168.56.101:7081)
- SSH Port:SSH端口,Gerrit默认为29418(29418)
- Usernam**e:连接Gerrit的用户名(gerrit006)
-
Email:邮箱(gerrit006@bankcomm.uat)
-
SSH Keyfile:Jenkins服务器的私钥路径,同时需要将Jenkins公钥配置到上面的Gerrit用户${Username}的公钥列表中(/home/jenkins/.ssh/id_rsa)
-
SSH Keyfile Password:私钥文件密码,无则留空
-
Gerrit Verified Commands(保持默认即可)
-
Miscellaneous**(保持默认即可)
- REST API**(该项配置完成后需确保“Test REST Connection”成功)
- [x] Use REST API:勾选,启用REST API
- Gerrit HTTP Username:gerrit006
- Gerrit HTTP Password:密码需要用${Username}登录Gerrit网站配置(“
Settings”→“HTTP Password**”)
- [x] Enable Code-Review:勾选,启用Code-Review
- [x] Enable Verified:勾选,启用Verified
  1. 验证。

新建一个job
Build Triggers选择Gerrit event,然后在Gerrit event下面可以配置触发条件、触发项目、触发分支(如果使用正则匹配,注意按照帮助文档写的,仓要加斜杠)

参考

51CTO:CentOS部署配置Gerrit+Gitlab实现代码的Review与自动同步
https://blog.51cto.com/nanfeibobo/2089513
CSDN:Jenkins集成Gerrit
https://blog.csdn.net/cuiaamay/article/details/49002883