插件准备
Gerrit安装时,init可以默认安装自带的一些插件,但是我们也安装了其他插件:reviewers.jar
Gerrit不同版本,插件也互不兼容,需要下载对应版本的插件。
Gerrit3.9.9 reviewers.jar下载地址(外网打开):https://gerrit-ci.gerritforge.com/view/Plugins-stable-3.9/job/plugin-reviewers-bazel-stable-3.9/lastSuccessfulBuild/artifact/bazel-bin/plugins/reviewers/reviewers.jar
ai-code-review插件:https://gerrit-ci.gerritforge.com/job/plugin-ai-code-review-mvn-stable-3.9/lastSuccessfulBuild/artifact/target/ai-code-review-3.9.0.jar
不过实际我并没有用这个jar包,这个是后来升级完Gerrit,找有哪些插件可以用用时,才发现直接就有这个插件,白白自己花时间编译了一把。
插件源码地址:https://gerrit.googlesource.com/plugins/ai-code-review/
clone之后,用的stable-3.8分支自己在本地编译的,根据pom.xml,要求是Java17版本来编译。
后来下载了Gerrit上的3.9.0.jar版本,发现插件可以加载,但是不能comment到Gerrit上去,也就换回自己编的了。
这是Gerrit最近四个版本的插件下载地址:https://gerrit-ci.gerritforge.com/
对于之前的版本插件下载地址:https://archive-ci.gerritforge.com/view/
网上和ai都说,Gerrit跨大版本升级,最好一级一级的升,不要直接升到高版本,实际操作起来,发现2.16.28直接升到3.9.9是ok的。
Gerrit war包下载
3.3.9包下载(外网):
https://www.gerritcodereview.com/releases-readme.html
https://gerrit-releases.storage.googleapis.com/gerrit-3.9.9.war
升级过程
1,备份2.16.28数据,我是通过rync传输到其他服务器,6T的数据,耗时大概十几个小时。
2,开始升级时,一定要停服,因为数据库需要升级,不支持热升级,否则会出现以下报错:
3,如果自己是半路接手的Gerrit,问下之前的负责的同事,git/目录下有没有手动备份过仓库,这边同事备份仓库数据,直接在git/目录下copy目录再改的名字,加了"_bak"之类的跟正式仓库做了区分,升级完Gerrit上出现了一堆这样的仓库,Gerrit reindex操作,会重新index一遍仓库数据,只要是git仓库,不管名字是啥,是不是.git标准后缀,都会index一下,特别耗时。发现有的备份仓库,还报错unknown commit,影响升级。所以提前确认下,升级之前先将备份仓库mv出去,减少升级总时间。
4,准备完毕就可以开始升级了,晚上搜到的升级流程都差不多,先init再reindex再启动
数据库升级
bin/gerrit.sh stop之后,清理日志和插件目录比避免冲突,再进行数据库升级
rm -rf logs/* plugins/*
2.16+ 版本使用 NoteDB 替代 PostgreSQL 存储变更数据,需执行迁移命令。
changes数据在此数据库,需要手动迁移
需要用Java 8 来进行数据库升级,否则会报错
根据服务器实际Java版本,如果默认是1.8,则不用指定,否则需要指定Java版本
–threads 8 是指定多少线程,默认是1,根据服务器的CPU核数来指定,这边服务器是32核的,没有部署其他应用,所以用了24个线程,耗时忘记了,蛮久的,好几个小时。
jdk1.8.0_321/bin/java -jar gerrit/bin/gerrit.war migrate-to-note-db --threads 24 -d gerrit/
[2025-04-15 10:11:43,748] [main] INFO com.google.gerrit.server.git.LocalDiskRepositoryManager : Defaulting core.streamFileThreshold to 1783m
[2025-04-15 10:11:44,310] [main] INFO com.google.gerrit.server.cache.h2.H2CacheFactory : Enabling disk cache /review_site/gerrit/cache
[2025-04-15 10:11:44,361] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'WorkQueue' queue
[2025-04-15 10:11:44,365] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'ReceiveCommits' queue
[2025-04-15 10:11:44,366] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'SendEmail' queue
[2025-04-15 10:11:44,582] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'Index-Interactive' queue
[2025-04-15 10:11:44,584] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'Index-Batch' queue
[2025-04-15 10:11:44,591] [main] INFO com.google.gerrit.server.rules.PrologEnvironment : reductionLimit: 100000, compileLimit: 1000000
[2025-04-15 10:11:44,774] [main] INFO com.google.gerrit.server.plugins.PluginLoader : Loading plugins from /review_site/gerrit/plugins
[2025-04-15 10:11:44,789] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'RebuildChange' queue
[2025-04-15 10:11:44,814] [main] INFO com.google.gerrit.server.config.ScheduleConfig : No schedule configuration for "gc".
[2025-04-15 10:11:44,815] [main] INFO com.google.gerrit.server.git.GarbageCollection : [All-Users] gc config: gc.aggressive=false;
[2025-04-15 10:11:44,816] [main] INFO com.google.gerrit.server.git.GarbageCollection : [All-Users] pack config: maxDeltaDepth=50, deltaSearchWindowSize=10, deltaSearchMemoryLimit=0, deltaCacheSize=52428800, deltaCacheLimit=100, compressionLevel=-1, indexVersion=2, bigFileThreshold=52428800, threads=0, reuseDeltas=true, reuseObjects=true, deltaCompress=true, buildBitmaps=true, bitmapContiguousCommitCount=100, bitmapRecentCommitCount=20000, bitmapRecentCommitSpan=100, bitmapDistantCommitSpan=5000, bitmapExcessiveBranchCount=100, bitmapInactiveBranchAge=90, singlePack=false
[2025-04-15 10:11:44,849] [main] INFO com.google.gerrit.server.git.GarbageCollection : [All-Users] before: sizeOfPackedObjects=0, sizeOfLooseObjects=7956, numberOfPackedObjects=0, numberOfPackFiles=0, numberOfPackedRefs=5, numberOfLooseRefs=6, numberOfLooseObjects=58
collecting garbage for "All-Users":
Pack refs: 100% (10/10)
Counting objects: 55
Finding sources: 100% (55/55)
Getting sizes: 100% (37/37)
Compressing objects: 100% (5115/5115)
Writing objects: 100% (55/55)
Selecting commits: 100% (18/18)
Building bitmaps: 100% (18/18)
Prune loose objects also found in pack files: 100% (53/53)
Prune loose, unreferenced objects: 100% (53/53)
[2025-04-15 10:11:45,018] [main] INFO com.google.gerrit.server.git.GarbageCollection : [All-Users] after: sizeOfPackedObjects=6389, sizeOfLooseObjects=54, numberOfPackedObjects=55, numberOfPackFiles=1, numberOfPackedRefs=10, numberOfLooseRefs=1, numberOfLooseObjects=3
[2025-04-15 10:11:45,033] [main] INFO com.google.gerrit.server.cache.h2.H2CacheFactory : Finishing 1 disk cache updates
NoteDB Migration complete.
Reindexing changes with:
reindex --site-path gerrit --threads 24 --index changes
[2025-04-15 10:11:45,309] [main] INFO com.google.gerrit.server.git.LocalDiskRepositoryManager : Defaulting core.streamFileThreshold to 1783m
[2025-04-15 10:11:45,386] [main] INFO com.google.gerrit.server.cache.h2.H2CacheFactory : Enabling disk cache /review_site/gerrit/cache
[2025-04-15 10:11:45,402] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'WorkQueue' queue
[2025-04-15 10:11:45,402] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'Index-Interactive' queue
[2025-04-15 10:11:45,403] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'Index-Batch' queue
[2025-04-15 10:11:45,415] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'ReceiveCommits' queue
[2025-04-15 10:11:45,415] [main] INFO com.google.gerrit.server.git.WorkQueue : Adding metrics for 'SendEmail' queue
[2025-04-15 10:11:45,420] [main] INFO com.google.gerrit.server.rules.PrologEnvironment : reductionLimit: 100000, compileLimit: 1000000
[2025-04-15 10:11:45,724] [main] INFO com.google.gerrit.server.plugins.PluginLoader : Loading plugins from /review_site/gerrit/plugins
Collecting projects: 6
Reindexing changes: project-slices: 100% (6/6), 100% (5/5), done
Reindexed 5 documents in changes index in 0.3s (16.1/s)
Index changes in version 50 is ready
数据库升级还是顺利的,可以正常升。
数据库升级完毕,修改相关config
etc/notedb.config:
修改前:
[noteDb "changes"]
autoMigrate = false
tial = false
修改后:
[noteDb "changes"]
autoMigrate = false
trial = false
write = true
read = true
sequence = true
primaryStorage = note db
disableReviewDb = true
可以看一下此时Gerrit版本,还是2.16.28
etc/gerrit.config
将javaHome的值换成Java17的地址 ,database的配置可以删了,3.9.9已经不用h2数据库了
javaHome = /usr/local/jdk-17.0.14
ls -la /usr/local/jdk-17.0.14
drwxrwxr-x 9 gerrit gerrit 4096 Apr 17 11:01 .
drwxr-xr-x 21 root root 4096 Apr 17 11:03 ..
drwxrwxr-x 2 gerrit gerrit 4096 Apr 17 11:01 bin
drwxrwxr-x 5 gerrit gerrit 4096 Apr 17 11:01 conf
drwxrwxr-x 3 gerrit gerrit 4096 Apr 17 11:01 include
drwxrwxr-x 2 gerrit gerrit 4096 Apr 17 11:01 jmods
drwxrwxr-x 72 gerrit gerrit 4096 Apr 17 11:01 legal
drwxrwxr-x 5 gerrit gerrit 4096 Apr 17 11:01 lib
lrwxrwxrwx 1 gerrit gerrit 23 Dec 3 19:07 LICENSE -> legal/java.base/LICENSE
drwxrwxr-x 3 gerrit gerrit 4096 Apr 17 11:01 man
-rw-r--r-- 1 gerrit gerrit 290 Dec 3 19:07 README
-rw-r--r-- 1 gerrit gerrit 1273 Dec 3 19:07 release
可以看下此时Gerrit版本,还是2.16.28
jdk1.8.0_321/bin/java -jar gerrit/bin/gerrit.war version
gerrit version 2.16.28
accounts和groups数据
都在数据里面,不用单独管
init gerrit 3.9.9
需要先初始化一下升级目标Gerrit,实际升级过程中,本来先init 和 reindex 3.0.0版本,reindex时候,出现一些错误,看起来不是版本问题,处理起来也需要时间,一夜不够,于是直接init和reindex 3.9.9版本,再处理这些问题。
这个时候就需要Java17版本了:https://www.oracle.com/java/technologies/downloads/#java17
下载jdk-17.0.14_linux-x64_bin.tar.gz包,解压到gerrit 账号可以访问的目录
init初始化不会影响已有的仓库数据,配置也会从配置文件读取,安装目录已有的东西都会再次载入。
/usr/local/jdk-17.0.14/bin/java -jar gerrit-3.9.9.war init --batch --install-all-plugins -d gerrit/
Migrating data to schema 185 ...
Migrating label configurations
... using 16 threads ...
... (0.123 s) Migrated label configurations of all 6 projects to schema 185
Initialized /review_site/gerrit
首次init时候,本来很慢也有报错,然后停掉任务,重新执行init任务,很快就完成了,显示成功。后面Gerrit不能通过gerrit.sh start启动,只能守护模式启动,估计是这个问题,抽空再重新Init一次。
Gerrit会读取gerrit.config的数据,一路回车就可以了
此时可以再看下Gerrit版本,已经变成3.9.9了
/usr/local/jdk-17.0.14/bin/java -jar gerrit/bin/gerrit.war --version
重建Gerrit索引
init完,需要重新索引,使用腾讯元宝,想加速reindex过程,发现它说的很多参数,都不支持,reindex就支持这么四个参数。
rm -rf gerrit/index/*
/usr/local/jdk-17.0.14/bin/java -jar gerrit/bin/gerrit.war reindex --index groups -d gerrit/ --threads 24
/usr/local/jdk-17.0.14/bin/java -jar gerrit/bin/gerrit.war reindex --index accounts -d gerrit/ --threads 24
/usr/local/jdk-17.0.14/bin/java -jar gerrit/gerrit.war reindex --index projects -d gerrit/ --threads 24
/usr/local/jdk-17.0.14/bin/java -jar gerrit/gerrit.war reindex --index changes -d gerrit/ --threads 24
accounts和groups reindex都比较顺利,数据不大,changes和projects都遇到了问题,为了顺利升级,直接把这些failed的仓库和change所在的仓库,先mv到其他地方了,升级完毕再处理。
用的是tmux挂后台升级,tmux记录log方法:
开始记录
tmux pipe-pane -o "cat >> /review_site/master_ori_data_back/tmux_0423.log"
停止记录
tmux pipe-pane
从执行reindex语句开始记录,所有完整log都有了,从而找到failed的仓库和change,然后mv走,再次执行。
终于折腾完毕,bin/gerrit.sh 发现直接failed了,logs/error_log也没有任何数据,然后在腾讯元宝查,以daemon模式挂在tmux里面运行中,不影响大家使用Gerrit,再一个个解决reindex遇到的问题
/usr/local/jdk-17.0.14/bin/java -jar gerrit/bin/gerrit.war daemon -d gerrit/