Convierte el repositorio de Anexo76 en una plantilla limpia y reutilizable
para nuevos proyectos del ecosistema Workspace de Aduanasoft.
Cambios principales:
- Elimina módulos específicos de Anexo76: a76, a24, sitar, public
- Agrega módulo example/ con patrón CRUD de referencia (models/dto/service/routes)
- Limpia migraciones Alembic: solo quedan las 6 de core (users, tenants, permissions)
- Reemplaza todas las rutas del dashboard con stubs genéricos
- Elimina lógica de negocio aduanera: shortcuts, CSV imports, permisos, catálogos
- Simplifica variables de entorno: una sola WORKSPACE_URL deriva Hub y Keycloak
- Agrega scripts/auth-mode.sh para alternar entre auth local y workspace
- Configura docker-compose con nombres genéricos (app-*)
- Corrige flujo SSO: elimina system-gate SCAF/SCAII que bloqueaba el login
- Modo DEV_LOCAL_AUTH para desarrollo sin Keycloak ni Hub
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sin SITAR_API_URL/USER/PASSWORD, el botón "Consultar DOF" del dialog
ExchangeRateGuard nunca llena el input (el backend no tiene cómo pedir
el TC) y auth.setup.ts:72 falla con timeout. En el E2E viejo no salía
porque apuntaba a dev en vivo, donde ya había TC para hoy y el dialog
ni se abría.
Cambios:
- docker-compose.e2e.yml: backend recibe SITAR_API_URL/USER/PASSWORD
por env var passthrough con defaults vacíos.
- Jenkinsfile: lee a76-sitar-api-url (string) y a76-sitar-credentials
(usernamePassword) vía withCredentials y los inyecta.
- Cleanup ahora dumpea las últimas 200 líneas del backend cuando el
stack está arriba, para diagnosticar fallas opacas (auth, SITAR,
migraciones, etc.) sin tener que repetir el build.
Requiere en Jenkins:
- a76-sitar-api-url (Secret Text)
- a76-sitar-credentials (Username with password)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
postgres:18-alpine cambió la convención: el mount debe ir en
/var/lib/postgresql (padre), no en /var/lib/postgresql/data (subdir).
Con la convención vieja la imagen detecta el mount como "unused" y aborta
con error antes de inicializar el cluster.
Ver https://github.com/docker-library/postgres/pull/1259
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
El stage E2E corría contra A76_URL (versión viva en dev), así que detectaba
regresiones un build tarde: el código roto ya estaba desplegado cuando el
siguiente pipeline lo encontraba. Ahora E2E levanta un stack efímero con la
imagen del backend recién pusheada a Harbor y una imagen del frontend
buildeada localmente con VITE_API_URL=http://localhost:8000/api/ (la imagen
de prod tiene la URL de dev bakeada en el bundle). Si E2E falla, el deploy
no ocurre — el guardrail actúa sobre lo que se va a desplegar.
Cambios:
- docker-compose.e2e.yml (nuevo): postgres + minio + valkey + backend +
frontend efímeros, sin volúmenes persistidos, image tags vía env vars.
- Jenkinsfile: stage E2E reescrito. Build temp frontend en paralelo con
startup DB+alembic; preparación Playwright en paralelo con health wait
de backend/frontend. --cache-from de la imagen prod para reusar layer
de pnpm install. Cleanup garantizado vía trap EXIT.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>