Merge branch 'development' into feature/fecha-pago-no-obligatorio
This commit is contained in:
74
Jenkinsfile
vendored
74
Jenkinsfile
vendored
@@ -280,11 +280,21 @@ pipeline {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
bash "$WORKSPACE/scripts/wait-for-jenkins-stack.sh"
|
||||
# Dump temprano: 10s tras el up para ver arranque de Vite/Uvicorn antes de
|
||||
# que el wait empiece a iterar; si algo falla, queda en logs sin esperar
|
||||
# al timeout.
|
||||
sleep 10
|
||||
echo "== E2E: estado del stack tras 10s =="
|
||||
e2e_compose ps -a 2>&1 || true
|
||||
echo "--- docker logs anexo76-frontend --tail 40 ---"
|
||||
docker logs --tail 40 anexo76-frontend 2>&1 || true
|
||||
echo "--- docker logs anexo76-backend --tail 40 ---"
|
||||
docker logs --tail 40 anexo76-backend 2>&1 || true
|
||||
|
||||
# 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,20 +306,78 @@ pipeline {
|
||||
docker exec "$PW_CONTAINER" mkdir -p /workspace
|
||||
docker cp "$WORKSPACE/." "$PW_CONTAINER:/workspace"
|
||||
|
||||
# Wait + preparación + tests E2E en el mismo container (red host).
|
||||
# BACKEND_MAX_SEC=900 acomoda el start_period=600s del backend healthcheck
|
||||
# + margen para Alembic en DB vacía.
|
||||
# Estructura: 1) infra (wait/install/i18n) → fatal si falla;
|
||||
# 2) pnpm run test:e2e → no-fatal: hoy fallará en auth.setup.ts
|
||||
# porque el usuario demo se siembra mediante init_first_time.sh
|
||||
# que aún no se ejecuta en CI. Marcamos el build como UNSTABLE
|
||||
# y permitimos que continúen los stages de release.
|
||||
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 180 ]; then
|
||||
echo "ERROR: timeout esperando frontend (180s)"
|
||||
exit 1
|
||||
fi
|
||||
if [ $((i % 30)) -eq 0 ]; then
|
||||
echo " ...esperando frontend (${i}/180s)"
|
||||
fi
|
||||
sleep 5
|
||||
done
|
||||
echo "== frontend listo tras ${i}s =="
|
||||
|
||||
corepack enable
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm run i18n:compile
|
||||
pnpm run test:e2e
|
||||
'; then
|
||||
docker rm -f "$PW_CONTAINER" >/dev/null 2>&1 || true
|
||||
e2e_compose_fail_logs
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Tests E2E: no-fatal. Capturamos el rc y se lo dejamos al step `script` de
|
||||
# abajo para que marque el build como UNSTABLE si falla.
|
||||
rm -f "$WORKSPACE/.e2e-rc"
|
||||
set +e
|
||||
docker exec -w /workspace/frontend "$PW_CONTAINER" bash -lc 'pnpm run test:e2e'
|
||||
E2E_RC=$?
|
||||
set -e
|
||||
if [ "$E2E_RC" -ne 0 ]; then
|
||||
echo "WARNING: pnpm run test:e2e falló (rc=$E2E_RC)."
|
||||
echo "WARNING: hasta integrar init_first_time.sh en CI, el usuario demo no existe y auth.setup.ts no completa el login."
|
||||
echo "$E2E_RC" > "$WORKSPACE/.e2e-rc"
|
||||
fi
|
||||
docker rm -f "$PW_CONTAINER" >/dev/null 2>&1 || true
|
||||
'''
|
||||
script {
|
||||
if (fileExists("${env.WORKSPACE}/.e2e-rc")) {
|
||||
currentBuild.result = 'UNSTABLE'
|
||||
sh "rm -f '${env.WORKSPACE}/.e2e-rc'"
|
||||
echo 'E2E (Playwright) marcado como UNSTABLE: pendiente de integrar init_first_time.sh en CI para sembrar usuario demo y secret de Keycloak. El stack se levanta correctamente, falla solo el flujo de login del setup.'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,11 @@ wait_for_backend() {
|
||||
echo "Esperando a que el backend esté disponible en ${url}..."
|
||||
|
||||
while [ $attempt -le $max_attempts ]; do
|
||||
if wget -q -O /dev/null "${url}/health" 2>/dev/null; then
|
||||
# NOTA: usar la URL tal cual la pasa el caller. Antes esta función agregaba
|
||||
# un "/health" extra al final (resultando en /api/health/health → 404), lo
|
||||
# que provocaba que el entrypoint esperara 30 intentos en vano antes de
|
||||
# arrancar Vite, sumando ~90 s muertos al arranque del frontend.
|
||||
if wget -q -O /dev/null "${url}" 2>/dev/null; then
|
||||
echo "✓ Backend está listo"
|
||||
return 0
|
||||
fi
|
||||
|
||||
@@ -42,6 +42,12 @@ export default defineConfig({
|
||||
host: true, // escucha en 0.0.0.0
|
||||
allowedHosts: [
|
||||
'anexo76-dev.aduanasoft.com',
|
||||
// Requeridos para dev local, healthcheck del contenedor y E2E (Playwright
|
||||
// con --network host apunta a 127.0.0.1:5173). Al definir allowedHosts,
|
||||
// Vite 5.1+ reemplaza el default ['.localhost'] y bloquea todo lo que no
|
||||
// esté aquí, devolviendo 403 "Blocked request".
|
||||
'127.0.0.1',
|
||||
'localhost',
|
||||
// 'otro-host.com' si necesitas más
|
||||
],
|
||||
proxy: {
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user