2025-02-14 12:34:16 +00:00
|
|
|
#!/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} ==="
|
|
|
|
docker-compose -p lilium-e2e -f docker-compose.e2e.local.yml build cypress-setup >/dev/null 2>&1
|
|
|
|
|
|
|
|
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)"
|
|
|
|
|
|
|
|
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"
|
|
|
|
|
|
|
|
# 🚀 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"
|
2025-02-14 13:19:31 +00:00
|
|
|
docker logs "$container_id" > "test/cypress/docker/logs/${uniqueName}.log" 2>/dev/null || true
|
2025-02-14 12:34:16 +00:00
|
|
|
failedTests+=("$folderName")
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Limpiar contenedores
|
|
|
|
docker-compose -p "$uniqueName" -f docker-compose.e2e.local.yml down >/dev/null 2>&1 || true
|
|
|
|
|
|
|
|
((groupIndex++))
|
|
|
|
done
|
|
|
|
}
|