• 已删除用户
Administrator
发布于 2024-11-18 / 42 阅读
0

Gerrit 保姆教程之Gitlab集成

一、Gerrit免密访问Gitlab

1.1 准备工作

  1. 在Gitlab上创建Gerrit账号,并分配相应代码权限。用于在Gerrit容器中拉取和推送Gitlab代码。示例如下:

  • 账号:gerrit

  • 邮箱:gerrit@muxin.tech

1.2 添加SSH公钥

进入Gerrit容器,复制RSA公钥内容,路径:/var/gerrit/etc/ssh_host_rsa_key.pub默认已创建,无需手动创建)。

1.3 添加SSH客户端配置

在gerrit容器中创建~/.ssh/config文件,内容参考如下:

$ touch ~/.ssh/config
$ vi ~/.ssh/config
Host xx.xx.xx.xx
    User git
    Port 11022
    IdentityFile /var/gerrit/etc/ssh_host_rsa_key
  • HOST: Gitlab访问IP

  • User: Gitlab用户名,固定为git(也就是clone 的ssh的地址名@前面git名称,如:git@172.xx.xx.xx/project.git),请勿修改

  • Port: Gitlab访问端口

  • IdentityFile:公钥文件路径,请勿修改

1.4 测试连通性

出现提示Welcome to GitLab即成功。

$ ssh -T xx.xx.xx.xx
Welcome to GitLab, @gerrit!

二、Gerrit项目配置

想让gitlab上的项目能在gerrit上review的话,必须在gerrit上创建相同的项目,并有相同的仓库文件。

2.1 Gerrit上创建同名仓库

  • 仓库名称:aicc-demo-gerrit

  • 默认分支:我的默认分支是main,低版本Gitlab默认分支是master,根据实际填写。

2.3 Gerrit配置全局Git参数

$ git config --global user.name 'gerrit'
$ git config --global user.email 'gerrit@muxin.tech'

2.3 同步Gitlab项目到Gerrit

进入Gerrit容器中,参照以下执行:

$ cd /var/gerrit/git
$ rm -rf aicc-demo-gerrit.git
$ git clone --bare ssh://git@xxx.xxx.xxx.xxx:xxxx/demo/aicc-demo-gerrit.git
$ ls
All-Projects.git  All-Users.git  aicc-demo-gerrit.git

三、Gerrit自动同步配置

/var/gerrit/etc/replication.config文件中增加项目的同步配置,当 Gerrit aicc-demo-gerrit 项目仓库有变化时自动同步到 Gitlab 的 aicc-demo-gerrit 项目仓库中。

$ vi /var/gerrit/etc/replication.config
[remote "aicc-demo-gerrit"]
projects = aicc-demo-gerrit
url = ssh://git@xxx.xxx.xxx.xxx:xxxx/demo/aicc-demo-gerrit.git
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/changes/*:refs/changes/*
threads = 3
$ /var/gerrit/bin/gerrit.sh restart

不同仓库有相同的项目名称,可以在gerrit创建项目时加上前缀进行区分,如下:

如源仓库地址:git@172.16.16.4:jsyb/itil/gerrit-publish.git。配置同步可以使用如下:

[remote "jsyb-itil"]
    projects = *
    url = git@172.16.16.4:jsyb/${name}.git
    push = +refs/heads/*:refs/heads/*
    push = +refs/tags/*:refs/tags/*
    push = +refs/changes/*:refs/changes/*
    threads = 3

remote:定义了一个名为 jsyb_itil 的远程仓库,可以自定义;

projects = :这里的 * 是表示将同步所有项目,projects这条可以不写,但切忌不能使用系统项目名称变量${name}代替 *号 !!!

url : url = git@172.16.16.4:jsyb/${name}.git:指定了远程仓库的 SSH URL。${name}是gerrit系统默认的变量,也就是项目名称。同步时${name} 替换对应的项目名称。

同步规则:

  • push = +refs/heads/*:refs/heads/*:将所有分支同步到远程仓库。

  • push = +refs/tags/*:refs/tags/*:将所有标签同步到远程仓库。

  • push = +refs/changes/*:refs/changes/*:将所有变更(即 Gerrit 中的更改请求)同步到远程仓库

同步指定的项目:

四、验证测试

4.1 LDAP上创建个人账号

我这里新建了一个用户组developer,在用户组下新建了个人账号zhangqin

4.2 Gerrit上添加个人Email地址

Email 地址需要与本地配置的Git Email账号一致。

$ git config --list
user.name=zhangqin
user.email=zhangqin@muxin.tech

点击SEND VERIFIATION后,会发送验证邮件到填写的邮箱,点击邮件中的链接完成验证。

4.3 Gerrit上添加个人SSH公钥

用个人账号登录Gerrit,将SSH公钥添加到到Gerrit中。

4.4 从Gerrit上拉取项目代码

$ git clone "ssh://zhangqin@xx.xx.xx.xx:19418/aicc-demo-gerrit" && (cd "aicc-demo-gerrit" && mkdir -p `git rev-parse --git-dir`/hooks/ && curl -Lo `git rev-parse --git-dir`/hooks/commit-msg http://xx.xx.xx.xx:18018/tools/hooks/commit-msg && chmod +x `git rev-parse --git-dir`/hooks/commit-msg)

4.5 修改代码并提交

$ cd aicc-demo-gerrit
$ vi README.md
...略...
$ git add README.md
$ git commit -m '第1次提交测试'
$ git push origin HEAD:refs/for/main
枚举对象中: 5, 完成.
对象计数中: 100% (5/5), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (1/1), 完成.
写入对象中: 100% (3/3), 348 字节 | 348.00 KiB/s, 完成.
总共 3(差异 0),复用 0(差异 0),包复用 0(来自  0 个包)
remote: Processing changes: refs: 1, new: 1, done    
remote: 
remote: SUCCESS
remote: 
remote:   http://xx.xx.xx.xx:18018/c/aicc-demo-gerrit/+/1 第1次提交测试 [NEW]
remote: 
To ssh://xx.xx.xx.xx:19418/aicc-demo-gerrit
 * [new reference]   HEAD -> refs/for/main

4.6 审核代码

这里先用管理员账号进行审核。管理员账号登录Gerrit,CHANGES->Open。

4.7 同步Gitlab完成

代码审核通过后稍等几秒,代码会自动同步到Gitlab中。