Gerrit 服务搭建和升级详解(包括 H2 数据库迁移 MySQL 步骤)

时间:2021-10-19 12:49:44

1. 安装Gerrit-2.9.5版本(Ubuntu)


Gerrit版本:Gerrit-2.9.5.war

操作系统:Ubuntu 16.04.3

JAVA环境:java version "1.8.0_222"

Gerrit下载地址:https://gerrit-releases.storage.googleapis.com/gerrit-2.9.5.war(可修改对应的版本号进行下载)

Gerrit插件下载地址:https://gerrit-ci.gerritforge.com


  1. Gerrit可以使用多种数据库存储数据,此次部署使用的是mysql5.5数据库,首先安装mysql数据库的全部组件
add-apt-repository 'deb http://archive.ubuntu.com/ubuntu trusty main universe'
apt-get update
apt-get install aptitude
aptitude install mysql-server-5.5(第一次对话选择N,第二次对话选择Y)
/etc/init.d/mysql restart
  1. 为了避免gerrit中提交的中文信息中存在乱码,需要在mysql的配置文件中添加如下配置(需重启数据库)
# 在[client]中添加如下内容
default-character-set = utf8 # 在[mysqld]中添加如下内容
character-set-server = utf8 # 在[mysqld_safe]中添加
character-set-server = utf8
collation-server = utf8_general_ci
skip-character-set-client-handshake
  1. 登录数据库,创建gerrit所需要的数据库和用户
mysql> CREATE DATABASE gerritdb DEFAULT CHARACTER SET UTF8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec) mysql> GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec) mysql> GRANT ALL PRIVILEGES ON *.* TO root@'127.0.0.1' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec) mysql> GRANT ALL PRIVILEGES ON *.* TO root@'localhost' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec) mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
  1. 安装Java1.8环境
apt-get install openjdk-8-jre-headless openjdk-8-jdk-headless
  1. 将gerrit安装包gerrit-2.9.5.war上传到home目录下,使用如下命令开始进行安装
java -jar gerrit-2.9.5.war init -d /home/gerrit_2.9.5
  1. 安装过程中需要根据提示进行相应的配置,过程如下:
root@ubuntu:/home# java -jar gerrit-2.9.5.war init -d /home/gerrit_2.9.5        // 开始安装进程

