#!/bin/bash # Función para esperar a que un servicio devuelva un JSON con `{ "status": true }` en la red de Docker wait_for_api_ready() { local service_name="$1" local container_name="$2" local port="$3" local path="$4" local network="${5,,}" local max_retries=30 # Máximo de intentos (30 segundos) local retries=0 local url="http://$container_name:$port$path" # echo "⏳ Esperando a que $service_name devuelva exactamente 'true' en $url..." while [[ $retries -lt $max_retries ]]; do response=$(docker run --rm --network="$network" curlimages/curl -s "$url" || echo "error") # echo "🔍 Respuesta recibida de $service_name: '$response'" if [[ "$response" == "true" ]]; then # echo "✅ Conectado al servicio $service_name → $url!" return 0 fi sleep 1 ((retries++)) done echo "❌ ERROR: $service_name no respondió con 'true' en $url después de $max_retries intentos." exit 1 } run_group() { local group="$1" local parallelIndex="$2" local groupIndex=1 echo "=== Ejecutando grupo paralelo ${parallelIndex} ===" for testFolder in $group; do folderName=$(basename "$testFolder" | tr -cd 'a-zA-Z0-9_-') uniqueName="${NETWORK}_${folderName}_${parallelIndex}_${groupIndex}" echo "🔹 $folderName (Grupo: $parallelIndex, Índice: $groupIndex) - Levantado" export CYPRESS_SPEC="test/cypress/integration/${folderName}/**/*.spec.js" # Iniciar servicios del backend y frontend docker-compose -p "$uniqueName" -f docker-compose.e2e.local.yml up -d back >/dev/null 2>&1 docker-compose -p "$uniqueName" -f docker-compose.e2e.local.yml up -d front >/dev/null 2>&1 # 🔹 Esperar a que la API en /api/Applications/status devuelva { "status": true } wait_for_api_ready "Aplicación" "front" 9000 "/api/Applications/status" "${uniqueName}_default" echo "🌐 $folderName (Grupo: $parallelIndex, Índice: $groupIndex) - Conectado" # 🚀 Ejecutar pruebas en modo detach docker-compose -p "$uniqueName" -f docker-compose.e2e.local.yml up -d e2e >/dev/null 2>&1 # 🔹 Esperar hasta que el contenedor de Cypress finalice container_id="" max_retries=10 retries=0 while [[ -z "$container_id" && $retries -lt $max_retries ]]; do sleep 2 container_id=$(docker-compose -p "$uniqueName" -f docker-compose.e2e.local.yml ps -q e2e) ((retries++)) done if [[ -z "$container_id" ]]; then echo "⚠️ No se pudo obtener el contenedor para ${folderName} después de $max_retries intentos" failedTests+=("$folderName") continue fi # echo "📦 Contenedor $container_id encontrado. Esperando a que finalice..." # 🔹 Esperar activamente a que el contenedor finalice while true; do container_status=$(docker inspect -f '{{.State.Running}}' "$container_id" 2>/dev/null || echo "false") if [[ "$container_status" == "false" ]]; then break fi sleep 2 done # Verificar el código de salida exit_code=$(docker inspect -f '{{.State.ExitCode}}' "$container_id" 2>/dev/null || echo "1") if [[ "$exit_code" -ne 0 ]]; then echo "⚠️ Error en la ejecución de ${folderName} (Exit Code: $exit_code)" buildResult="UNSTABLE" docker logs "$container_id" > "test/cypress/docker/logs/${uniqueName}.log" 2>/dev/null || true failedTests+=("$folderName") fi # Limpiar contenedores docker-compose -p "$uniqueName" -f docker-compose.e2e.local.yml down >/dev/null 2>&1 || true ((groupIndex++)) done }