Skip to content
FangLee edited this page Mar 21, 2022 · 1 revision
                Gerrit集成gitlab

集成简介

Gerrit 本身提供 Code Review和 Git 仓库的两大功能,而且提供了一个框架。可以使用该框架在代码成为代码库的一部分之前对其进行审查和多人合并请求。但实际上很多项目用的是其他的Git仓库,例如GitLab和GitHub。有时候为了使用gerrit的code review的功能不可能把原来的git仓库全部替换成gerrit的管理。

一般情况下,Gerrit位于最终代码库的前面一层,用于代码的人工审核和对CI任务的触发进行验证。即大多情况下我们只利用gerrit强大的code review的管理功能,代码仓还是其他的git仓。

这里以GitLab为例,我们需要的需求如下: gerrit是建立在git版本之上的,基于此gerrit的改变是可以作用到gitlab上的,但是gitlab的变动是不能作用到gerrit上的,它们是一种管理和被管理的关系。因此它们只能是单向的同步 gerrit->gitlab 基于这个逻辑,那么我们将gerrit和gitlab关联起来,然后只维护gerrit的仓就等于同时维护了gitlab的仓库且增加了review和merge功能。

在开始集成前,简单的介绍一下搭建和搭建遇到的问题 因为都是在容器内所以都以容器搭建为例:

Gitlab搭建: docker run -id -p 443:443 -p 80:80 -p 2222:22 --privileged=true -v /opt/data/gitlab/etc:/etc/gitlab -v /opt/data/gitlab/logs:/var/log/gitlab -v /opt/data/gitlab/data:/var/opt/gitlab --name gitlab gitlab/gitlab-ce

Gerrit搭建: 星级最高的镜像:docker.io/openfrontier/gerrit 官方推荐的镜像:docker.io/gerritcodereview/gerrit 这两个镜像虽然都是星级最高的的,只是对仅使用很方便,但是在对集成时就很多限制。 首先是ssh服务,因为要进行两个服务的互信,所以都需要配置ssh,但是上述镜像都是AUTO的,所以他们的容器内PID为1的并不是SYSTEMCTL,而是gerrit进程,所以要进行配置ssh时就会显示: System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down 增加参数 --privileged 也无法成功。所以 所以Gerrit直接拉取docker.io/ubuntu镜像进行部署: docker run -dit --name test docker.io/ubuntu /bin/bash 进入容器后进行部署安装Gerrit: 官方部署文档:https://gerrit-documentation.storage.googleapis.com/Documentation/3.5.0.1/linux-quickstart.html

按照说明,需要先有Java SE Runtime Environment version 11 and up 1,安装openjdk sudo apt-get install openjdk-8-jre 运行java -version 查看是否成功 2,Download Gerrit wget https://gerrit-releases.storage.googleapis.com/gerrit-3.1.3.war 3,Install and initialize Gerrit export GERRIT_SITE=~/gerrit_testsite java -jar gerrit*.war init -d $GERRIT_SITE Init方式会打开一个交互界面,前面的都可以直接回车,再启动后gerrit.conf中进行修改,到插件部分需要全部yes安装,不然测试后期安装很容易报连接超时错误。 到这里就已经完成了commit保存一下,然后增加端口映射 docker run -d -p 8090:8080 -p 29418:29418 --name gerrit --privileged=true --hostname 172.16.82.121:8080 gerrit_test:v2.0 tail -f /dev/null

至此,基础安装部分全部完成,开始集成工作 准备工作 我们需要开启gitlab和gerrit服务器的ssh服务及生成密钥。 权限配置 配置gerrit访问gitlab 配置gitlab访问gerrit 也就是将gerrit的公钥给到gitlab。 gitlab的公钥给gerrit 在相互配置完authorized_keys之后,ssh能直接互相连通就可以了。 配置密钥 该步骤,需要将上述gerrit生成公钥放到对应的gitlab 可视化页面公钥配置中。

再将gitlab生成的公钥放到gerrit里面

