chore: sync bdt.sh v2.2.0 (monorepo @ 3786049)

This commit is contained in:
2026-06-19 06:05:04 -04:00
parent 7bd1661666
commit 0a2c1d762b

122
bdt.sh
View File

@@ -20,7 +20,7 @@ set -euo pipefail
# CONFIGURACION # CONFIGURACION
#=============================================================================== #===============================================================================
SCRIPT_VERSION="2.1.0" SCRIPT_VERSION="2.2.0"
SCRIPT_NAME="$(basename "$0")" SCRIPT_NAME="$(basename "$0")"
# Directorios - resolver symlinks para encontrar la ruta real # Directorios - resolver symlinks para encontrar la ruta real
@@ -334,6 +334,7 @@ cmd_install() {
# (canales-* lo tienen en apps/<app>/Dockerfile, contexto = raíz del monorepo canales) # (canales-* lo tienen en apps/<app>/Dockerfile, contexto = raíz del monorepo canales)
_docker_build_local() { _docker_build_local() {
local svc="$1" local svc="$1"
local nocache="${2:-}"
local dir dockerfile dockerfile_path local dir dockerfile dockerfile_path
dir="$(repo_dir "$svc")" dir="$(repo_dir "$svc")"
[[ -z "$dir" ]] && { err "Servicio desconocido: ${svc}"; return 1; } [[ -z "$dir" ]] && { err "Servicio desconocido: ${svc}"; return 1; }
@@ -342,9 +343,14 @@ _docker_build_local() {
[[ ! -f "$dockerfile_path" ]] && { err "Sin Dockerfile: ${svc} (${dockerfile_path})"; return 1; } [[ ! -f "$dockerfile_path" ]] && { err "Sin Dockerfile: ${svc} (${dockerfile_path})"; return 1; }
local args=(-t "bdt-${svc}:latest") local args=(-t "bdt-${svc}:latest")
if [[ "$nocache" == "nocache" || "$nocache" == "--no-cache" ]]; then
args=(--no-cache "${args[@]}")
info "Construyendo bdt-${svc}:latest ${YELLOW}(sin caché)${NC}..."
else
info "Construyendo bdt-${svc}:latest..."
fi
[[ -n "$dockerfile" ]] && args+=(-f "$dockerfile_path") [[ -n "$dockerfile" ]] && args+=(-f "$dockerfile_path")
args+=("$dir") args+=("$dir")
info "Construyendo bdt-${svc}:latest..."
if docker build "${args[@]}" > "${LOG_DIR}/${svc}-docker-build.log" 2>&1; then if docker build "${args[@]}" > "${LOG_DIR}/${svc}-docker-build.log" 2>&1; then
ok "bdt-${svc}: imagen construida" ok "bdt-${svc}: imagen construida"
else else
@@ -356,18 +362,114 @@ _docker_build_local() {
cmd_build() { cmd_build() {
banner banner
local svc="${1:-all}" local svc="all" nocache="" a
step "BUILD" "Construyendo imágenes Docker" # Soporta: bdt build [servicio|all] [--no-cache]
for a in "$@"; do
case "$a" in
--no-cache|nocache) nocache="nocache" ;;
*) svc="$a" ;;
esac
done
step "BUILD" "Construyendo imágenes Docker${nocache:+ (sin caché)}"
if [[ "$svc" == "all" ]]; then if [[ "$svc" == "all" ]]; then
for s in $APP_SERVICES; do for s in $APP_SERVICES; do
_docker_build_local "$s" || true _docker_build_local "$s" "$nocache" || true
done done
else else
_docker_build_local "$svc" _docker_build_local "$svc" "$nocache"
fi fi
} }
#===============================================================================
# COMANDO: rebuild - Interactivo: elegir docker → build --no-cache → up
# La idea del shell: seleccionar CUÁL docker reconstruir SIN CACHÉ y levantarlo.
#===============================================================================
cmd_rebuild() {
banner
step "REBUILD" "Reconstruir un servicio SIN CACHÉ y levantarlo (--force-recreate)"
echo ""
# 1. Elegir servicio (lista numerada con estado del contenedor)
local options=() i=1 s
for s in $APP_SERVICES; do
options+=("$s")
local cname st
cname="$(docker_name "$s")"
st="$(docker inspect --format='{{.State.Status}}' "$cname" 2>/dev/null | tr -d '[:space:]' || true)"
[[ -z "$st" ]] && st="sin contenedor"
echo -e " ${WHITE}${i}${NC}) ${WHITE}${s}${NC}$(svc_desc "$s") ${GRAY}[contenedor: ${st}]${NC}"
i=$((i+1))
done
echo -e " ${WHITE}a${NC}) TODOS los servicios de aplicación"
echo ""
echo -ne " ${O3}¿Qué docker reconstruir sin caché? (1-${#options[@]}, 'a'=todos, nombre, Enter=cancelar):${NC} "
read -r choice
[[ -z "$choice" ]] && { warn "Cancelado"; return 0; }
local targets=()
if [[ "$choice" == "a" || "$choice" == "all" ]]; then
targets=($APP_SERVICES)
elif [[ "$choice" =~ ^[0-9]+$ ]] && (( choice >= 1 && choice <= ${#options[@]} )); then
targets=("${options[$((choice-1))]}")
else
for s in "${options[@]}"; do [[ "$s" == "$choice" ]] && targets=("$s"); done
fi
[[ ${#targets[@]} -eq 0 ]] && { err "Opción inválida: ${choice}"; return 1; }
# 2. Servicios Java: el Dockerfile copia build/libs/*.jar — ofrecer recompilar el JAR
local recompile=""
for s in "${targets[@]}"; do
case "$s" in
gateway|service-bus)
echo -ne " ${O3}¿Recompilar el JAR (gradle bootJar) antes del build? (s/N):${NC} "
read -r recompile
break
;;
esac
done
# 3. Por cada target: (gradle) → docker build --no-cache → up --force-recreate → health
for s in "${targets[@]}"; do
echo ""
step "REBUILD ${s}" "$(svc_desc "$s")"
if [[ "$recompile" =~ ^[sSyY] ]]; then
case "$s" in
gateway|service-bus)
local jdir; jdir="$(repo_dir "$s")"
info "Compilando ${s} (bootJar, sin tests)..."
( cd "$jdir" && ./gradlew clean bootJar -x test > "${LOG_DIR}/${s}-rebuild-gradle.log" 2>&1 ) \
&& ok "JAR: $(ls "${jdir}"/build/libs/*.jar 2>/dev/null | head -1)" \
|| { err "Gradle falló (ver ${LOG_DIR}/${s}-rebuild-gradle.log)"; continue; }
;;
esac
fi
_docker_build_local "$s" nocache || { err "Build de ${s} falló — sigo con el resto"; continue; }
info "Recreando contenedor ${s}..."
( cd "$INFRA_DIR" && $COMPOSE_CMD --profile apps --profile tools up -d --force-recreate "$s" 2>&1 \
| while read -r l; do echo -e " ${GRAY}${l}${NC}"; done )
local url; url="$(svc_health_url "$s")"
if [[ -n "$url" ]]; then
info "Esperando salud de ${s} (hasta 120s)..."
local tries=0 code="000"
while (( tries < 24 )); do
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 3 "$url" 2>/dev/null || echo "000")
[[ "$code" =~ ^(200|302|401)$ ]] && break
sleep 5; tries=$((tries+1))
done
[[ "$code" =~ ^(200|302|401)$ ]] && ok "${s} saludable (HTTP ${code})" || warn "${s}: sin health OK (HTTP ${code}) — revisá logs"
else
ok "${s} recreado"
fi
done
cd "$BDT_ROOT" 2>/dev/null || true
}
#=============================================================================== #===============================================================================
# COMANDO: up - Levantar servicios # COMANDO: up - Levantar servicios
#=============================================================================== #===============================================================================
@@ -1028,7 +1130,7 @@ _bdt_completions() {
local cur="${COMP_WORDS[COMP_CWORD]}" local cur="${COMP_WORDS[COMP_CWORD]}"
local prev="${COMP_WORDS[COMP_CWORD-1]}" local prev="${COMP_WORDS[COMP_CWORD-1]}"
local commands="clone pull install build up down restart status logs health verify-db verify-api deploy construir publish env update creds clean setup menu help image-login image-build image-push image-pull image-deploy image-build-amd64 server-deploy" local commands="clone pull install build rebuild up down restart status logs health verify-db verify-api deploy construir publish env update creds clean setup menu help image-login image-build image-push image-pull image-deploy image-build-amd64 server-deploy"
local services="frontend gateway service-bus canales-admin-web canales-worker apibank infrastructure database" local services="frontend gateway service-bus canales-admin-web canales-worker apibank infrastructure database"
local up_targets="all infra apps tools frontend gateway canales-admin-web canales-worker service-bus postgres redis keycloak" local up_targets="all infra apps tools frontend gateway canales-admin-web canales-worker service-bus postgres redis keycloak"
local envs="desarrollo calidad demo produccion" local envs="desarrollo calidad demo produccion"
@@ -1180,6 +1282,7 @@ _menu_dispatch() {
d) cmd_deploy ;; d) cmd_deploy ;;
e) cmd_install ;; e) cmd_install ;;
f) cmd_build all ;; f) cmd_build all ;;
n) cmd_rebuild ;;
g) cmd_clone ;; g) cmd_clone ;;
h) cmd_pull ;; h) cmd_pull ;;
i) i)
@@ -1211,6 +1314,7 @@ cmd_menu() {
while true; do while true; do
banner banner
echo -e " ${O1}${BOLD}0) CONSTRUIR SERVICIO${NC} ${GRAY}— asistente: git banco → build → docker → up${NC}" echo -e " ${O1}${BOLD}0) CONSTRUIR SERVICIO${NC} ${GRAY}— asistente: git banco → build → docker → up${NC}"
echo -e " ${O1}${BOLD}n) REBUILD SIN CACHÉ${NC} ${GRAY}— elegir docker → build --no-cache → up --force-recreate${NC}"
echo "" echo ""
echo -e " ${O2}${BOLD}SERVICIOS${NC} ${O3}${BOLD}MONITOREO${NC} ${O1}${BOLD}VERIFICACION${NC}" echo -e " ${O2}${BOLD}SERVICIOS${NC} ${O3}${BOLD}MONITOREO${NC} ${O1}${BOLD}VERIFICACION${NC}"
echo -e " ${GRAY}$(printf '%.0s─' {1..60})${NC}" echo -e " ${GRAY}$(printf '%.0s─' {1..60})${NC}"
@@ -1711,7 +1815,8 @@ cmd_help() {
echo "" echo ""
echo -e " ${O2}${BOLD}COMPILACIÓN${NC}" echo -e " ${O2}${BOLD}COMPILACIÓN${NC}"
echo -e " ${WHITE}install${NC} Instalar dependencias + compilar todo" echo -e " ${WHITE}install${NC} Instalar dependencias + compilar todo"
echo -e " ${WHITE}build${NC} [servicio|all] Construir imágenes Docker" echo -e " ${WHITE}build${NC} [servicio|all] [--no-cache] Construir imágenes Docker (opcional sin caché)"
echo -e " ${WHITE}rebuild${NC} Interactivo: elegir docker → build --no-cache → up --force-recreate"
echo "" echo ""
echo -e " ${O2}${BOLD}SERVICIOS${NC}" echo -e " ${O2}${BOLD}SERVICIOS${NC}"
echo -e " ${WHITE}up${NC} [all|infra|apps|tools|nombre] Levantar servicios" echo -e " ${WHITE}up${NC} [all|infra|apps|tools|nombre] Levantar servicios"
@@ -1780,6 +1885,7 @@ case "$cmd" in
pull) cmd_pull "$@" ;; pull) cmd_pull "$@" ;;
install) cmd_install "$@" ;; install) cmd_install "$@" ;;
build) cmd_build "$@" ;; build) cmd_build "$@" ;;
rebuild|rebuild-nc) cmd_rebuild "$@" ;;
up|start) cmd_up "$@" ;; up|start) cmd_up "$@" ;;
down|stop) cmd_down "$@" ;; down|stop) cmd_down "$@" ;;
restart) cmd_restart "$@" ;; restart) cmd_restart "$@" ;;