Gerrit 2.16管理员帐号丢失的一次处理
接手别人的几个项目,项目管理在gerrit上,由于中途经过多次转手,管理员帐号已经丢失。
服务器在手,但大家都只能得到普通用户权限。
因此目标是拿到Administrators群组的权限,即,将一个帐号加入此群组。
基本信息:
Gerrit版本:2.16.7
Gerrit认证方式:LDAP
Gerrit数据库存储方式:H2
Gerrit安装在:/data/gerrit/gerrit_app
Gerrit仓库位于:/data/gerrit/gerrit_app/git/repositories
前期走了很多弯路,因为网络上的资料大多是2.4版本,都是指导让登陆gsql,在数据库中去操作。
停掉Gerrit服务后,手工登陆进gsql,完全找不到要操作的诸如accounts、account_group_by_id等表。来回折腾很久还是搞不定。
最近随着Gerrit了解的深入,看到Gerrit的版本日志提到,2.15版本将account表已经转为NoteDB,2.16版本将group表转为NoteDB。
这才恍然大悟,转向搜索gerrit notedb的资料搜索。
找到如下网页信息参考:
https://blog.nanpuyue.com/2018/044.html
虽然上文,操作的是迁移登陆插件,但其基本原因是大致相同的。
最终一顿操作猛如虎,终究搞定这个难题。
原理大致是,NoteDB实际在后台会是一个Git仓库,直接从Git仓库中Clone出数据来,然后修改相应Groups下的信息,提交上去,就OK了。
在Gerrit文档中/Documentation/config-groups.html有groups的一些操作说明。
如下命令均是在Gerrit服务器上直接执行的。
第0步,停止gerrit服务
/data/gerrit/gerrit_app/bin/gerrit.sh stop
第一步,克隆出All-Users仓库
git clone /data/gerrit/gerrit_app/git/repositories/All-Users.git
这儿的克隆命令实际为从裸仓库克隆出一个工作仓库出来。
第二步,从All-Users/groups中得到Administrators群组的UUID
第三步,修改当前工作仓库的指向
cd All-Users git fetch origin refs/groups/f4/f417bd0437a0e6f7e08885d07626b0698b4ecec2:refs/groups/f4/f417bd0437a0e6f7e08885d07626b0698b4ecec2
如果当前工作仓库是由root用户创建,则git命令前,应添加sudo
第四步,取出当前指向的内容。
git checkout refs/groups/f4/f417bd0437a0e6f7e08885d07626b0698b4ecec2
此时,All-Users取得就是gerrit文档中所说的groups的信息(即Administrators群组下的信息)
可以看到,没有subgroups,而members信息即为我们要修改的文件。
vim打开后,将一个新用户的id插入在末尾(此ID通常是10000打头)。
修改好后,保存,准备提交。
第五步,add并commit
git add . git commit -m"xxxx"
第六步,更新引用
git update-ref refs/groups/f4/f417bd0437a0e6f7e08885d07626b0698b4ecec2 $(git rev-parse HEAD)
第七步,推上修改至仓库
git push origin refs/groups/f4/f417bd0437a0e6f7e08885d07626b0698b4ecec2
至此,重新启动Gerrit服务,新用户就添加进了Administrators群组了。
PS,用户ID的信息取得。
首先用户应是Gerrit中已注册的一个用户,在用户的Groups页面,任一群组里打开相应的Audit Log,即可看到相应用户的Id
比如: