El GitLab Bot es una herramienta automatizada diseñada para mantener sincronizados varios forks derivados de uno o más repositorios Master.
Su función principal es:
- Detectar nuevos commits en un repo Master
- Leer el archivo
.gitlab-bot.ymldel repo - Actualizar automáticamente los forks definidos
- Aplicar reglas de merge personalizadas
- Resolver conflictos preservando archivos específicos
- Enviar notificaciones (solo si corresponde)
- Mantener clones en buen estado mediante limpieza automática
El bot está diseñado como un sistema multi-tenant, modular, seguro y escalable.
El proyecto se encuentra dividido en módulos independientes que implementan responsabilidades claras, permitiendo un desarrollo mantenible y escalable.
gitlab-bot/
│
├── bot.py
│
├── config/
│ ├── config.yml
│ └── schema.yml
│
├── core/
│ ├── config_manager.py
│ ├── job_queue.py
│ ├── worker.py
│ ├── cleanup_scheduler.py
│ ├── webhook_server.py
│ └── logger.py
│
├── gitops/
│ ├── repo_manager.py
│ ├── merge_engine.py
│ ├── git_wrapper.py
│ └── bot_yaml_loader.py
│
├── notifications/
│ └── slack_notifier.py
│
├── utils/
│ ├── file_utils.py
│ ├── timer.py
│ └── exceptions.py
│
├── workspace/
│ ├── master/
│ └── forks/
│
└── docs/
└── images/
└── diagrama-worker.png
El Worker es el orquestador principal.
Es responsable de:
- Procesar cada job
- Orquestar la sincronización
- Coordinar RepoManager, MergeEngine y SlackNotifier
- Manejo de errores y reintentos
Encapsula TODAS las operaciones Git necesarias:
- clone
- fetch
- checkout
- pull
- push
- agregar remotes
Encargado del merge:
- Ejecutar merge master → fork
- Detectar conflictos
- Aplicar
theirs,oursoabort - Aplicar reglas de
ignore_files - Recuperar merges incompletos
Envía notificaciones según reglas definidas en cada .gitlab-bot.yml.
Capa segura sobre subprocess para ejecutar comandos Git.
Carga el archivo global config.yml.
Lee y valida el archivo .gitlab-bot.yml del repositorio Master.
Sistema FIFO + pool de workers.
Limpieza de repos viejos o corruptos periódicamente.
Recibe eventos de GitLab.
version: "1.0"
bot:
name: "GitLab Bot"
environment: "production"
ssh:
key_path: "/bot/keys/id_rsa"
notifications:
slack:
enabled: true
webhook_url: "https://hooks.slack.com/services/AAA/BBB/CCC"
workers:
max_workers: 4
queue_max_size: 200
job_timeout_seconds: 300
logging:
level: "INFO"
app_log: "/bot/logs/app.log"
error_log: "/bot/logs/error.log"
max_size_mb: 20
backup_count: 5
console_output: true
paths:
workspace: "/bot/workspace"
cache: "/bot/cache"
cleanup:
enabled: true
interval_hours: 24
max_workspace_age_hours: 48version: "1.0"
enabled: true
name: "administrador-master"
repo:
url: "git@gitlab.com:XXXXXX/master/administrador-master.git"
branch: "main"
notifications:
notify_success: true
notify_errors: true
defaults:
merge_strategy: "theirs"
retry_count: 3
timeout_seconds: 120
ignore_files:
- ".env"
- ".env-production"
- ".gitlab-bot.yml"
- ".gitlab-ci.yml"
forks:
- name: "administrador-cliente-a"
url: "git@gitlab.com:XXXXX/CLIENTE-A/administrador-cliente-a.git"
branch: "main"
enabled: true
- name: "administrador-cliente-b"
url: "git@gitlab.com/XXXXX/cliente-b/administrador-cliente-b.git"
branch: "main"
enabled: false