Skip to content

Goviz93/gitlab-bot

Repository files navigation

GitLab Bot

🚀 Descripción del Proyecto

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.yml del 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.


🧩 Arquitectura del Proyecto

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


🧠 Descripción de Módulos (Documentación Oficial)

Worker (core/worker.py)

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

RepoManager (gitops/repo_manager.py)

Encapsula TODAS las operaciones Git necesarias:

  • clone
  • fetch
  • checkout
  • pull
  • push
  • agregar remotes

MergeEngine (gitops/merge_engine.py)

Encargado del merge:

  • Ejecutar merge master → fork
  • Detectar conflictos
  • Aplicar theirs, ours o abort
  • Aplicar reglas de ignore_files
  • Recuperar merges incompletos

SlackNotifier (notifications/slack_notifier.py)

Envía notificaciones según reglas definidas en cada .gitlab-bot.yml.


GitWrapper (gitops/git_wrapper.py)

Capa segura sobre subprocess para ejecutar comandos Git.


ConfigManager (core/config_manager.py)

Carga el archivo global config.yml.


BotYAML Loader (gitops/bot_yaml_loader.py)

Lee y valida el archivo .gitlab-bot.yml del repositorio Master.


JobQueue & WorkerPool (core/job_queue.py)

Sistema FIFO + pool de workers.


CleanupScheduler (core/cleanup_scheduler.py)

Limpieza de repos viejos o corruptos periódicamente.


Webhook Server (core/webhook_server.py)

Recibe eventos de GitLab.


🔄 Diagrama de Secuencia del Worker

Diagrama del Worker


⚙️ Archivo Global: config.yml

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: 48

📄 Archivo por Repositorio Master: .gitlab-bot.yml

version: "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

About

Gitlab Bot for multitenant repositories.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors