erp-suite/scripts/deploy/sync-to-deploy-repos.sh

307 lines
8.3 KiB
Bash
Executable File

#!/bin/bash
# =============================================================================
# sync-to-deploy-repos.sh
#
# Script para sincronizar componentes del workspace a repositorios de deploy
# independientes para CI/CD con Jenkins
#
# Uso:
# ./sync-to-deploy-repos.sh [vertical] [componente]
# ./sync-to-deploy-repos.sh construccion backend
# ./sync-to-deploy-repos.sh construccion all
# ./sync-to-deploy-repos.sh all all
#
# Autor: Architecture-Analyst
# Fecha: 2025-12-12
# =============================================================================
set -e
# -----------------------------------------------------------------------------
# CONFIGURACION
# -----------------------------------------------------------------------------
WORKSPACE_ROOT="/home/isem/workspace/projects/erp-suite"
DEPLOY_REPOS_ROOT="/home/isem/deploy-repos"
# Configuración de Gitea (usar token en lugar de password para evitar bloqueos)
GITEA_HOST="72.60.226.4:3000"
GITEA_USER="rckrdmrd"
GITEA_TOKEN="3fb69a2465f4c1d43c856e980236fbc9f79278b1"
# Verticales disponibles
VERTICALES=("construccion" "mecanicas-diesel" "vidrio-templado" "retail" "clinicas")
# Proyectos especiales (no en verticales/)
PROYECTOS_ESPECIALES=("erp-core")
# Componentes por vertical
COMPONENTES=("backend" "frontend-web" "frontend-mobile" "database")
# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# -----------------------------------------------------------------------------
# FUNCIONES
# -----------------------------------------------------------------------------
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[OK]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Crear repo de deploy si no existe
ensure_deploy_repo() {
local repo_path="$1"
local repo_name="$2"
if [ ! -d "$repo_path" ]; then
log_info "Creando repo de deploy: $repo_name"
mkdir -p "$repo_path"
cd "$repo_path"
git init -b main
echo "# $repo_name" > README.md
echo "Repositorio de deploy para CI/CD con Jenkins" >> README.md
git add README.md
git commit -m "Initial commit - Deploy repo for $repo_name"
# Configurar remoto con token
git remote add origin "http://${GITEA_USER}:${GITEA_TOKEN}@${GITEA_HOST}/${GITEA_USER}/${repo_name}.git"
log_success "Repo creado: $repo_path"
else
# Asegurar que el remoto use token
cd "$repo_path"
git remote set-url origin "http://${GITEA_USER}:${GITEA_TOKEN}@${GITEA_HOST}/${GITEA_USER}/${repo_name}.git" 2>/dev/null || \
git remote add origin "http://${GITEA_USER}:${GITEA_TOKEN}@${GITEA_HOST}/${GITEA_USER}/${repo_name}.git" 2>/dev/null
fi
}
# Sincronizar un componente
sync_component() {
local vertical="$1"
local component="$2"
local source_path=""
# Evitar duplicar prefijo "erp-" si el proyecto ya lo tiene
local repo_name=""
if [[ "$vertical" == erp-* ]]; then
repo_name="${vertical}-${component}"
else
repo_name="erp-${vertical}-${component}"
fi
local repo_path="${DEPLOY_REPOS_ROOT}/${repo_name}"
# Determinar base path (verticales/ o directamente en apps/)
local base_path=""
if [[ " ${PROYECTOS_ESPECIALES[*]} " =~ " ${vertical} " ]]; then
base_path="${WORKSPACE_ROOT}/apps/${vertical}"
else
base_path="${WORKSPACE_ROOT}/apps/verticales/${vertical}"
fi
# Determinar ruta fuente según componente
case "$component" in
"backend")
source_path="${base_path}/backend"
;;
"frontend-web")
# Soportar ambas estructuras: frontend/web/ o frontend/ directo
if [ -d "${base_path}/frontend/web" ]; then
source_path="${base_path}/frontend/web"
elif [ -d "${base_path}/frontend" ] && [ -f "${base_path}/frontend/package.json" ]; then
source_path="${base_path}/frontend"
else
source_path="${base_path}/frontend/web"
fi
;;
"frontend-mobile")
source_path="${base_path}/frontend/mobile"
;;
"database")
source_path="${base_path}/database"
;;
*)
log_error "Componente desconocido: $component"
return 1
;;
esac
# Verificar que existe el source
if [ ! -d "$source_path" ]; then
log_warn "Source no existe: $source_path"
return 0
fi
# Crear repo si no existe
ensure_deploy_repo "$repo_path" "$repo_name"
# Sincronizar usando rsync
log_info "Sincronizando: $source_path -> $repo_path"
rsync -av --delete \
--exclude 'node_modules' \
--exclude 'dist' \
--exclude '.env' \
--exclude '.env.local' \
--exclude '*.log' \
--exclude '.DS_Store' \
--exclude 'coverage' \
--exclude '.nyc_output' \
"$source_path/" "$repo_path/"
# Crear .gitignore si no existe
if [ ! -f "$repo_path/.gitignore" ]; then
cat > "$repo_path/.gitignore" << 'EOF'
# Dependencies
node_modules/
# Build output
dist/
build/
# Environment files (local)
.env
.env.local
.env.*.local
# IDE
.idea/
.vscode/
*.swp
*.swo
# Logs
*.log
npm-debug.log*
# Coverage
coverage/
.nyc_output/
# OS
.DS_Store
Thumbs.db
# Cache
.cache/
.parcel-cache/
EOF
fi
log_success "Sincronizado: $repo_name"
}
# Sincronizar todos los componentes de una vertical
sync_vertical() {
local vertical="$1"
log_info "=========================================="
log_info "Sincronizando vertical: $vertical"
log_info "=========================================="
for component in "${COMPONENTES[@]}"; do
sync_component "$vertical" "$component"
done
}
# Mostrar uso
show_usage() {
echo "Uso: $0 [proyecto] [componente]"
echo ""
echo "Proyectos disponibles:"
for v in "${VERTICALES[@]}"; do
echo " - $v"
done
for p in "${PROYECTOS_ESPECIALES[@]}"; do
echo " - $p"
done
echo " - all (todos los proyectos)"
echo ""
echo "Componentes disponibles:"
for c in "${COMPONENTES[@]}"; do
echo " - $c"
done
echo " - all (todos los componentes)"
echo ""
echo "Ejemplos:"
echo " $0 construccion backend # Solo backend de construccion"
echo " $0 construccion all # Todos los componentes de construccion"
echo " $0 erp-core backend # Solo backend de erp-core"
echo " $0 all all # Todo el proyecto"
}
# -----------------------------------------------------------------------------
# MAIN
# -----------------------------------------------------------------------------
main() {
local vertical="${1:-}"
local component="${2:-}"
if [ -z "$vertical" ] || [ -z "$component" ]; then
show_usage
exit 1
fi
# Crear directorio base de repos si no existe
mkdir -p "$DEPLOY_REPOS_ROOT"
log_info "Workspace: $WORKSPACE_ROOT"
log_info "Deploy repos: $DEPLOY_REPOS_ROOT"
echo ""
# Procesar según parámetros
if [ "$vertical" == "all" ]; then
# Procesar verticales
for v in "${VERTICALES[@]}"; do
if [ "$component" == "all" ]; then
sync_vertical "$v"
else
sync_component "$v" "$component"
fi
done
# Procesar proyectos especiales
for p in "${PROYECTOS_ESPECIALES[@]}"; do
if [ "$component" == "all" ]; then
sync_vertical "$p"
else
sync_component "$p" "$component"
fi
done
else
if [ "$component" == "all" ]; then
sync_vertical "$vertical"
else
sync_component "$vertical" "$component"
fi
fi
echo ""
log_success "=========================================="
log_success "Sincronizacion completada!"
log_success "=========================================="
echo ""
log_info "Repos de deploy en: $DEPLOY_REPOS_ROOT"
log_info "Para hacer push a remoto:"
echo " cd $DEPLOY_REPOS_ROOT/erp-{vertical}-{component}"
echo " git remote add origin git@github.com:isem-digital/erp-{vertical}-{component}.git"
echo " git push -u origin main"
}
main "$@"