From 797b1fcbdb67781b68b72846d85cf652d9d2dc8f Mon Sep 17 00:00:00 2001 From: AlexeerCT Date: Fri, 24 Apr 2026 16:13:30 -0500 Subject: [PATCH] Refactor Jenkinsfile and wait-for-jenkins-stack.sh for improved E2E testing - Removed the wait-for-jenkins-stack.sh script from the Jenkinsfile, integrating its functionality directly into the Jenkins pipeline for better clarity and efficiency. - Enhanced the wait logic for backend and frontend services, implementing a reusable function in the script to streamline the waiting process and improve error handling. - Updated comments to clarify the purpose and behavior of the changes, ensuring better understanding of the E2E testing setup. --- Jenkinsfile | 39 ++++++++++++++++++-- scripts/wait-for-jenkins-stack.sh | 59 ++++++++++++++++--------------- 2 files changed, 67 insertions(+), 31 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 614df6b2..fb840818 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -280,11 +280,10 @@ pipeline { exit 1 fi - bash "$WORKSPACE/scripts/wait-for-jenkins-stack.sh" - # Playwright con docker cp (no -v): el workspace del agente Jenkins puede # no ser visible al docker daemon. `--network host` conecta al host del - # daemon donde compose publica 5173/8000. + # daemon, donde compose publica 5173/8000 (el agente Jenkins NO ve esos + # puertos; por eso el wait corre dentro de este contenedor, no en el shell). PW_CONTAINER="anexo76-e2e-pw-${BUILD_NUMBER}" docker rm -f "$PW_CONTAINER" >/dev/null 2>&1 || true docker run -d --name "$PW_CONTAINER" --network host \ @@ -296,9 +295,43 @@ pipeline { docker exec "$PW_CONTAINER" mkdir -p /workspace docker cp "$WORKSPACE/." "$PW_CONTAINER:/workspace" + # Wait + tests E2E en el mismo container (que sí tiene red host). + # BACKEND_MAX_SEC=900 acomoda el start_period=600s del backend healthcheck + # + margen para Alembic en DB vacía. if ! docker exec -w /workspace/frontend "$PW_CONTAINER" bash -lc ' set -euxo pipefail test -f package.json + + echo "== wait: backend http://127.0.0.1:8000/api/health ==" + i=0 + until curl -fsS --connect-timeout 3 --max-time 5 http://127.0.0.1:8000/api/health >/dev/null 2>&1; do + i=$((i + 5)) + if [ "$i" -ge 900 ]; then + echo "ERROR: timeout esperando backend (900s)" + exit 1 + fi + if [ $((i % 30)) -eq 0 ]; then + echo " ...esperando backend (${i}/900s)" + fi + sleep 5 + done + echo "== backend listo tras ${i}s ==" + + echo "== wait: frontend http://127.0.0.1:5173/ ==" + i=0 + until curl -fsS --connect-timeout 3 --max-time 5 http://127.0.0.1:5173/ >/dev/null 2>&1; do + i=$((i + 5)) + if [ "$i" -ge 300 ]; then + echo "ERROR: timeout esperando frontend (300s)" + exit 1 + fi + if [ $((i % 30)) -eq 0 ]; then + echo " ...esperando frontend (${i}/300s)" + fi + sleep 5 + done + echo "== frontend listo tras ${i}s ==" + corepack enable pnpm install --frozen-lockfile pnpm run i18n:compile diff --git a/scripts/wait-for-jenkins-stack.sh b/scripts/wait-for-jenkins-stack.sh index 9a13a5a6..5454abb1 100755 --- a/scripts/wait-for-jenkins-stack.sh +++ b/scripts/wait-for-jenkins-stack.sh @@ -1,31 +1,34 @@ #!/usr/bin/env bash -# Espera API y Vite levantados en el host (tras docker compose), para E2E en CI. +# Espera a que backend y frontend estén sirviendo tras `docker compose up`. +# +# Uso en Jenkins: el wait real corre dentro del contenedor Playwright con +# --network host (ver Jenkinsfile). Este script es para dev/local cuando los +# puertos 8000/5173 sí son alcanzables desde el shell que lo invoca. set -euo pipefail -BACKEND_MAX_SEC="${BACKEND_MAX_SEC:-600}" + +BACKEND_URL="${BACKEND_URL:-http://localhost:8000/api/health}" +FRONTEND_URL="${FRONTEND_URL:-http://localhost:5173/}" +BACKEND_MAX_SEC="${BACKEND_MAX_SEC:-900}" FRONTEND_MAX_SEC="${FRONTEND_MAX_SEC:-300}" -i=0 -while true; do - if curl -fsS "http://localhost:8000/api/health" >/dev/null 2>&1; then - echo "== stack: backend listo ==" - break - fi - i=$((i + 2)) - if [ "$i" -ge "$BACKEND_MAX_SEC" ]; then - echo "ERROR: timeout esperando http://localhost:8000/api/health (${BACKEND_MAX_SEC}s)" - exit 1 - fi - sleep 2 -done -i=0 -while true; do - if curl -fsS "http://localhost:5173/" >/dev/null 2>&1; then - echo "== stack: frontend listo ==" - exit 0 - fi - i=$((i + 2)) - if [ "$i" -ge "$FRONTEND_MAX_SEC" ]; then - echo "ERROR: timeout esperando http://localhost:5173/ (${FRONTEND_MAX_SEC}s)" - exit 1 - fi - sleep 2 -done +STEP="${STEP:-5}" + +wait_for() { + local url="$1" max="$2" label="$3" + echo "== wait: ${label} ${url} ==" + local i=0 + until curl -fsS --connect-timeout 3 --max-time 5 "$url" >/dev/null 2>&1; do + i=$((i + STEP)) + if [ "$i" -ge "$max" ]; then + echo "ERROR: timeout esperando ${label} ${url} (${max}s)" + return 1 + fi + if [ $((i % 30)) -eq 0 ]; then + echo " ...esperando ${label} (${i}/${max}s)" + fi + sleep "$STEP" + done + echo "== ${label} listo tras ${i}s ==" +} + +wait_for "$BACKEND_URL" "$BACKEND_MAX_SEC" "backend" +wait_for "$FRONTEND_URL" "$FRONTEND_MAX_SEC" "frontend"