clase:daw:daw-proyecto:tema03
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| clase:daw:daw-proyecto:tema03 [2026/10/13 23:55] – Brushes de resaltado que existen en el wiki claude | clase:daw:daw-proyecto:tema03 [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: | ||
| - | ====== 3. Docker | + | ====== 3. Git 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, ''/ | + | Objetivo del tema: que nadie vuelva a escribir a mano un comando |
| - | Lo que ya sabéis y aquí no se repite: | + | Lo que ya sabéis y aquí no se repite: |
| - | ===== Tres contenedores ===== | + | * Git básico, '' |
| + | * Ramas, los tipos de merge, conflictos y, sobre todo, **worktrees** y por qué uno por rama cuando se trabaja con agentes: [[clase: | ||
| + | * Scrum y los tableros de GitHub: [[clase: | ||
| - | La aplicación son tres contenedores, | + | ===== Git en Windows ===== |
| - | ^ Servicio ^ Imagen ^ Qué hace ^ | + | En Linux y Mac, git viene con bash. En Windows, el instalador de Git ([[https:// |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | El navegador solo habla con '' | + | {{: |
| - | Los dos Dockerfile son **multi-stage** y los escribe la IA. Lo único | + | Elegir |
| - | <sxh bash;title:backend/ | + | {{:clase:daw:daw-proyecto:git-setup-pull.png?500|}} |
| - | FROM maven:3.9-eclipse-temurin-25 AS build | + | |
| - | WORKDIR /app | + | |
| - | COPY pom.xml . | + | |
| - | RUN --mount=type=cache, | + | |
| - | COPY src ./src | + | |
| - | RUN --mount=type=cache, | + | |
| - | FROM eclipse-temurin:25-jre | + | Elegir **«Only ever fast-forward»**. En este módulo nunca se hace '' |
| - | RUN apt-get update && apt-get install | + | |
| - | COPY --from=build / | + | ===== GitHub CLI: gh ===== |
| - | ENTRYPOINT [" | + | |
| - | </ | + | '' |
| - | El '' | + | * **Windows**: |
| + | * **Linux (Ubuntu, Debian, Mint)**: | ||
| + | * **Mac**: '' | ||
| - | <sxh bash; | + | Después, iniciar sesión una vez, eligiendo |
| - | FROM node:22 AS build | + | |
| - | WORKDIR | + | |
| - | COPY package*.json . | + | |
| - | RUN npm ci | + | |
| - | COPY . . | + | |
| - | RUN npx ng build --configuration production | + | |
| - | FROM nginx: | + | <sxh bash> |
| - | COPY nginx.conf / | + | gh auth login |
| - | COPY --from=build / | + | gh auth status |
| </ | </ | ||
| - | <sxh plain;title:frontend/ | + | Con eso '' |
| - | server { | + | |
| - | listen 80; | + | |
| - | root / | + | |
| - | location /api/ { | + | ===== El repositorio y el agente ===== |
| - | proxy_pass http:// | + | |
| - | } | + | |
| - | location | + | Antes de la primera skill hay que dejar el repositorio del tema 1 preparado para trabajar con el agente: su estructura, sus dos ramas, las instrucciones que lee el agente al empezar y los permisos que tiene. |
| - | | + | |
| - | } | + | ==== El repositorio del proyecto ==== |
| - | } | + | |
| + | Un único repositorio en GitHub, creado desde cero por cada alumno, con el backend y el frontend dentro: | ||
| + | |||
| + | < | ||
| + | mi-proyecto/ | ||
| + | ├── backend/ | ||
| + | ├── frontend/ | ||
| + | ├── compose.yaml | ||
| + | ├── compose.override.yaml | ||
| + | ├── app.sh | ||
| + | ├── .kiro/ | ||
| + | ├── docs/ <- detalle para el agente, si hace falta | ||
| + | ├── AGENTS.md | ||
| + | ├── CLAUDE.md | ||
| + | ├── .claude/ | ||
| + | │ | ||
| + | │ | ||
| + | └── .github/workflows/ <- CI y despliegue (tema 7) | ||
| + | </ | ||
| + | |||
| + | La estructura interna de '' | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | === Las dos ramas === | ||
| + | |||
| + | El proyecto tiene solo dos ramas oficiales: | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Se crean las dos en el primer commit y se cambia la rama por defecto en GitHub (//Settings → General → Default branch//) o con '' | ||
| + | |||
| + | <sxh bash> | ||
| + | git switch -c develop | ||
| + | git push -u origin develop | ||
| + | gh repo edit --default-branch develop | ||
| </ | </ | ||
| - | El '' | + | ==== Instrucciones para el agente: AGENTS.md ==== |
| - | ===== Producción | + | '' |
| - | Docker Compose carga '' | + | <sxh plain; |
| + | @AGENTS.md | ||
| + | </ | ||
| - | * '' | + | Así los dos agentes leen exactamente |
| - | * '' | + | |
| - | <sxh yaml; | + | Lo que va dentro, y nada más: |
| - | 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 | + | |
| - | | + | |
| - | build: ./backend | + | * **Cómo se compila, arranca y prueba**: los comandos exactos. En el tema 4 se añade dónde corren Maven y Playwright. |
| - | | + | * **Reglas del proyecto** que el agente tiene que respetar siempre: las ramas, que git se maneja con ''/ |
| - | SPRING_DATASOURCE_URL: | + | |
| - | SPRING_DATASOURCE_USERNAME: | + | |
| - | SPRING_DATASOURCE_PASSWORD: | + | |
| - | depends_on: | + | |
| - | db: | + | |
| - | condition: service_healthy | + | |
| - | networks: | + | |
| - | - interna | + | |
| - | healthcheck: | + | |
| - | test: [" | + | |
| - | interval: 5s | + | |
| - | retries: 20 | + | |
| - | frontend: | + | <note tip> |
| - | build: | + | |
| - | environment: | + | |
| - | VIRTUAL_HOST: | + | |
| - | depends_on: | + | |
| - | backend: | + | |
| - | condition: service_healthy | + | |
| - | networks: | + | |
| - | - interna | + | |
| - | - proxy | + | |
| - | volumes: | + | ==== Skills en este proyecto ==== |
| - | db-data: | + | |
| - | networks: | + | Qué es una skill y cómo se escribe está en el [[.:tema02# |
| - | | + | |
| - | | + | |
| - | | + | |
| - | name: nginx-proxy-network | + | * **Un subcomando por llamada**: todas las skills de tarea del proyecto reciben familia, sustantivo y verbo, como en el tema 1 (''/ |
| + | * **'' | ||
| + | |||
| + | <sxh yaml> | ||
| + | --- | ||
| + | name: estado | ||
| + | description: | ||
| + | allowed-tools: | ||
| + | --- | ||
| </ | </ | ||
| - | Los '' | + | '' |
| - | <sxh yaml;title:compose.override.yaml> | + | ==== Permisos del agente: lo básico ==== |
| - | services: | + | |
| - | db: | + | |
| - | ports: | + | |
| - | - " | + | |
| - | backend: | + | El agente pide permiso antes de ejecutar comandos o escribir ficheros. Aceptar uno a uno no es sostenible, y aceptar todo a ciegas tampoco. Lo justo para trabajar: |
| - | ports: | + | |
| - | - " | + | |
| - | environment: | + | |
| - | SPRING_PROFILES_ACTIVE: | + | |
| - | | + | |
| - | build: | + | |
| - | | + | <sxh json;title:.claude/ |
| - | | + | { |
| - | | + | " |
| - | | + | |
| - | | + | |
| - | ports: | + | |
| - | | + | " |
| + | "Bash(docker compose:*)" | ||
| + | ], | ||
| + | " | ||
| + | } | ||
| + | } | ||
| </ | </ | ||
| - | Lo que cambia en desarrollo: | + | * **OpenCode**: en '' |
| - | * **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. | + | En el tema 5 se completa |
| - | * **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 | + | ===== Issues y tablero |
| - | Dos worktrees con el mismo '' | + | Todo trabajo empieza por un **issue**. El issue es la unidad: de él sale la rama, su número va en los commits y al fusionar se cierra |
| - | <sxh bash;title:.env> | + | El tablero es un **GitHub Project** del repositorio con tres columnas: //Todo//, //In progress// y //Done//. De sus automatizaciones (// |
| - | COMPOSE_PROJECT_NAME=mi-proyecto-12-alta-clientes | + | |
| - | DB_PORT=33112 | + | Etiquetas: '' |
| - | BACKEND_PORT=8112 | + | |
| - | FRONTEND_PORT=4212 | + | Los issues se crean desde la web o con '' |
| - | DB_PASSWORD=dev | + | |
| + | <sxh bash> | ||
| + | gh issue create | ||
| + | gh issue list | ||
| + | gh issue view 12 | ||
| </ | </ | ||
| - | * '' | + | ===== Las ramas de este proyecto ===== |
| - | * Los puertos los busca ''/ | + | |
| - | * Las variables llevan valor por defecto, '' | + | |
| - | '' | + | El modelo de ramas de Despliegue 2 tiene '' |
| - | ===== 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 | + | Y por cada issue, una **rama |
| - | * Dependencias | + | ^ Cosa ^ Nombre ^ Ejemplo ^ |
| - | * Una migración | + | | Rama | '' |
| - | * Un '' | + | | Worktree | '' |
| - | El esquema **siempre** va en migraciones | + | El número del issue en el nombre |
| - | ===== Datos de prueba ===== | + | **Sin pull requests.** En un proyecto individual nadie va a revisar el PR, así que es un trámite que no aporta nada: la rama se fusiona en '' |
| - | Cada worktree | + | ===== El ciclo de una rama ===== |
| + | |||
| + | - **Iniciar**: | ||
| + | - **Trabajar** en el worktree. Commits pequeños | ||
| + | - **Actualizar**: | ||
| + | - **Finalizar**: | ||
| + | - **Publicar**: | ||
| + | |||
| + | Por qué '' | ||
| + | |||
| + | ==== El commit | ||
| + | |||
| + | GitHub cierra | ||
| < | < | ||
| - | backend/ | + | feat(#12): Alta de clientes |
| - | ├── migration/ | + | |
| - | └── datos-prueba/ | + | Closes #12 |
| </ | </ | ||
| - | Los de '' | + | Al hacer push de '' |
| - | <sxh plain;title:application-datos-prueba.properties> | + | ===== Reglas para que la IA toque git ===== |
| - | spring.flyway.locations=classpath:db/migration,classpath:db/datos-prueba | + | |
| - | </sxh> | + | Una skill que ejecuta git puede hacer daño si improvisa. Estas reglas van en la skill y no se negocian: |
| + | |||
| + | * **Nunca '' | ||
| + | * **Nunca '' | ||
| + | * **Nunca resolver un conflicto**. Si un merge da conflicto, la skill **se para**, enseña '' | ||
| + | * **La carpeta principal siempre en '' | ||
| + | * **Una operación por invocación**: '' | ||
| + | * **'' | ||
| + | |||
| + | ===== La skill /git-flow ===== | ||
| + | |||
| + | Se parte de la skill que ya enlaza Despliegue 2, {{ : | ||
| + | |||
| + | * Quitar '' | ||
| + | |||
| + | ^ Operación ^ Qué hace ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | * El nombre del alumno para las ramas se lee de '' | ||
| + | * Añadir '' | ||
| + | * '' | ||
| - | * En desarrollo | + | En el tema 4 '' |
| - | * En producción | + | |
| - | * Para volver al estado inicial (antes de pasar los E2E, por ejemplo): | + | |
| - | Cada entidad nueva trae su '' | + | <note>'' |
| - | ===== Dónde corren Maven y los tests ===== | + | ===== Ejercicios |
| + | Todos los ejercicios se hacen en el repositorio del tema 1. Desde el ejercicio 5, ningún comando de git se escribe a mano. | ||
| - | Las imágenes son de **ejecución**: el backend | + | ==== Ejercicio 1 ==== |
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| - | ^ Qué ^ Dónde ^ Contra qué ^ | + | ==== Ejercicio 2 ==== |
| - | | '' | + | * Crea la rama '' |
| - | | '' | + | * Ponla como rama por defecto en GitHub con '' |
| + | * Comprueba en la web del repositorio que al entrar se ve '' | ||
| - | Para que '' | + | ==== Ejercicio 3 ==== |
| + | * Escribe la skill '' | ||
| + | * Pon en '' | ||
| + | * Pruébala en Claude Code y en OpenCode. | ||
| + | * Crea '' | ||
| + | * Haz commit de todo y push a '' | ||
| - | Esto va en '' | + | ==== Ejercicio 4 ==== |
| + | * Crea el tablero del repositorio (GitHub Project) con las columnas //Todo//, //In progress// y //Done//. | ||
| + | * Comprueba | ||
| + | * Crea las etiquetas | ||
| + | * Crea con '' | ||
| - | ===== Práctica ===== | + | ==== Ejercicio 5 ==== |
| + | * Descarga {{ : | ||
| + | * Pide al agente que la adapte a este proyecto: quitar '' | ||
| + | * Pide que añada la operación '' | ||
| + | * Añade a '' | ||
| + | * Lee la skill entera y comprueba que '' | ||
| - | - Dockerfiles, | + | ==== Ejercicio 6 ==== |
| - | | + | * '' |
| - | | + | |
| - | | + | |
| - | | + | * En cada worktree, |
| + | * ''/ | ||
| + | * ''/ | ||
| - | **Prueba**: iniciar dos issues, tener las dos aplicaciones levantadas a la vez en puertos distintos, cada una con sus datos de prueba, cambiar un componente de Angular en una y ver que se recarga sola, y finalizar las dos comprobando con '' | + | ==== Ejercicio 7 ==== |
| + | | ||
| + | | ||
clase/daw/daw-proyecto/tema03.1791928512.txt.gz · Última modificación: por claude