*** Gerrit Code Review 2.9.5
*** Create '/home/gerrit_2.9.5' [Y/n]? // 询问是否创建目录,默认为Y *** Git Repositories
*** Location of Git repositories [git]: // 设置git仓库的地址,默认在安装目录下 *** SQL Database
*** Database server type [h2]: mysql // 选择MySQL数据库进行安装(h2数据库存在性能瓶颈) Gerrit Code Review is not shipped with MySQL Connector/J 5.1.21
** This library is required for your configuration. **
Download and install it now [Y/n]?
Downloading http://repo2.maven.org/maven2/mysql/mysql-connector-java/5.1.21/mysql-connector-java-5.1.21.jar ... ok
// 选择MySQL数据库后需要下载mysql-connector-java-5.1.21.jar包,可提前下载并放置在/home/gerrit_2.9.5/lib目录下 Server hostname [localhost]: 127.0.0.1 // 配置MySQL服务器地址
Server port [(mysql default)]: 3306 // 配置MySQL服务端口号
Database name [reviewdb]: gerritdb // 配置Gerrit使用的数据库
Database username [root]: root // 配置使用该数据库的用户
root's password : // 设置数据库密码
confirm password : // 重新输入密码以确认 *** Index
*** Type [LUCENE/?]: // 设置索引类型,选择默认的LUCENE即可 *** User Authentication
*** Authentication method [OPENID/?]: http // 设置认证方式,选择http认证
Get username from custom HTTP header [y/N]? // 因为要使用反向代理方式,所以禁止从header中获取username
SSO logout URL : // 设置退出后跳转的网址,可不设置 *** Review Labels
*** Install Verified label [y/N]? // 询问是否安装Verified label,选择N *** Email Delivery
*** SMTP server hostname [localhost]: mail.xxx.com.cn // 设置邮件服务器地址
SMTP server port [(default)]: 25 // 设置SMTP服务端口,默认25
SMTP encryption [NONE/?]: // 是否使用SMTP加密,默认不加密
SMTP username [root]: gerrit@xxx.com.cn // 设置邮箱用户名
gerrit@xxx.com.cn's password : // 设置登录密码
confirm password : // 重新确认密码 *** Container Process
*** Run as [root]: // 设置运行Gerrit的用户,默认为root
Java runtime [/usr/lib/jvm/java-8-openjdk-amd64/jre]: // 设置Java路径
Copy gerrit-2.9.5.war to /home/gerrit_2.9.5/bin/gerrit.war [Y/n]? // 询问是否将war包放入安装目录下
Copying gerrit-2.9.5.war to /home/gerrit_2.9.5/bin/gerrit.war *** SSH Daemon
*** Listen on address [*]: // 设置Gerrit的ssh服务监听的地址,默认为全部地址
Listen on port [29418]: // 这是Gerrit的ssh服务监听的端口,默认为29418端口
Generating SSH host key ... rsa... dsa... done
// 生成Gerrit使用的公私钥,此步骤需要下载两个jar包:bcpkix-jdk15on-149.jar、bcprov-jdk15on-149.jar,建议提前下载好放入/home/gerrit_2.9.5/lib目录下
// bcpkix-jdk15on-149.jar下载地址:http://www.bouncycastle.org/download/bcpkix-jdk15on-149.jar
// bcprov-jdk15on-149.jar下载地址:http://www.bouncycastle.org/download/bcprov-jdk15on-149.jar *** HTTP Daemon
*** Behind reverse proxy [y/N]? Y // 询问是否支持反向代理,选择Y
Proxy uses SSL (https://) [y/N]? // 询问是否使用https,选择N
Subdirectory on proxy server [/]: // 设置子目录位置,默认为根目录即可
Listen on address [*]: // 设置Gerrit监听的地址,默认为全部
Listen on port [8081]: 8082 // 设置Gerrit监听的端口
Canonical URL [http://ubuntu/]: http://127.0.0.1:8082/ // 设置标准链接地址 *** Plugins
***
// 以下为选择需要安装的插件,全部选择y
Install plugin commit-message-length-validator version v2.9.5 [y/N]? y
Install plugin download-commands version v2.9.5 [y/N]? y
Install plugin replication version v2.9.5 [y/N]? y
Install plugin reviewnotes version v2.9.5 [y/N]? y
Install plugin singleusergroup version v2.9.5 [y/N]? y Initialized /home/gerrit_2.9.5
Executing /home/gerrit_2.9.5/bin/gerrit.sh start
Starting Gerrit Code Review: OK
Waiting for server on 127.0.0.1:8082 ... OK
Opening http://127.0.0.1:8082/#/admin/projects/ ...FAILED
Open Gerrit with a JavaScript capable browser:
http://127.0.0.1:8082/#/admin/projects/
  1. 安装完成后会自动启动gerrit服务(启动脚本为/home/gerrit_2.9.5/bin/gerrit.sh),首先查看进程是否正常运行
netstat -ltpn | grep -i gerrit
  1. 检查Gerrit的配置文件,路径为/home/gerrit_2.9.5/etc/gerrit.config,标准内容如下:
[gerrit]
basePath = git
canonicalWebUrl = http://127.0.0.1:8082/
[database]
type = mysql
hostname = 127.0.0.1
port = 3306
database = gerritdb
username = root
password = 123456 // Gerrit默认不保存数据库明文密码,可手动在配置文件中添加
[index]
type = LUCENE
[auth]
type = HTTP
[sendemail]
smtpServer = mail.xxx.cn
smtpServerPort = 25
smtpUser = gerrit@xxx.com.cn
smtpPass = gerrit_admin // Gerrit默认不保存邮箱明文密码,可手动在配置文件中添加
from = gerrit@xxx.com.cn // 可手动设置邮件中的from信息
[container]
user = root
javaHome = /usr/lib/jvm/java-8-openjdk-amd64/jre
[sshd]
listenAddress = *:29418
[httpd]
listenUrl = proxy-http://*:8082/
[cache]
directory = cache
  1. 由于gerrit需要配合使用反向代理进行访问,我们选择使用Nginx来提供反向代理服务,nginx.conf配置文件如下:
user    root;
worker_processes 12;
error_log logs/error.log; events {
worker_connections 1024;
} http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server_names_hash_bucket_size 128;
client_header_buffer_size 320k;
client_max_body_size 6g;
large_client_header_buffers 4 64k;
access_log off;
postpone_output 1460;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
tcp_nopush on;
tcp_nodelay on;
limit_conn_zone $binary_remote_addr zone=addr:10m;
gzip on;
gzip_comp_level 9;
gzip_min_length 1024;
gzip_types text/plain text/css application/xml application/javascript;
gzip_vary on;
server_tokens off; server {
listen *:20081;
server_name localhost;
access_log logs/gerrit_access.log;
allow all;
deny all; auth_basic "Welcomme to xxx Gerrit Code Review Site!";
auth_basic_user_file /home/gerrit_site/gerrit.password; location / {
proxy_intercept_errors on;
proxy_pass http://127.0.0.1:8082;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect http://$host:8082 http://$host:$server_port;
break;
}
}
}
  1. 因为安装Gerrit时选择的认证方式是http,所以需要使用反向代理服务器提供的 Authorization 等 HTTP 头来获得用户认证信息,可以使用Apache提供的htpasswd命令在/home/gerrit_2.9.5目录下生成验证文件(Ubuntu系统需安装apache2-utils服务),第一次生成用户信息时需要使用-c参数,后面可使用-m参数来新建用户。如果用户已存在,使用-m参数可修改密码。使用-D参数可删除用户
htpasswd -c /home/gerrit_2.9.5/gerrit.password admin
  1. 此时可通过浏览器访问IP:20081(nginx的端口)地址来访问Gerrit页面,登录时需要使用刚刚创建的admin用户进行登录,Gerrit默认会将第一个登录的用户设置为管理员
  2. 如果在windows电脑或低版本Linux系统上首次clone仓库时,报错no match cipher found.Their offer:diffie-hellman-group1-sha1,则需要在系统下的.ssh目录下创建一个config文件,文件中添加如下内容即可修复
Host *.*.*.*
KexAlgorithms +diffie-hellman-group1-sha1
  1. 如果在高版本Linux系统上(Ubuntu,MacOS)首次clone仓库时,报错 no matching cipher found. Their offer: aes128-cbc,3des-cbc,blowfish-cbc,需要编辑/etc/ssh/ssh_config配置文件,在# Ciphers aes128-ctr,aes192-ctr,aes256-ctr配置行的下面添加一行如下代码即可修复
Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc

2. 升级Gerrit服务


Gerrit服务升级有如下注意事项:

  • 建议逐个版本升级,不要跨版本(例如2.8.1版本最好先升级到2.9.X版本再升级到2.10.X版本)
  • 升级前需关闭当前Gerrit服务,否则数据库连接会报错
  • 升级时建议不要修改数据库类型,与原版本数据库类型保持一致
  • 升级完成后需要重建索引

2.1 示例:Gerrit-2.8.1升级至Gerrit-2.9.5版本 (可以按照如下过程一直升级到 Gerrit 3.x 版本)

  1. 停止运行Gerrit-2.8.1服务(主目录/home/gerrit_site,使用h2数据库),上传2.9.5版本的war包至服务器/home目录下
/home/gerrit_site/bin/gerrit.sh stop
  1. 使用java -jar gerrit-2.9.5.war init -d /home/gerrit_site命令对Gerrit服务进行更新,更新时会出现首次安装时展示的各个配置项,全部选择默认即可,配置完成后会对数据库结构进行更改
root@ubuntu:/home# java -jar gerrit-2.9.5.war init -d /home/gerrit_site

*** Gerrit Code Review 2.9.5
*** *** Git Repositories
*** Location of Git repositories [git]: *** SQL Database
*** Database server type [h2]: ...
... Upgrading schema to 85 ...
Upgrading schema to 86 ...
Upgrading schema to 87 ...
Upgrading schema to 88 ...
Upgrading schema to 89 ...
Upgrading schema to 90 ...
Upgrading schema to 91 ...
Upgrading schema to 92 ...
Upgrading schema to 93 ...
Migrating data to schema 85 ...
Migrating data to schema 86 ...
Migrating data to schema 87 ...
Migrating data to schema 88 ...
Migrating data to schema 89 ...
Migrating data to schema 90 ...
Migrating data to schema 91 ...
Migrating data to schema 92 ...
Migrating data to schema 93 ...
Execute the following SQL to drop unused objects: DROP TABLE tracking_ids;
ALTER TABLE account_groups DROP COLUMN group_type;
ALTER TABLE patch_set_approvals DROP COLUMN change_open;
ALTER TABLE patch_set_approvals DROP COLUMN change_sort_key; Execute now [Y/n]? *** Wrong Primary Key Column Order Detected
*** The following tables are affected:
account_group_by_id_aud, account_group_members_audit, account_patch_reviews, account_project_watches, patch_comments, patch_set_approvals, submodule_subscriptions
Fix primary keys column order [Y/n]?
fixing primary keys...
table: account_group_by_id_aud ... done
table: account_group_members_audit ... done
table: account_patch_reviews ... done
table: account_project_watches ... done
table: patch_comments ... done
table: patch_set_approvals ... done
table: submodule_subscriptions ... done
done
Initialized /home/gerrit_site
  1. 使用java -jar gerrit-2.9.5.war reindex -d /home/gerrit_site命令重新建立索引,否则无法展示change记录(可使用--threads 50来指定线程数加快重建索引的速度),重建索引后启动Gerrit服务即可(注:reindex参数只在2.9.X版本后才可使用,2.8.1中无法使用该参数)

3. H2数据库迁移至MySQL数据库


当前环境中有一个Gerrit-A,版本为2.8.1,安装的时候使用了h2数据库来存储数据,在后续的使用中发现h2数据库在代码量逐渐增多的情况下存在性能瓶颈,需要迁移至MySQL数据库中。以下为迁移的过程以及注意事项:

  1. 迁移h2数据库需要使用h2tomysql_for_gerrit这个工具。该工具中说明需要在2.9.1及以后的版本中使用,所以首先将Gerrit-A版本进行升级,此次我们升级的版本是2.9.5,升级步骤可参考上面的步骤(注意升级时数据库类型不要更改)。升级完成后确保服务是停止运行状态。
  2. 全新安装一个版本为2.9.5的Gerrit-B,安装步骤参考上面的内容(注意数据库需要选择MySQL),安装完成后停止服务运行。
  3. 将Gerrit-A服务下面的git仓库(路径/home/Gerrit-A/git)拷贝一份至Gerrit-B服务git仓库下(路径/home/Gerrit-B/git),注意:不需要拷贝Gerrit-A中的的All-Projects.git项目
  4. 上传h2tomysql_for_gerrit工具包(需提前使用eclipse编译其中的Java文件,然后会生成bin目录),进入h2tomysql_for_gerrit目录后执行:java -cp "bin:lib/*" com.ucweb.gerrit.tools.converter.H2ToMySQLLauncher /home/Gerrit-A/etc/gerrit.config /home/Gerrit-B/etc/gerrit.config。其中/home/Gerrit-A/etc/gerrit.config指向的是Gerrit-A的配置文件位置,该配置文件中包含了h2数据库的地址信息;/home/Gerrit-B/etc/gerrit.config指向的是Gerrit-B的配置文件位置,该配置文件中包含了MySQL数据库的连接信息(需要在该配置文件中手动添加数据库的密码,配置项为password = 密码)
root@ubuntu:/home/h2tomysql_for_gerrit# java -cp "bin:lib/*" com.ucweb.gerrit.tools.converter.H2ToMySQLLauncher /home/Gerrit-A/etc/gerrit.config /home/Gerrit-B/etc/gerrit.config
H2 to MySQL started
Start tranfer database for Gerrit 2.9.1.
Feeding data into account_diff_preferences
Feeding data into account_external_ids
Feeding data into account_group_by_id
Feeding data into account_group_by_id_aud
Feeding data into account_group_members
Feeding data into account_group_members_audit
Feeding data into account_group_names
Fount UUID of admin is 8d4214fe41433f18861cd6ea33764afb5dc74d4b
Feeding data into account_groups
Feeding data into account_patch_reviews
Feeding data into account_project_watches
Feeding data into account_ssh_keys
Feeding data into accounts
Feeding data into change_messages
Feeding data into changes
Feeding data into patch_comments
Feeding data into patch_set_ancestors
Feeding data into patch_set_approvals
Feeding data into patch_sets
Feeding data into schema_version
Feeding data into starred_changes
Feeding data into submodule_subscriptions
Feeding data into system_config
Fixing increment into account_id
Fixing increment into change_id
Fixing increment into change_message_id
Special fix for account_group_id
Special fix for account_id
Special fix for uuid of admin
Done tranfer database data from H2 to MySQL.
REMEMBER to update `groups' file in meta/config tag of `All-Project' to make Administrator UUID correct.
  1. 数据库迁移完成后需要在Gerrit-B的目录中重新建立索引
java -jar gerrit-2.9.5.war reindex -d /home/Gerrit-B
  1. 分别将Gerrit-A和Gerrit-B中的All-Projects.git项目clone到本地,然后将Gerrit-A的All-Projects项目下的groups和project.config文件拷贝到Gerrit-B的All-Projects目录下,并将Gerrit-B的All-Projects项目修改后的内容push到refs/meta/config分支
# 创建两个目录用于下载All-Projects项目
mkdir Gerrit-A Gerrit-B
# 首先下载Gerrit-A中的All-Projects项目
cd Gerrit-A
git clone root@192.168.13.252:/home/Gerrit-A/git/All-Projects.git
# 下载Gerrit-B中的All-Projects项目
cd ../Gerrit-B
git clone root@192.168.13.252:/home/Gerrit-B/git/All-Projects.git
# 将Gerrit-A的All-Projects项目中所有文件复制到Gerrit-B的All-Projects项目中
cp ../Gerrit-A/All-Projects/* All-Projects/
  1. 复制完成后,打开Gerrit-B中All-Projects项目的groups文件(该文件中包含的是Gerrit中已经创建的Group以及对应的uuid,程序会从该文件中获取对应的UUID并到数据库中进行查询以获取用户的信息,如果UUID错误会导致查询用户等功能报错),查看各个group的UUID是否与数据库中account_groups表的信息对应,如果存在差异,需要将groups文件中的UUID改为数据库中展示的UUID。例如:
# 查看当前groups文件中各个group对应的UUID
cat Gerrit-B/All-Projects/groups # UUID Group Name
#
6c0c50eb336b6a1b1128a996b4ce49d7959f47b7 Reviewer
7e98522dfe83a7982c68d1893bf67e2303df3f5f Administrators
9224498d4a1c6418ca791f90ea3e40a20ae129c7 Non-Interactive Users
global:Anonymous-Users Anonymous Users
global:Project-Owners Project Owners
global:Registered-Users Registered Users
# 查看数据库中各个group的UUID
mysql> select name,description,group_uuid,group_id from account_groups;

Gerrit 服务搭建和升级详解(包括 H2 数据库迁移 MySQL 步骤)

  1. 可以看到数据库中Administrators的uuid与groups文件中的UUID有差异,那么就需要将groups文件中Administrators对应的uuid修改为e1a4823e31d4ef2350b2253e84c6c2c772b5d39e,修改完成后进行提交
root@ubuntu:/home# git add -A
root@ubuntu:/home# git commit -m "修改groups文件UUID值"
[detached HEAD 99789e0] 修改groups文件UUID值
2 files changed, 19 insertions(+), 6 deletions(-)
root@ubuntu:/home# git push origin HEAD:refs/meta/config
Counting objects: 4, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 693 bytes | 693.00 KiB/s, done.
Total 4 (delta 2), reused 0 (delta 0)
To 192.168.13.252:/home/gerrit_2.9.5/git/All-Projects.git
a1055f7..99789e0 HEAD -> refs/meta/config
  1. 此时代表数据迁移完成,启动Gerrit-B即可正常访问。但是存在一个问题,升级至2.9.5版本并将数据迁移至MySQL后,在页面中点击Owner来查找该用户的所有提交记录时,如果Owner为中文就会报错User not found,但是目前还未查到具体的原因(只限于2.9.5使用MySQL数据库会有这种情况,如果2.9.5版本使用h2数据库可以正常查询,2.8.1版本中未测试使用MySQL的情况下是否正常),该问题可以通过升级版本来进行解决(当前测试升级至2.10.8可以解决该问题)