clase:daw:daw-proyecto:tema04
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Próxima revisión | Revisión previa | ||
| clase:daw:daw-proyecto:tema04 [2026/10/13 19:41] – creado Lorenzo | clase:daw:daw-proyecto:tema04 [2026/10/14 14:08] (actual) – Tema nuevo «2. IA y agentes»: los temas 2 a 7 pasan a ser 3 a 8, con sus referencias cruzadas renumeradas claude | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | ====== 4. Despliegue en el proyecto ====== | + | ====== 4. Docker en el proyecto ====== |
| + | |||
| + | Objetivo del tema: cada worktree tiene **su propia aplicación completa funcionando** (base de datos, backend y frontend), sin chocar con las de los demás worktrees. Al acabar, ''/ | ||
| + | |||
| + | Lo que ya sabéis y aquí no se repite: imágenes y contenedores ([[clase: | ||
| + | |||
| + | ===== Tres contenedores ===== | ||
| + | |||
| + | La aplicación son tres contenedores, | ||
| + | |||
| + | ^ Servicio ^ Imagen ^ Qué hace ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | El navegador solo habla con '' | ||
| + | |||
| + | Los dos Dockerfile son **multi-stage** y los escribe la IA. Lo único que hay que vigilar: | ||
| + | |||
| + | <sxh bash; | ||
| + | FROM maven: | ||
| + | WORKDIR /app | ||
| + | COPY pom.xml . | ||
| + | RUN --mount=type=cache, | ||
| + | COPY src ./src | ||
| + | RUN --mount=type=cache, | ||
| + | |||
| + | FROM eclipse-temurin: | ||
| + | RUN apt-get update && apt-get install -y curl && rm -rf / | ||
| + | COPY --from=build / | ||
| + | ENTRYPOINT [" | ||
| + | </ | ||
| + | |||
| + | El '' | ||
| + | |||
| + | <sxh bash; | ||
| + | FROM node:22 AS build | ||
| + | WORKDIR /app | ||
| + | COPY package*.json . | ||
| + | RUN npm ci | ||
| + | COPY . . | ||
| + | RUN npx ng build --configuration production | ||
| + | |||
| + | FROM nginx: | ||
| + | COPY nginx.conf / | ||
| + | COPY --from=build / | ||
| + | </ | ||
| + | |||
| + | <sxh plain; | ||
| + | server { | ||
| + | listen 80; | ||
| + | root / | ||
| + | |||
| + | location /api/ { | ||
| + | proxy_pass http:// | ||
| + | } | ||
| + | |||
| + | location / { | ||
| + | try_files $uri $uri/ / | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | El '' | ||
| + | |||
| + | ===== Producción y desarrollo con los mismos ficheros ===== | ||
| + | |||
| + | Docker Compose carga '' | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | <sxh yaml; | ||
| + | services: | ||
| + | db: | ||
| + | image: mariadb: | ||
| + | environment: | ||
| + | MARIADB_DATABASE: | ||
| + | MARIADB_USER: | ||
| + | MARIADB_PASSWORD: | ||
| + | MARIADB_ROOT_PASSWORD: | ||
| + | volumes: | ||
| + | - db-data:/ | ||
| + | networks: | ||
| + | - interna | ||
| + | healthcheck: | ||
| + | test: [" | ||
| + | interval: 5s | ||
| + | retries: 20 | ||
| + | |||
| + | backend: | ||
| + | build: ./backend | ||
| + | environment: | ||
| + | SPRING_DATASOURCE_URL: | ||
| + | SPRING_DATASOURCE_USERNAME: | ||
| + | SPRING_DATASOURCE_PASSWORD: | ||
| + | depends_on: | ||
| + | db: | ||
| + | condition: service_healthy | ||
| + | networks: | ||
| + | - interna | ||
| + | healthcheck: | ||
| + | test: [" | ||
| + | interval: 5s | ||
| + | retries: 20 | ||
| + | |||
| + | frontend: | ||
| + | build: ./ | ||
| + | environment: | ||
| + | VIRTUAL_HOST: | ||
| + | depends_on: | ||
| + | backend: | ||
| + | condition: service_healthy | ||
| + | networks: | ||
| + | - interna | ||
| + | - proxy | ||
| + | |||
| + | volumes: | ||
| + | db-data: | ||
| + | |||
| + | networks: | ||
| + | interna: | ||
| + | proxy: | ||
| + | external: true | ||
| + | name: nginx-proxy-network | ||
| + | </ | ||
| + | |||
| + | Los '' | ||
| + | |||
| + | <sxh yaml; | ||
| + | services: | ||
| + | db: | ||
| + | ports: | ||
| + | - " | ||
| + | |||
| + | backend: | ||
| + | ports: | ||
| + | - " | ||
| + | environment: | ||
| + | SPRING_PROFILES_ACTIVE: | ||
| + | |||
| + | frontend: | ||
| + | build: | ||
| + | target: build | ||
| + | command: npx ng serve --host 0.0.0.0 --proxy-config proxy.conf.json | ||
| + | volumes: | ||
| + | - ./ | ||
| + | - / | ||
| + | ports: | ||
| + | - " | ||
| + | </ | ||
| + | |||
| + | Lo que cambia en desarrollo: | ||
| + | |||
| + | * **Se publican los puertos**, para entrar desde el navegador y para que Maven y Playwright lleguen a la base de datos y al frontend desde el host. | ||
| + | * **El frontend pasa a '' | ||
| + | * **El backend no tiene recarga en caliente**: cada cambio en Java es '' | ||
| + | * **Datos de prueba** activados (abajo). | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | ===== Un compose por worktree | ||
| + | |||
| + | Dos worktrees con el mismo '' | ||
| + | |||
| + | <sxh bash; | ||
| + | COMPOSE_PROJECT_NAME=mi-proyecto-12-alta-clientes | ||
| + | DB_PORT=33112 | ||
| + | BACKEND_PORT=8112 | ||
| + | FRONTEND_PORT=4212 | ||
| + | DB_PASSWORD=dev | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | * Los puertos los busca ''/ | ||
| + | * Las variables llevan valor por defecto, '' | ||
| + | |||
| + | ''/ | ||
| + | |||
| + | ===== La primera tabla ===== | ||
| + | |||
| + | Hasta ahora el backend no tiene base de datos. Se añaden ahora, con un prompt directo al agente (el flujo de trabajo de verdad llega en el tema 5; esto es solo para tener algo que ver): | ||
| + | |||
| + | * Dependencias '' | ||
| + | * Una migración '' | ||
| + | * Un '' | ||
| + | |||
| + | El esquema **siempre** va en migraciones de Flyway, '' | ||
| + | |||
| + | ===== Datos de prueba ===== | ||
| + | |||
| + | Cada worktree arranca con la base de datos vacía: no hay nada que ver en la aplicación ni se pueden escribir tests E2E que dependan de que exista un cliente. Los datos de prueba se separan del esquema: | ||
| + | |||
| + | < | ||
| + | backend/ | ||
| + | ├── migration/ | ||
| + | └── datos-prueba/ | ||
| + | </ | ||
| + | |||
| + | Los de '' | ||
| + | |||
| + | <sxh plain; | ||
| + | spring.flyway.locations=classpath: | ||
| + | </ | ||
| + | |||
| + | * En desarrollo el perfil lo activa '' | ||
| + | * En producción '' | ||
| + | * Para volver al estado inicial (antes de pasar los E2E, por ejemplo): '' | ||
| + | |||
| + | Cada entidad nueva trae su '' | ||
| + | |||
| + | ===== El script app.sh ===== | ||
| + | |||
| + | Operar la aplicación es siempre lo mismo y no necesita ninguna inteligencia, | ||
| + | |||
| + | <sxh bash; | ||
| + | # | ||
| + | # La aplicación de este worktree: start | stop [-v] | status | logs | ||
| + | set -e | ||
| + | cd " | ||
| + | case " | ||
| + | start) | ||
| + | docker network inspect nginx-proxy-network >/ | ||
| + | docker compose up -d --build --wait | ||
| + | [ -f .env ] && . ./.env | ||
| + | echo " | ||
| + | stop) | ||
| + | status) docker compose ps ;; | ||
| + | logs) | ||
| + | *) echo "uso: $0 start | stop [-v] | status | logs"; exit 1 ;; | ||
| + | esac | ||
| + | </ | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * Trabaja sobre la carpeta en la que está y lee su '' | ||
| + | |||
| + | < | ||
| + | |||
| + | ===== Dónde corren Maven y los tests ===== | ||
| + | |||
| + | Las imágenes son de **ejecución**: | ||
| + | |||
| + | ^ Qué ^ Dónde ^ Contra qué ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | Son los tres comandos de tests del proyecto. Maven y npm funcionan igual en Linux, Windows y Mac, y son lo que ejecutan el alumno, el agente y CI (tema 7). '' | ||
| + | |||
| + | ==== npm run ==== | ||
| + | |||
| + | '' | ||
| + | |||
| + | <sxh json; | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Los dos scripts resetean la base de datos del worktree, esperan a que la aplicación esté sana y pasan los tests de un proyecto de Playwright ('' | ||
| + | |||
| + | Esto va en '' | ||
| + | |||
| + | ===== Ejercicios ===== | ||
| + | |||
| + | ==== Ejercicio 1 ==== | ||
| + | * Crea un issue «Aplicación en Docker» e inícialo con ''/ | ||
| + | * Pide al agente los dos '' | ||
| + | * Añade '' | ||
| + | * '' | ||
| + | * Entra en '' | ||
| + | |||
| + | ==== Ejercicio 2 ==== | ||
| + | * En el mismo worktree, pide al agente que añada JPA, MariaDB y Flyway, la migración '' | ||
| + | * Crea '' | ||
| + | * '' | ||
| + | * Arranca con '' | ||
| + | * Cambia un texto de la página de Angular, guarda y comprueba que el navegador se recarga solo. | ||
| + | |||
| + | ==== Ejercicio 3 ==== | ||
| + | * Añade a '' | ||
| + | * Escribe en '' | ||
| + | * ''/ | ||
| + | |||
| + | ==== Ejercicio 4 ==== | ||
| + | * Escribe '' | ||
| + | * Amplía ''/ | ||
| + | * Finaliza el issue. | ||
| + | |||
| + | ==== Ejercicio 5 ==== | ||
| + | * Crea dos issues cualesquiera, | ||
| + | * Cambia los datos de prueba en uno de los dos y comprueba que el otro no se entera. | ||
| + | * Finaliza los dos y comprueba con '' | ||
clase/daw/daw-proyecto/tema04.1791913274.txt.gz · Última modificación: por Lorenzo
