• Gerrit | 重磅! 2.x 版本升级到 3.x 版本----转


    Gerrit | 重磅! 2.x 版本升级到 3.x 版本

    为什么要做版本升级?

    2.x known bugs

    重大问题不一一列举,这里仅仅是举几个例子:

    • 安全或权限问题:普通用户能看到敏感数据,例如看到其他用户的 hashed api 密码,

    问题传送门:https://bugs.chromium.org/p/gerrit/issues/detail?id=13514

    3.0 的重大更新

    • ReviewDB 寿终正寝,NoteDB 上台
    • UI 界面全面更新,GWT 被 PolyGerrit 取代
    • 支持 REST-API
    • 其他重大更新,等等

    新版本大概长这样

    升级 Migration 实操记录

    目前待升级的 gerrit 版本为 2.13.9,根据官方文档,必须确保每个中间版本都被升级,所以升级路线暂定为:

    1. 2.13 -- 2.14 -- 2.15 -- 2.16
    2. 到了 2.16 后将review DB 迁移到NoteDB
    3. 迁移 2.16 到 3.0

    注意:v2.16是唯一包含和支持 reviewDB 到 NoteDB 的关键版本

    Reference Doc:https://gitenterprise.me/2019/05/20/gerrit-v3-0-is-here/

    提前测试

    测试原版 gerrit 升级路径,不携带任何数据,为的是快速探索成功路径

    升级路径:2.13.9 -- 2.15.21 -- 2.16.25 -- 3.2.3

    s0:升级前,确认 gerrit 的 replication 和 HA 的插件和配置文件,被禁用(可移走或重命名)

    s1:起点版本 2.13.9

    $ java -jar gerrit-2.13.9.war init --batch --dev -d gerrit_test

    s2:升级到 2.15.21

    $ java -jar gerrit-2.15.21.war init --batch --dev -d gerrit_test

    $ java -jar gerrit-2.15.21.war reindex --index groups -d gerrit_test

    $ java -jar gerrit-2.15.21.war reindex --index accounts -d gerrit_test

    $ java -jar gerrit-2.15.21.war reindex --index changes -d gerrit_test

    执行以上三步,gerrit 服务才能启动成功

    其中第三步 reindex,耗时较长,可以先 skip ,升级到 3.x 再做

    s3:升级到 2.16.25

    $ java -jar gerrit-2.16.25.war init --batch --dev -d gerrit_test

    直接启动 gerrit 可以成功

    s4:升级 3.x 之前,将 jdk 11 下载解压,并加入到 环境变量中,source

    $ java -version

    openjdk version "11.0.9.1" 2020-11-04

    OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9.1+1)

    OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.9.1+1, mixed mode)

    s5:在2.16.25 上进行数据库 migrate

    $ java -jar gerrit-2.16.25.war migrate-to-note-db -d gerrit_test

    可以加上 --reindex false 选择跳过 reindex

    s6:升级到 3.2.3

    $ java -jar gerrit-3.2.3.war init --batch --dev -d gerrit_test

    s7:进行 reindex

    $ java -jar gerrit-3.2.3.war reindex --index accounts -d gerrit_test

    $ java -jar gerrit-3.2.3.war reindex --index changes -d gerrit_test

    启动 gerrit 服务,启动 OK, awsome!!


    验证一下:

    $ curl localhost:29418

    SSH-2.0-GerritCodeReview_3.2.3 (APACHE-SSHD-2.4.0)

    Unsupported protocol version: GET / HTTP/1.1

    到此基本的操作步骤都涵盖在上面了,分割线以下,是我的实际操作日志,仅供参考。

    如果有任何问题,可私信咨询。


    实际 Tips

    • 升级前的准备

    检查 gerrit.config

    [cache "diff"]

    timeout = 200ms # 减少timeout 提升整体 reindex 速度

    • 导入数据

    进入 MySQL : set GLOBAL max_connections=1000;

    本地搭建 mysql, 并导入数据

    mysql -u username -p < ...sql脚本.sql ,

    例如

    $ mysql -u gerrit_rw -p --verbose < c3-inf-gerrit-db01.bj.sql

    • 拷贝 线上的 gerrit 目录并停掉 gerrit 的 HA 和 replication,然后修改 gerrit.config 的 database 为本地数据库配置

    [database]

    type = mysql

    hostname = localhost

    database = xxx

    username = x

    password = x

    port = 3306

    useSSL = false

    [auth] type = DEVELOPMENT_BECOME_ANY_ACCOUNT

    • 同步线上代码

    $ ssh -p 29418 gerrit@localhost replication start --url 目标地址 --all

    • 2.13 --> 2.14

    #停止 gerrit 服务

    java -jar gerrit-2.14.22.war init --batch --dev -d ${gerrit-site}

    1. Get an error
    2. Exception in thread "main" java.nio.file.NoSuchFileException: gerrit/ha/1/gerrit/shared
    3. 解决方式:去掉或重命名etc目录下的 ha config 和 replication config ,去掉 plugins 文件下的 ha 和 replication 的 jar 包
    4. 这一步也可以在执行 升级命令 之前完成

    继续上面的 java 命令

    $ java -jar gerrit-2.14.22.war init --batch --dev -d ${gerrit-site}

    Upgrading schema to 130 ...

    Upgrading schema to 131 ...

    Upgrading schema to 132 ...

    迁移正常的打印信息为:

    Migrating 5263 repositories ...

    Migration completed: 3 repositories updated:

    All-Projects platform/packages/apps/ContactsCommon platform/packages/apps/OneAccountSdk

    > Done (44.769 s)

    Migrating data to schema 131 ...

    Migrating 5263 repositories ...

    Migration completed: 16 repositories updated:

    ... ... ...

    Migrating data to schema 141 ...

    > Done (0.022 s)

    Migrating data to schema 142 ...

    > Done (137.173 s)

    Execute the following SQL to drop unused objects:

    ... ... ...

    Initialized /home/work/gerrit

    报错:直接启动 gerrit 服务会失败:No index versions ready;

    解决方式:进行 reindex 操作

    $ java -jar gerrit-2.14.22.war reindex --index groups -d ${gerrit-site}

    ... ... ...

    Finishing 5 disk cache updates

    启动 gerrit 服务, 查看升级后的版本

    $ curl localhost:29418

    SSH-2.0-GerritCodeReview_2.14.22 (SSHD-CORE-1.4.0)

    Unsupported protocol version: GET / HTTP/1.1

    或者查看一下新UI 左下角的版本信息(2.14.22)

    • 继续下一步:2.14 --> 2.15

    migration to 2.15 与上述内容基本一致

    $ java -jar gerrit-2.15.21.war init --batch --dev -d ${gerrit-site}

    Upgrading schema to 143 ...

    Upgrading schema to 144 ...

    ... ... ...

    Initialized /home/work/gerrit

    这一步想偷懒不做 reindex,但是失败了

    No index versions for index 'changes' ready;

    run java -jar /home/work/gerrit/bin/gerrit.war reindex --index changes

    先升级到 3.2.3 再做 reindex

    • 下一步:2.15 --> 2.16

    $ java -jar gerrit-2.16.25.war init --batch --dev -d ${gerrit-site}

    $ java -jar gerrit-2.16.25.war reindex --index projects -d ${gerrit-site}

    $ java -jar gerrit-2.16.25.war reindex --index groups -d ${gerrit-site}

    $ java -jar gerrit-2.16.25.war reindex --index changes -d ${gerrit-site}

    注意这一步可能会耗时很久, 取决于Gerrit上change的数量大小

    • 启动 gerrit 服务

    $ curl localhost:29418

    SSH-2.0-GerritCodeReview_2.16.25 (SSHD-CORE-2.0.0)

    Unsupported protocol version: GET / HTTP/1.1

    • 继续下一步:2.16 --> 3.0

    出现错误ERROR com.google.gerrit.pgm.init.BaseInit : Couldn't upgrade schema. Expected if slave and read-only database

    com.google.gerrit.exceptions.StorageException: You appear to be upgrading from a 2.x site, but the NoteDb change migration was not completed. See documentation:

    https://gerrit-review.googlesource.com/Documentation/note-db.html#migration

    根据文档,必须先进行 NoteDB 迁移

    $ java -jar gerrit-2.16.25.war migrate-to-note-db -d ${gerrit-site}

    这一步报错了: failed on some changes ,see log

    于是需要把 失败的 changid 的相关信息从数据库里删除掉;

    # 举一个changeid 的例子

    use database_name;

    delete from patch_sets where change_id=183663;

    delete from patch_set_approvals where change_id=183663;

    delete from patch_comments where change_id=183663;

    delete from changes where change_id=183663;

    delete from change_messages where change_id=183663;

    delete from change_id where s=183663;

    ... ... ...

    执行完后,继续进行 migrate


    • 为了提升效(偷)率(懒),写了个自动化脚本

    接受命令行输入参数的脚本

    1. #!/bin/bash
    2. #
    3. #********************************************************************
    4. #Author: 奈文摩尔
    5. #ID: xxxxx
    6. #Created: 2021-02-02
    7. #Modified: 2021-02-04 10:27:27
    8. #Email:
    9. #Description: Upgrade gerrit from 2.x to 3.x
    10. #Copyright (C): 2021 All rights reserved
    11. #********************************************************************
    12. # run as work
    13. # Input Paras :
    14. # 1:gerrit folder (local path)
    15. # 2:dumped sql script (local path)
    16. # 3:remote mysql host/port/user/password
    17. ``` Example:
    18. bash gerrit_upgrate.sh -g /home/work/gerrit -d /home/work/gerrit/c3-inf-gerrit-db01.bj.sql -h 10.172.28.40 -p 3315 -u root -w 123456
    19. ```
    20. set -e
    21. if [ ! -n "$1" ] ;then
    22. echo "invalid input , bash xxx -help to get demo"
    23. exit -1
    24. fi
    25. if [[ $1 = "--help" ]] || [[ $1 = "-h" ]]
    26. then
    27. echo "
    28. ----------------------------------------------------
    29. -g gerrit folder path
    30. -d dump sql script path
    31. -h mysql host name
    32. -p mysql host port
    33. -u mysql login username
    34. -w mysql username password
    35. Example:
    36. bash gerrit_upgrate.sh -g /home/work/gerrit -d /home/work/gerrit/c3-inf-gerrit-db01.bj.sql -h 10.172.28.40 -p 3315 -u root -w 123456
    37. -----------------------------------------------------
    38. "
    39. exit 0
    40. fi
    41. while getopts "g:d:h:p:u:w:" opt; do
    42. case $opt in
    43. g)
    44. GERRIT_SITE=$OPTARG
    45. echo "GERRIT_SITE is $GERRIT_SITE" ;;
    46. d)
    47. DUMP_SQL=$OPTARG
    48. echo "DUMP_SQL is $DUMP_SQL" ;;
    49. h)
    50. DB_HOST=$OPTARG
    51. echo "DB_HOST is $DB_HOST" ;;
    52. p)
    53. DB_PORT=$OPTARG
    54. echo "DB_PORT is $DB_PORT" ;;
    55. u)
    56. DB_USER=$OPTARG
    57. echo "DB_USER is $DB_USER" ;;
    58. w)
    59. DB_PWD=$OPTARG
    60. echo "DB_PWD is $DB_PWD" ;;
    61. \?)
    62. echo "invalid arg" ;;
    63. esac
    64. done
    65. # step 0 : modify gerrit.config
    66. cd ${GERRIT_SITE}/etc/
    67. if [ -f gerrit.config ]; then
    68. mv gerrit.config gerrit-bak.config
    69. fi
    70. if [ -f secure.config ]; then
    71. mv secure.config secure-bak.config
    72. fi
    73. wget https://staging-cnbj2-fds.api.zzz.net/files/gerrit.config
    74. wget https://staging-cnbj2-fds.api.zzz.net/files/secure.config
    75. JDBC_STR="jdbc:mysql://${DB_HOST}:${DB_PORT}/reviewmiui?autoReconnect=true&characterEncoding=UTF-8&useSSL=false"
    76. sed -i "0,/hostname =/{s/hostname =.*/hostname = ${DB_HOST}/}" gerrit.config
    77. sed -i "0,/username =/{s/username =.*/username = ${DB_USER}/}" gerrit.config
    78. sed -i "0,/password =/{s/password =.*/password = ${DB_PWD}/}" gerrit.config
    79. sed -i "0,/port =/{s/port =.*/port = ${DB_PORT}/}" gerrit.config
    80. sed -i "/url = /c\ url = jdbc:mysql://${DB_HOST}:${DB_PORT}/reviewmiui?autoReconnect=true&characterEncoding=UTF-8&useSSL=false" gerrit.config
    81. sed -i "0,/password =/{s/password =.*/password = ${DB_PWD}/}" secure.config
    82. # sed -i "s/hostname =/ hostname = ${DB_HOST}/g" gerrit.config
    83. # sed -i "s/username =/ username = ${DB_USER}/g" gerrit.config
    84. # sed -i "s/password =/ password = ${DB_PWD}/g" gerrit.config
    85. # sed -i "s/port =/ port = ${DB_PORT}/g" gerrit.config
    86. # sed -i "s/url =/ url = ${JDBC_STR}/g" gerrit.config
    87. # sed -i "s/password =*/ password = ${DB_PWD}/g" secure.config
    88. # step 1 : delete replication / hA config
    89. RPC_CONFIG=${GERRIT_SITE}/etc/replication.config
    90. HA_CONFIG=${GERRIT_SITE}/etc/high-availability.config
    91. rm -rf ${RPC_CONFIG}
    92. rm -rf ${HA_CONFIG}
    93. # delete confirm
    94. if [ -f "${RPC_CONFIG}"] || [ -f "${HA_CONFIG}" ];
    95. then
    96. echo "config file delete failed: ${RPC_CONFIG} or ${HA_CONFIG}"
    97. exit -1
    98. fi
    99. # step 2 : download pkg
    100. cd ${GERRIT_SITE}
    101. cd ..
    102. rm -rf gerrit-*.war
    103. wget https://staging-cnbj2-fds.api.zzzzz.net/files/gerrit-2.15.21.war
    104. wget https://staging-cnbj2-fds.api.zzzzz.net/files/gerrit-2.16.25.war
    105. wget https://staging-cnbj2-fds.api.zzzzz.net/files/gerrit-3.2.3.war
    106. if [ ! -f "delete_dirty_changeids.sql" ]; then
    107. wget https://staging-cnbj2-fds.api.zzzzz.net/files/delete_dirty_changeids.sql
    108. fi
    109. # step 3 : Loading dump data into DB
    110. echo "-------------------- split line ---------------------------"
    111. echo "start loading data :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    112. mysql -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PWD} --verbose < ${DUMP_SQL}
    113. mysql -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PWD} --verbose < delete_dirty_changeids.sql
    114. # step 4 : upgrate from 2.13 --> 2.15
    115. echo "start 2.15 :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    116. cd ${GERRIT_SITE}/lib
    117. wget https:///mysql-connector-java-5.1.43.jar
    118. mkdir -p ${GERRIT_SITE}/ha/1/gerrit/shared
    119. cd -
    120. java -jar gerrit-2.15.21.war init --batch --dev -d ${GERRIT_SITE}
    121. # step 5 : upgrate from 2.15 --> 2.16
    122. echo "start 2.16 :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    123. cd ${GERRIT_SITE}/lib
    124. wget https://staging-cnbj2-fds.api.zzzzz.net/files/mysql-connector-java-5.1.48.jar
    125. cd -
    126. java -jar gerrit-2.16.25.war init --batch --dev -d ${GERRIT_SITE}
    127. # step 6 : migrate on 2.16
    128. echo "start migrate :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    129. rm -rf ${GERRIT_SITE}/etc/notedb.config
    130. nohup java -jar gerrit-2.16.25.war migrate-to-note-db --reindex false -d ${GERRIT_SITE} > mi.log 2>&1 &
    131. while true
    132. do
    133. echo "Waiting for NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")"
    134. if test ! -z "$(tail -n 20 mi.log | grep 'NoteDB Migration complete.')"; then
    135. echo "NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    136. break
    137. fi
    138. if test ! -z "$(tail -n 20 mi.log | grep 'fatal: Migrating primary storage for some changes failed, see log')"; then
    139. echo "fatal: Migrating primary storage for some changes failed, see log: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    140. exit -1
    141. fi
    142. sleep 1m
    143. done
    144. # step 7 : upgrate from 2.16 --> 3.2.3
    145. echo "start 3.2.3 : $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    146. java -jar gerrit-3.2.3.war init --batch --dev -d ${GERRIT_SITE}
    147. # step 8 : reindex on 3.2.3
    148. echo "Reindex accounts : $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    149. java -jar gerrit-3.2.3.war reindex --index accounts -d ${GERRIT_SITE}
    150. echo "Reindex changes : $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    151. nohup java -jar gerrit-3.2.3.war reindex --index changes -d ${GERRIT_SITE} > "reindex-$(date "+%Y-%m-%d-%H-%M-%S").log" 2>&1 &

    可固定参数的脚本:

    1. #!/bin/bash
    2. set -e
    3. export GERRIT_SITE=/home/work/hdd1/gerrit_odm
    4. cd ${GERRIT_SITE}/lib
    5. rm -rf ${GERRIT_SITE}/lib/*
    6. wget https://staging-cnbj2-fds.api.xiaomi.net/files/mysql-connector-java-5.1.43.jar
    7. cd /home/work/hdd1
    8. echo "start 2.15 :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    9. java -jar gerrit-2.15.21.war init --batch --dev -d ${GERRIT_SITE}
    10. cd ${GERRIT_SITE}/lib
    11. rm -rf ${GERRIT_SITE}/lib/*
    12. wget https://staging-cnbj2-fds.api.xiaomi.net/files/mysql-connector-java-5.1.48.jar
    13. cd -
    14. echo "start 2.16 :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    15. java -jar gerrit-2.16.25.war init --batch --dev -d ${GERRIT_SITE}
    16. echo "start migrate :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    17. nohup java -jar gerrit-2.16.25.war migrate-to-note-db --reindex false -d ${GERRIT_SITE} > mi.log 2>&1 &
    18. while true
    19. do
    20. echo "Waiting for NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")"
    21. if test ! -z "$(tail -n 20 mi.log | grep 'NoteDB Migration complete.')"; then
    22. echo "NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    23. break
    24. fi
    25. if test ! -z "$(tail -n 20 mi.log | grep 'fatal: Migrating primary storage for some changes failed, see log')"; then
    26. echo "fatal: Migrating primary storage for some changes failed, see log: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
    27. exit -1
    28. fi
    29. sleep 1m
    30. done

    编辑于 2021-05-13 11:47

  • 相关阅读:
    ElasticSearch学习笔记:内容有点多,但很实用(包含安装、使用、安全、部署)
    3.测试教程 - 基础篇
    蓝桥杯 题库 简单 每日十题 day5
    自己亲手打造的VS Code里写AsciiDoc的快捷模板Snippet文件
    事务的特性-原子性(Atomicity)、一致性(Consistency)、隔离性(Asolation)、持久性(Durability)
    什么是文档测试你知道吗?
    品牌线上控价,如何平台投诉
    网络安全(黑客)技术——自学2024
    一次简单易懂的多态重构实践,让你理解条件逻辑
    内存虚拟化技术-POD和Ballooning
  • 原文地址:https://blog.csdn.net/bubudezhuren/article/details/134074335