一、Gerrit免密访问Gitlab
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中。