1
Home
husbando_enjoyer edited this page 2026-01-18 17:37:02 +01:00
- Arquitectura rapida
- El frontend se sirve bajo base path
/taller/(verfrontend/vite.config.js). - nginx del frontend proxy a backend para
/taller/api/(verfrontend/nginx.conf). - Backend expone
/healthy/builds(verbackend/app/main.py). /buildsconsulta Jenkins usandoJENKINS_BASE_URL+JENKINS_JOB_NAME(verbackend/app/services/builds.py).
- Puesta en marcha (docker compose)
- Copiar entorno:
cp .env.example .env
- Levantar stack:
docker compose up --build
- Comprobar:
http://localhost:8000/healthhttp://localhost:8081/taller/
Notas:
docker-compose.ymlpublica backend en8000:8000y frontend en8081:8081.- La red docker esta configurada con IPv6 (subnet
2001:db8::/64); porque el VPS pues tal, solo soporta IPv6.
- Configuración de entorno (local vs VPS)
- Con modificar los parámetros es suficiente, en el Job de CD están los parámetros de builds, no se puede lanzar una ejecución manualmente sin revisar estos parámetros. En caso de que el job se lance por Webhook, toma los parámetros por defecto, que son los del VPS.
Variables:
VITE_API_BASE- Recomendado: mantener
/taller/apipara que nginx proxye al backend. - En build de frontend se inyecta vía build arg (ver
frontend/Dockerfileydocker-compose.yml).
- Recomendado: mantener
JENKINS_BASE_URL- Local (ejemplo):
http://host.docker.internal:8080 - VPS:
https://openbokeron.org/jenkins
- Local (ejemplo):
JENKINS_JOB_NAME- Nombre del job en Jenkins que el backend consultará en
/builds.
- Nombre del job en Jenkins que el backend consultará en
JENKINS_USER/JENKINS_TOKEN- Si no están configurados, el backend intentará consultar sin Authorization (ver
backend/app/services/builds.py). Comportamiento esperado en errores:
- Si no están configurados, el backend intentará consultar sin Authorization (ver
- Si Jenkins no responde o falta config,
/buildsdevuelve503con{ "builds": [], "error": "jenkins_unavailable" }(verbackend/app/main.py).
- CI (Jenkinsfile.ci)
Archivo:
Jenkinsfile.ci
Hace:
- Init: detecta autor y short commit para logging.
- Backend:
ruff check+pytestdentro depython:3.11-slim.- Usa cachés dentro del workspace (
.cache/pip,.cache/pytest) yPYTHONDONTWRITEBYTECODE=1.
- Usa cachés dentro del workspace (
- Frontend:
npm install+npm run check+npm run builddentro denode:20-slim.- Usa cache en
.cache/npm.
- Usa cache en
- Post:
cleanWs()siempre.
Trazabilidad:
- CD / Deploy (Jenkinsfile.cd)
Archivo:
Jenkinsfile.cdParámetros del job:
JENKINS_BASE_URLJENKINS_JOB_NAMEVITE_API_BASEHace:- Backend tests (python 3.11 slim).
- Build imagenes:
- Backend: inyecta
APP_VERSION,GIT_COMMIT,COMMIT_AUTHOR,BUILD_NUMBERcomo build args (verbackend/Dockerfile). - Frontend: inyecta
VITE_API_BASEen build (verfrontend/Dockerfile).
- Backend: inyecta
- Deploy:
- Lanza
docker compose up -dconBACKEND_TAGyFRONTEND_TAG=APP_VERSION. - Inyecta credenciales
JENKINS_USER/JENKINS_TOKENdesde Jenkins credentials (jenkins-api-token) para que el backend pueda consultar Jenkins API en runtime.
- Lanza
- Webhooks (Gitea -> Jenkins) Objetivo:
- Disparar CI y/o CD automáticamente.
Estado según issue #15:
- Webhook de deploy en
mainanadido; CI en el resto de ramas estaba pendiente en ese momento.- #15 Checklist de configuracion (generico):
- Evento: push a
mainpara CD (y PR/push para CI si se quiere). - URL: endpoint de Jenkins para disparar el job (segun plugin/config).
- Secret: si se usa, guardarlo como secreto (no en la wiki).
- Troubleshooting rápido
- “El Jenkinsfile que se ejecuta no es el de mi rama”
- Puede ser intencional por seguridad (ver
Seguridad): se fuerza a usar Jenkinsfile demaincon Remote Jenkinsfile Provider. - Referencia: comentario en PR #21
- Puede ser intencional por seguridad (ver