gerrit 升级记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Miss_yuan/article/details/79142897

公司的gerrit服务器使用的版本实在太低了,2.1.8版本,导致很多新的特性和插件都无法使用(比如tag删除的功能,网页中进行cherrypick等等),所以决定进行升级。

因为原先的gerrit已经用了很多年了,里面git仓库奇多无比,为了保险起见,升级前需要把 gerrit-site 目录完全备份。

首先关闭当前gerrit服务,然后直接运行新版本gerrit.war的init (这里选用的是2.14.2版本)

gerrit@server:~$ gerrit-site/bin/gerrit.sh stop
gerrit@server:~$ java -jar gerrit-2.14.2.war init -d gerrit-site

过程中,会自动读取原先版本内的配置项,无需修改一路回车,到达plugins选项时全部选择Y
运行…失败提示

Exception in thread "main" com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Upgrade first to 2.8 or 2.9

1 error
        at com.google.gerrit.server.schema.Schema_83$1.get(Schema_83.java:29)
        at com.google.gerrit.server.schema.Schema_83$1.get(Schema_83.java:26)
        at com.google.gerrit.server.schema.SchemaVersion.pending(SchemaVersion.java:118)
        at com.google.gerrit.server.schema.SchemaVersion.upgradeFrom(SchemaVersion.java:90)
        ...
        ...
        at com.google.gerrit.launcher.GerritLauncher.mainImpl(GerritLauncher.java:108)
        at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:63)
        at Main.main(Main.java:24)

看来步子迈大了- -! 重新找到 2.8 版本

gerrit@server:~$ java -jar gerrit-2.8.war init -d gerrit-site
...
...
Upgrading schema to 84 ...
Migrating data to schema 53 ...
Exception in thread "main" com.google.gwtorm.server.OrmException: Cannot create repository leadcore1.0.0/
        at com.google.gerrit.server.schema.Schema_53.exportProjectConfig(Schema_53.java:169)
        ...
        ...
        at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:52)
        at Main.main(Main.java:25)
Caused by: org.eclipse.jgit.errors.RepositoryNotFoundException: repository not found: Invalid name: leadcore1.0.0/
        at com.google.gerrit.server.git.LocalDiskRepositoryManager.createRepository(LocalDiskRepositoryManager.java:200)
        at com.google.gerrit.server.schema.Schema_53.exportProjectConfig(Schema_53.java:167)
        ... 16 more

