跳转至

Gerrit 同步本地仓库到远程

概要: 本文介绍如何使用gerrit的插件replication实现将gerrit仓库变更推送到其他远程服务器仓库上,如GitHub,Gitee和Gitea等

创建时间: 2022.10.10 20:59:11

更新时间: 2022.10.10 21:11:34

提示

由于本地执行gerrit相关命令到远端较为繁琐,此处使用了命令替代

Bash
alias gsh="ssh -p 29418 lzwang@192.168.2.145"

前提

本地gerrit环境概览

  • 部署地址: 本地局域网192.168.2.145, ssh端口29418, WebUI端口19418
  • 部署方式: docker-compose
  • 部署版本: 3.5.0.1
  • 容器名称: gerrit_server

gerrit权限

确保本地ssh到gerrit时,拥有管理员权限,因为重载配置需要,具体参考 Gerrit允许远程管理员操作

Replication插件已安装

务必确保gerrit安装和启用了Replication插件(docker部署的gerrit默认已安装并启用),查看是否已启用命令

Bash
gsh gerrit plugin ls
已安装并启用的效果
Text Only
1
2
3
Name                           Version    Api-Version      Status   File
-------------------------------------------------------------------------------
replication                    v3.5.0.1   3.5.0.1          ENABLED  replication.jar

配置Replication插件

进入到gerrit的docker容器中

Bash
docker exec -it gerrit_server bash

提示

  • 在容器内部操作的用户均为root,不是用户gerrit
  • 以下命令均在docker内部执行

生成PEM形式的SSH密钥对

Bash
ssh-keygen -m PEM -t rsa -C "gerrit"
一路回车即可生成密钥对到~/.ssh/known_hosts目录下

将远程服务器域名导入到 known_hosts文件中

以下操作将会把Gitee.com导入到~/.ssh/known_hosts文件中,其他git服务器域名的操作是一样的

Bash
ssh gitee.com echo

Text Only
1
2
3
4
5
6
7
8
The authenticity of host 'gitee.com (212.64.62.183)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'gitee.com,212.64.62.183' (ECDSA) to the list of known hosts.
Invaild command: 'echo'
  You appear to be using ssh to clone a git:// URL.
  Make sure your core.gitProxy config option and the
  GIT_PROXY_COMMAND environment variable are NOT set.

执行上述命令过程中会出现错误,不用管,直接 ⌃ + C 退出即可,然后检查~/.ssh/known_hosts文件

Bash
cat ~/.ssh/known_hosts

如果看到一行以 gitee.com 开头的记录,此步骤即可宣告完成

Text Only
gitee.com,212.64.62.183 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHADDUjfdABBBMuEoYdx6to5oxR60IWj8uoe1aI0X1fKOHWOtLdffdsifhbJmFjU46EzeMBV/6EmI1uaRI6HiEPtPtJHE=

配置replication.config

写入replication.config

在docker容器中此配置文件位于/var/etc/replication.config,如果没有,就创建一个,写入内容如下

Properties
1
2
3
4
5
6
[remote "DevOps"]
    projects = DevOps
    url = git@gitee.com:lz_wang/DevOps.git
    url = mygit@gitea.xxx.com:root/DevOps.git
    push = +refs/heads/*:refs/heads/*
    push = +refs/tags/*:refs/tags/*

上述配置文件的含义是

  1. 指定同步的本地gerrit仓库为DevOps
  2. 指定了两个远程git服务器,其中一个是git服务厂商 Gitee.com,另一个是个人搭建的Gitea服务器gitea.xxx.com
  3. 指定了推送到远端的内容是gerrit的两类refs,即分支refs/heads/和标签refs/tags/
  4. 其余更详细的配置可以参考Replication Configuration

重新加载replication.config

在本地执行如下命令

Bash
gsh gerrit plugin reload replication
查看需要同步的仓库
Bash
gsh replication list
如果配置成功,输出参考如下
Text Only
1
2
3
Remote: DevOps
Url: git@gitee.com:lz_wang/DevOps.git
Url: mygit@gitea.xxx.com:root/DevOps.git

远程仓库配置

  • 由于我们要将本地gerrit仓库同步到远程,所以建议在远程新建和本地仓库名完全一致的仓库,即replication.config中配置的git地址
  • 如果远程已经存在同名仓库,可以选择其他的远程仓库作为目的仓库,如DevOpsGerrit

开始同步

同步准备

在本地拉取gerrit的DevOps仓库,通过gerrit change变更单的方式,进行常规的gerrit review后,submit到gerrit仓库中

自动同步

当replication插件侦测到监控的git仓库DevOps有变更合入后,默认会在合入的15s后启动同步任务,将变更推送到配置的远程git仓库中

手动同步

在本地执行如下命令

Bash
gsh replication start --all

查看同步日志

如果在执行完同步任务后,远程git服务器并未同步此次变更,可通过如下两种方式查看replication日志并排查原因

  1. 不推荐:使用docker logs gerrit_server查看,但是显示的replication日志不完整
  2. 推荐:进入docker容器内部,直接查看replication的log文件 /var/gerrit/logs/replication_log

参考