Integración de revisión de código con repositorios Git usando replicación automática

Introducción al flujo de trabajo

Los sistemas de revisión de código como Gerrit ofrecen funcionalidades especializadas para la auditoría de cambios, pero muchos equipos mantienen sus repositorios principales en plataformas como GitLab. La arquitectura típica sitúa el sistema de revisión como capa intermedia frente al repositorio definitivo, gestionando la aprobación humana y disparando verificaciones de integración continua.

Al establecer la sincronización bidireccional entre ambos sistemas, cualquier modificación aceptada en el sistema de revisión se replica automáticamente al repositorio remoto. Sin embargo, esta replicación es unidireccional: los cambios realizados directamente en GitLab no retornan al sistema de revisión. Por tanto, se recomienda centralizar todas las operaciones en el sistema de revisión.

Componente de replicación

El plugin de replicación permite conectar múltiples repositorios Git existentes, proporcionando espejos de cambios o respaldos en caliente. Automatiza el envío de cada revisión creada hacia sistemas externos configurados.

Configuración de credenciales SSH

Acceso desde el servidor de revisión hacia GitLab

Es necesario incorporar las claves públicas de ambos usuarios del sistema (el usuario dedicado y el administrador) en la cuenta administrativa de GitLab. Esto habilita el acceso SSH para cualquier proyecto.

[reviewer@srv-revision ~]$ whoami
reviewer
[reviewer@srv-revision ~]$ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHqKLmV0nP4xG2qJ7oRKs9Wd4vBn3fQzXy7rL1mT5uW0 reviewer@srv-revision

[reviewer@srv-revision ~]$ su - root
Password: 
[root@srv-revision ~]# cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBdmQ3pOeX+0FXo7tPq6VZMxAyRHs7cRz4Uz6vSjTc9p root@srv-revision

En la interfaz de GitLab: Settings → SSH Keys → Add Key, insertar ambas claves públicas y guardar.

Acceso desde GitLab hacia el servidor de revisión

Desde el servidor GitLab (10.20.30.40), generar y distribuir las claves SSH al servidor de revisión (10.20.30.50):

[root@gitlab-srv ~]# ssh-keygen -t ed25519 -C "gitlab-sync" -f ~/.ssh/id_ed25519 -N ""
[root@gitlab-srv ~]# ssh-copy-id -i ~/.ssh/id_ed25519.pub root@10.20.30.50
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s)
root@10.20.30.50's password: 

Number of key(s) added: 1

[root@gitlab-srv ~]# ssh root@10.20.30.50 hostname
srv-revision

Repetir el proceso en dirección inversa desde el servidor de revisión hacia GitLab:

[root@srv-revision ~]# ssh-copy-id -i ~/.ssh/id_ed25519.pub root@10.20.30.40
/usr/bin/ssh-copy-id: INFO: Source of key(s) to install: "/root/.ssh/id_ed25519.pub"
root@10.20.30.40's password: 

Number of key(s) added: 1

[root@srv-revision ~]# ssh root@10.20.30.40 hostname
gitlab-srv

Archivo de configuración SSH

Crear el archivo de configuración SSH para el usuario del sistema de revisión dentro del directorio de instalación:

[reviewer@srv-revision ~]$ mkdir -p ~/review-site/etc/.ssh
[reviewer@srv-revision ~]$ cat > ~/review-site/etc/.ssh/config <<'EOF'
Host 10.20.30.40
  IdentityFile ~/.ssh/id_ed25519
  PreferredAuthentications publickey
  StrictHostKeyChecking no
EOF
[reviewer@srv-revision ~]$ chmod 600 ~/review-site/etc/.ssh/config

Modificación de la configuración principal

Editar el archivo de configuración del sistema de revisión para habilitar la administración remota de plugins:

[reviewer@srv-revision ~]$ cat >> ~/review-site/etc/gerrit.config <<'EOF'
[plugins]
    allowRemoteAdmin = true
EOF

Reiniciar el servicio para aplicar los cambios:

[reviewer@srv-revision ~]$ sudo systemctl restart gerrit-code-review
# O alternativamente:
[reviewer@srv-revision ~]$ ~/review-site/bin/gerrit.sh restart
Stopping Gerrit Code Review: OK
Starting Gerrit Code Review: OK

Creación y sincronización de proyectos

Preparación en GitLab

  1. Crear un nuevo proyecto en GitLab
  2. Deshabilitar Auto DevOps: Settings → CI/CD → Auto DevOps (desmarcar y guardar)
  3. Inicializar con un archivo README

URL del repositorio: git@10.20.30.40:devteam/backend-api.git

Inicialización en el servidor de revisión

Eliminar cualquier directorio existente y clonar el repositorio en modo desnudo desde GitLab:

[reviewer@srv-revision ~]$ cd ~/review-site/git/
[reviewer@srv-revision git]$ sudo rm -rf backend-api.git/
[reviewer@srv-revision git]$ git clone --bare git@10.20.30.40:devteam/backend-api.git
Cloning into bare repository 'backend-api.git'...
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 9 (delta 0), reused 9 (delta 0)
Receiving objects: 100% (9/9), done.

[reviewer@srv-revision git]$ cat backend-api.git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = true
[remote "origin"]
    url = git@10.20.30.40:devteam/backend-api.git