我觉这个问题不是每个人都会遇到
查了一下gerrit/git/下面,存在 leadcore1.0.0/ 目录,该目录下是一些项目的git仓库。 但leadcore1.0.0本身并不是 git仓库呀。
不知道为啥gerrit把这个东西当作git仓库了。
查代码:

  private void exportProjectConfig(ReviewDb db) throws OrmException,
      SQLException {
    Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM projects ORDER BY name");
    while (rs.next()) {
      final String name = rs.getString("name");
      final Project.NameKey nameKey = new Project.NameKey(name);

      Repository git;
      try {
        git = mgr.openRepository(nameKey);
      } catch (RepositoryNotFoundException notFound) {
        // A repository may be missing if this project existed only to store
        // inheritable permissions. For example 'All-Projects'.
        try {
          git = mgr.createRepository(nameKey);
        } catch (IOException err) {
          throw new OrmException("Cannot create repository " + name, err);
        }
      } catch (IOException e) {
        throw new OrmException(e);
      }

原来读取了projects 这个表,看来leadcore1.0.0这东西在这个表里。
(突然想到照成该问题的可能原因,本来有leadcore1.0.0这个仓库,但是之前同事,想删除掉该仓库,并以此为目录,在下面建立其他仓库,然后就直接把leadcore1.0.0下面的内容删除了,但是数据库projects表里并没有删除。)

想了几个办法。
1.修改gerrit源码,自己编译,跳过这个错误。简单搞了一下没build过去。
2. 删除这个git仓库,但是发现gerrit网页里并没有这个功能,网上查了查,有delete-project plugins这个东西,但是低版本不支持。
3. 想着直接从数据库里把这东西删除掉。找了一个办法:

gerrit@server:~$ java -jar gerrit-2.1.8.war gsql -d gerrit-site
>delete from projects where name='leadcore1.0.0';
>delete from ref_rights where project_name='leadcore1.0.0';

测试后发现还是不行~
网上查找资料,看到说2.2版本开始就不使用projects表了。
所以尝试从2.1.8先升级到2.2版本,下载了个2.2.1的war包,升级后果然没这个问题了。
但是出现个新问题

Upgrading database schema from version 52 to 53 ...
Upgrading database schema from version 53 to 54 ...
Upgrading database schema from version 54 to 55 ...
Renaming "-- All Projects --" to "All-Projects"
Exception in thread "main" com.google.gwtorm.client.OrmException: Cannot rename /home/gerrit/gerrit-site/git/-- All Projects --.git to /home/gerrit/gerrit-site/All-Projects.git
        at com.google.gerrit.server.schema.Schema_55.migrateData(Schema_55.java:53)
        at com.google.gerrit.server.schema.SchemaVersion.upgradeFrom(SchemaVersion.java:95)
		...
        at com.google.gerrit.launcher.GerritLauncher.mainImpl(GerritLauncher.java:89)
        at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:47)
        at Main.main(Main.java:25)

– All Projects --.git 这个git仓库应该是新生成的,要更名为All-Projects.git,但是原本已经存在这个目录了,所以失败。(如果直接配置使用2.1.8版本的话,应该是不会自动生成All-Projects.git这个东西的,这东西怎么来的还不清楚)
最终,我是直接删除了现有的All-Projects.git目录解决的。(All-Projects.git包含了一些git仓库公共属性,我这样做可能不太稳妥,但是升级完也没发现什么问题。就暂且这样了)

之后再从2.2.1升级到2.8,也是没问题的。
然后当在想从2.8 升级到更高的版本,也是可以成功的,最稳妥的方式,就是一个大版本一个大版本的升级。

从2.8升级到2.9之后,直接启动gerrit会报错。查看 gerrit-site/logs/error_log

[2018-01-23 17:37:05,858] ERROR com.google.gerrit.pgm.Daemon : Unable to start daemon
com.google.inject.ProvisionException: Guice provision errors:

1) No index versions ready; run Reindex

1 error
        at com.google.gerrit.lucene.LuceneVersionManager.start(LuceneVersionManager.java:145)
        at com.google.gerrit.lifecycle.LifecycleManager.start(LifecycleManager.java:74)
		...
        at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:52)
        at Main.main(Main.java:25)

解决方式是进行reindex:

gerrit@server:~$ java -jar gerrit-2.9.war reindex -d gerrit-site
[2018-01-23 17:57:08,788] INFO  com.google.gerrit.server.git.LocalDiskRepositoryManager : Defaulting core.streamFileThreshold to 215m
[2018-01-23 17:57:08,996] INFO  com.google.gerrit.server.cache.h2.H2CacheFactory : Enabling disk cache /home/gerrit/gerrit-site/cache
Collecting projects:    1
Reindexing changes: projects: 100% (1/1), 100% (1/1), done
Reindexed 1 changes in 0.3s (3.7/s)

重新启动gerrit可以成功。

但是从2.9版本开始我遇到了一个问题。
那就是新增加用户的时候,新用户注册email,不能使用内部邮箱的TLD后缀了。因为在2.9版本开始,gerrit增加了TLDs的检测,不满足匹配的话。
就会报错 “Code Review - Error” “invalid email address”
这里写图片描述

查了了一些资料,感觉这个问题除非是自己修改gerrit对应代码,把这和验证流程去掉,或者把自己内部的TLDs增加到列表里,别无他法了。
相关问题mail list和修改方式可以参考:
https://bugs.chromium.org/p/gerrit/issues/detail?id=4332
https://gerrit-review.googlesource.com/c/gerrit/+/80961

暂时使用gerrit 2.8版本,基本可以满足需求。
有空再继续搞一下gerrit的build,毕竟新版本的gerrit各种插件越来越丰富,使用更加方便。

猜你喜欢

转载自blog.csdn.net/Miss_yuan/article/details/79142897
今日推荐