设置gerrit同步gitlab的配置文件 该步骤也是很关键,需要在该配置文件中指定gitlab服务器相关信息,否则将会同步失败。 登录到gerrit服务器中操作 创建config文件 vi ~/.ssh/config HOST 172.16.82.121 # 指明gitlab的地址 User root #gitlab服务器用户名 Port 2222 # gitlab 访问端口, 我们映射到宿主机的端口 IdentityFile ~/.ssh/id_rsa # 秘钥在服务器的路径 PreferredAuthentications publickey # 首选认证方式 StrictHostKeyChecking 密钥检查

创建项目 1.创建一个gitlab的项目demo5 2.创建一个gerrit的项目 需要名称一样的项目demo5

创建完后gerrit服务器的$GERRIT_SITE/git下就是我们的项目目录

该目录下还有两个All-Projects.git All-Users.git目录,在安装gerrit的时候自动生成的,这是gerrit权限管理文件。

现在进行关联gitlab:

进入gerrit版本仓目录

cd /root/gerrit_testsite/git

删除gerrit自动生成的demo5.git目录, 该目录其实就是一个空仓

rm -rf demo5.git

拉取gitlab的demo5项目,

Git clone --bare ssh://git@119.3.60.230:1622/gm_aosp/aosp/external/tinyalsa.git

这样在通过Repositories->tinyalsa->Branches->browes查看,内容和gitlab是一样的

自动同步项目: 接下来就是最重要的,将gerrit项目demo5的修改自动的同步到gitlab对应的项目 replication插件配置 如果没有就要先安装replication插件, 当前gerrit在安装的时候都自动安装了,无需手动安装。 也可以通过BROWES->plugin进行查看确认是否已经安装:

然后我们需要创建一个/root/gerrit_testsite/etc/replication.config文件进行指定demo5同步gitlab对应的项目

保存退出, 并重启 /root/gerrit_testsite/etc/bin/gerrit.sh restart

gerrit拉取并修改同步项目 拉取代码并修改提交。 我们通过页面登录到gerrit后,找到demo5项目

使用clone命令拉去到本地

这里代码就拉取到本地了,因为gitlab已经将主分支master改成main了,所以我们创建一个master分支进行测试。后期可以修改为main或者直接合并到main。 接着我们进行修改:

修改完提交我们可以看到 gerrit已经有了,然后通过gerrit页面确认是否已经被正确提交到gerrit demo5仓库中了, 通过查看确实已经有了提交记录如下图: 打开看一下:

这时通过gitlab的页面查看确实也同步了,如下图所示,gitlab也已经同步好了:

打开看一下:

可以从日志中看出,推送过程:

因为是测试,所以关闭了review和merge请求,正常情况下需要审核完成后才可以同步到gitlab。

遇到的问题汇总: 1,gerrit clone地址为容器地址,故无法远程拉取。 解决方案:因为在容器中,默认会将容器ID作为hostname,在/root/gerrit_testsite/etc/gerrit修改也无法生效。所以添加--host参数启动。

2,之前是拉去的直接的gerrit容器,这个容器的基础操作环境为Centos8,2020年12月08日,CentOS官方宣布了停止维护CentOS Linux的计划,因以停止维护导致yum源的问题。 解决方案:可将yum源更换成centos7版本。

3,gerrit最小化安装之后没有拉取代码命令和插件无法安装及更新: 解决方案:标准化安装之后,将/root/gerrit_test/plugins下的所有插件打包放在已经配置好的gerrit的plugins下,重启即可。

4,报错:! [remote rejected] head -> refs/for/master (change 19215 closed) error: failed to push some refs to 'ssh://172.16.82.121:29418/demo5.

解决方案: (1)git commit --amend (2)把Change-Id 删除 (3)再次提交问题解决 参考文档:https://www.cnblogs.com/yongdaimi/p/12583189.html

5,gerrit和git两个工具的的集成身份验证问题:

原因:gerrit在向gitlab推送时,使用的是JSch ,JSch是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。这玩意只支持以-----begin RSA private key---开头的私钥而现在ssh-keygen默认生成的是-----Begin openssh private key---格式,所以需要降低gerrit服务器ssh-keygen的版本。 解决方案:使用ssh-keygen -t rsa -m PEM 命令重新生成。还可以将gitlab的秘钥直接拷贝到gerrit的~/.ssh/目录中即可。但是这样会导致gerrit密钥混乱,所以重新修改格式就行。