Habilitación de la replicación automática

Verificación del plugin

[reviewer@srv-revision ~]$ ssh -p 29418 admin@localhost gerrit plugin ls | grep replication
replication                    v3.2.1     ENABLED  replication.jar

Definición de reglas de replicación

Crear el archivo de configuración de replicación. Cada proyecto nuevo requiere una entrada adicional en este archivo:

[reviewer@srv-revision ~]$ cat > ~/review-site/etc/replication.config <<'EOF'
[remote "backend-api-gitlab"]
    projects = backend-api
    url = git@10.20.30.40:devteam/backend-api.git
    push = +refs/heads/*:refs/heads/*
    push = +refs/tags/*:refs/tags/*
    push = +refs/changes/*:refs/changes/*
    replicatePermissions = false
    threads = 5
    rescheduleDelay = 2
EOF

[reviewer@srv-revision ~]$ ssh -p 29418 admin@localhost gerrit plugin reload replication

Flujo de desarrollo local

Configuración del entorno local

El desarrollador debe configurar su identidad Git de forma consistente con las credenciales registradas en el sistema de revisión:

dev@workstation ~/projects
$ git config --global user.name "maria.garcia"
dev@workstation ~/projects
$ git config --global user.email "maria.garcia@empresa.mx"
dev@workstation ~/projects
$ git --version
git version 2.38.1

Clonación con hook de Change-Id

Clonar el repositorio desde el sistema de revisión e instalar el hook que genera identificadores únicos para cada revisión:

dev@workstation ~/projects
$ git clone "ssh://maria.garcia@10.20.30.50:29418/backend-api" && \
  scp -p -P 29418 maria.garcia@10.20.30.50:hooks/commit-msg "backend-api/.git/hooks/"
Cloning into 'backend-api'...
remote: Counting objects: 15, done
remote: Finding sources: 100% (15/15)
remote: Total 15 (delta 0), reused 15 (delta 0)
Receiving objects: 100% (15/15), done.
commit-msg                              100% 2847   890.3KB/s   00:00

Realización y envío de cambios

dev@workstation ~/projects/backend-api (main)
$ echo "Endpoint: GET /api/v2/health" >> endpoints.txt

dev@workstation ~/projects/backend-api (main)
$ git add endpoints.txt

dev@workstation ~/projects/backend-api (main)
$ git commit -m "Agregar endpoint de verificación de salud"
[main abc1234] Agregar endpoint de verificación de salud
 1 file changed, 1 insertion(+)

El envío utiliza una referencia especial que dirige los cambios al flujo de revisión:

dev@workstation ~/projects/backend-api (main)
$ git push origin HEAD:refs/for/main
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/3), 312 bytes | 312.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Processing changes: refs: 1, new: 1, done
remote:
remote: SUCCESS
remote:
remote:   http://10.20.30.50:8083/c/backend-api/+/42 Agregar endpoint de verificación de salud [NEW]
remote:
To ssh://10.20.30.50:29418/backend-api
 * [new branch]      HEAD -> refs/for/main

Proceso de revisión y fusión

Los revisores con permisos de Code-Review +2 pueden aprobar directamente los cambios. Los revisores regulares únicamente pueden otorgar +1 como recomendación. Tras la aprobación completa, pulsar Submit para fusionar el cambio en la rama principle. El sistema replicará automáticamente el cambio al repositorio de GitLab.

Para verificar la sincronización, consultar el registro de replicación:

[reviewer@srv-revision ~]$ tail -20 ~/review-site/logs/replication_log
[2024-01-15 14:30:22,451] [a8f2c1e9] Replication to git@10.20.30.40:devteam/backend-api.git started...
[2024-01-15 14:30:22,458] [a8f2c1e9] Push to git@10.20.30.40:devteam/backend-api.git references: [...]
[2024-01-15 14:30:45,102] [a8f2c1e9] Replication to git@10.20.30.40:devteam/backend-api.git completed in 22651ms, 0 retries

Resolución de incidencias comunes

Error de versión de Git en el servidor

Si al ejecutar git commit se obtiene el error "interpret-trailers is not a git command", la causa es una versión de Git demasiado antigua. Solución: actualizar Git a una versión superior a 2.9.

[reviewer@srv-revision ~]$ git --version
git version 1.8.3.1
[reviewer@srv-revision ~]$ sudo yum update git
# O desde repositorio oficial:
[reviewer@srv-revision ~]$ sudo yum install https://packages.endpointdev.com/rhel/7/os/x86_64/endpoint-repo-1.9-1.x86_64.rpm
[reviewer@srv-revision ~]$ sudo yum install git

Fallo de conexión SSH desde el cliente

Si la clonación remota produce "Could not read from remote repository" con timeout de conexión, verificar la configuración del cortafuegos:

[reviewer@srv-revision ~]$ sudo firewall-cmd --zone=public --permanent --add-port=29418/tcp
success
[reviewer@srv-revision ~]$ sudo firewall-cmd --reload
success
[reviewer@srv-revision ~]$ sudo firewall-cmd --list-ports
29418/tcp 22/tcp 8083/tcp

Etiquetas: Gerrit GitLab replication-plugin ssh-keys code-review

Publicado el 7-6 07:29