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/14 12:01] – Orden sustantivo-verbo en todos los subcomandos (/test unit run, /developer code review); los tests siempre por tipo, sin «todos» 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 / | + | |
| - | ENTRYPOINT [" | + | |
| - | </ | + | |
| - | El '' | + | ===== GitHub CLI: gh ===== |
| - | <sxh bash; | + | '' |
| - | FROM node:22 AS build | + | |
| - | WORKDIR /app | + | |
| - | COPY package*.json . | + | |
| - | RUN npm ci | + | |
| - | COPY . . | + | |
| - | RUN npx ng build --configuration production | + | |
| - | FROM nginx:alpine | + | * **Windows**: '' |
| - | COPY nginx.conf / | + | * **Linux (Ubuntu, Debian, Mint)**: '' |
| - | COPY --from=build | + | * **Mac**: '' |
| + | |||
| + | Después, iniciar sesión una vez, eligiendo | ||
| + | |||
| + | <sxh bash> | ||
| + | gh auth login | ||
| + | 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. |
| - | try_files $uri $uri/ /index.html; | + | |
| - | } | + | |
| - | } | + | |
| - | </ | + | |
| - | El '' | + | ==== El repositorio del proyecto ==== |
| - | ===== Producción y desarrollo | + | Un único repositorio en GitHub, creado desde cero por cada alumno, |
| - | Docker | + | < |
| + | mi-proyecto/ | ||
| + | ├── backend/ | ||
| + | ├── frontend/ | ||
| + | ├── compose.yaml | ||
| + | ├── | ||
| + | ├── app.sh | ||
| + | ├── .kiro/ | ||
| + | ├── docs/ <- detalle para el agente, si hace falta | ||
| + | ├── AGENTS.md | ||
| + | ├── CLAUDE.md | ||
| + | ├── .claude/ | ||
| + | │ | ||
| + | │ | ||
| + | └── .github/ | ||
| + | </ | ||
| + | |||
| + | La estructura interna de '' | ||
| - | | + | <note important> |
| - | * '' | + | |
| - | <sxh yaml; | + | === Las dos ramas === |
| - | 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: | + | El proyecto |
| - | 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 | + | |
| - | | + | |
| - | build: ./frontend | + | * '' |
| - | | + | |
| - | VIRTUAL_HOST: | + | |
| - | depends_on: | + | |
| - | backend: | + | |
| - | condition: service_healthy | + | |
| - | networks: | + | |
| - | - interna | + | |
| - | - proxy | + | |
| - | volumes: | + | Se crean las dos en el primer commit y se cambia la rama por defecto en GitHub (//Settings → General → Default branch//) o con '' |
| - | db-data: | + | |
| - | networks: | + | <sxh bash> |
| - | | + | git switch -c develop |
| - | | + | git push -u origin develop |
| - | | + | gh repo edit --default-branch develop |
| - | name: nginx-proxy-network | + | |
| </ | </ | ||
| - | Los '' | + | ==== Instrucciones para el agente: AGENTS.md ==== |
| - | <sxh yaml; | + | '' |
| - | services: | + | |
| - | db: | + | |
| - | ports: | + | |
| - | | + | |
| - | backend: | + | <sxh plain;title:CLAUDE.md> |
| - | ports: | + | @AGENTS.md |
| - | - " | + | |
| - | environment: | + | |
| - | SPRING_PROFILES_ACTIVE: | + | |
| - | + | ||
| - | frontend: | + | |
| - | build: | + | |
| - | target: build | + | |
| - | command: npx ng serve --host 0.0.0.0 --proxy-config proxy.conf.json | + | |
| - | | + | |
| - | - ./ | + | |
| - | - / | + | |
| - | ports: | + | |
| - | - " | + | |
| </ | </ | ||
| - | Lo que cambia en desarrollo: | + | Así los dos agentes leen exactamente lo mismo y solo hay un fichero |
| - | * **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. | + | Lo que va dentro, |
| - | * **El frontend pasa a '' | + | |
| - | * **El backend no tiene recarga en caliente**: cada cambio en Java es '' | + | |
| - | * **Datos de prueba** activados (abajo). | + | |
| - | <note important> | + | * **Qué |
| + | * **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** | ||
| - | ===== Un compose por worktree ===== | + | <note tip> |
| - | Dos worktrees con el mismo '' | + | ==== Skills |
| - | <sxh bash;title:.env> | + | Qué es una skill y cómo se escribe está en el [[.: |
| - | COMPOSE_PROJECT_NAME=mi-proyecto-12-alta-clientes | + | |
| - | DB_PORT=33112 | + | * **Dónde van**: en '' |
| - | BACKEND_PORT=8112 | + | * **Dos tipos**. Las **de tarea** se invocan escribiendo ''/ |
| - | FRONTEND_PORT=4212 | + | * **Un subcomando por llamada**: todas las skills de tarea del proyecto |
| - | DB_PASSWORD=dev | + | * **'' |
| + | |||
| + | <sxh yaml> | ||
| + | --- | ||
| + | name: estado | ||
| + | description: | ||
| + | allowed-tools: | ||
| + | --- | ||
| </ | </ | ||
| - | * '' | + | '' |
| - | * Los puertos los busca ''/ | + | |
| - | * Las variables llevan valor por defecto, '' | + | |
| - | ''/ | + | ==== Permisos del agente: lo básico ==== |
| - | ===== La primera tabla ===== | + | 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: |
| - | Hasta ahora el backend no tiene base de datos. Se añaden ahora, con un prompt directo | + | * **Claude Code**: ''/ |
| - | | + | <sxh json; |
| - | | + | { |
| - | | + | " |
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ], | ||
| + | " | ||
| + | | ||
| + | } | ||
| + | </sxh> | ||
| - | El esquema | + | |
| - | ===== Datos de prueba ===== | + | En el tema 5 se completa la lista con lo que haga falta para programar. |
| - | 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: | ||
| - | < | + | ===== Issues y tablero ===== |
| - | backend/src/main/resources/db/ | + | |
| - | ├── migration/ <- esquema: V1__clientes.sql, V2__pedidos.sql ... | + | 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 solo. |
| - | └── datos-prueba/ | + | |
| - | </ | + | El tablero es un **GitHub Project** del repositorio con tres columnas: |
| + | |||
| + | Etiquetas: '' | ||
| - | Los de '' | + | Los issues |
| - | < | + | < |
| - | spring.flyway.locations=classpath: | + | gh issue create --title "Alta de clientes" |
| + | gh issue list | ||
| + | gh issue view 12 | ||
| </ | </ | ||
| - | * En desarrollo el perfil lo activa '' | + | ===== Las ramas de este proyecto ===== |
| - | * En producción '' | + | |
| - | * Para volver al estado inicial (antes de pasar los E2E, por ejemplo): '' | + | |
| - | Cada entidad nueva trae su '' | + | El modelo de ramas de Despliegue 2 tiene '' |
| - | ===== El script app.sh ===== | + | * '' |
| + | * '' | ||
| - | Operar la aplicación es siempre lo mismo y no necesita ninguna inteligencia, así que no es una skill: es un script | + | Y por cada issue, una **rama |
| - | <sxh bash; | + | ^ Cosa ^ Nombre ^ Ejemplo ^ |
| - | # | + | | Rama | ''< |
| - | # La aplicación de este worktree: start | stop [-v] | status | logs | + | | Worktree | '' |
| - | set -e | + | |
| - | cd " | + | |
| - | case " | + | |
| - | start) | + | |
| - | docker network inspect nginx-proxy-network | + | |
| - | | + | |
| - | [ -f .env ] && | + | |
| - | echo " | + | |
| - | stop) | + | |
| - | status) docker compose ps ;; | + | |
| - | logs) | + | |
| - | *) echo "uso: $0 start | stop [-v] | status | logs"; exit 1 ;; | + | |
| - | esac | + | |
| - | </ | + | |
| - | * '' | + | El número del issue en el nombre |
| - | * '' | + | |
| - | * '' | + | |
| - | * Trabaja sobre la carpeta en la que está y lee su '' | + | |
| - | < | + | **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 |
| - | ===== Dónde corren Maven y los tests ===== | + | ===== El ciclo de una rama ===== |
| - | Las imágenes son de **ejecución**: el backend es un JRE sin Maven y el frontend es Nginx. Así que compilar y pasar tests se hace **en el host**, que para eso están instalados el JDK, Maven y Node: | + | - **Iniciar**: desde la carpeta principal (siempre en '' |
| + | - **Trabajar** en el worktree. Commits pequeños con '' | ||
| + | - **Actualizar**: | ||
| + | - **Finalizar**: | ||
| + | - **Publicar**: cuando hay algo que sacar, '' | ||
| - | ^ Qué ^ Dónde ^ Contra | + | Por 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 commit |
| - | ==== npm run ==== | + | GitHub cierra un issue automáticamente cuando llega a la **rama por defecto** un commit cuyo mensaje contiene '' |
| - | '' | + | <code> |
| + | feat(#12): Alta de clientes | ||
| - | <sxh json; | + | Closes #12 |
| - | " | + | </code> |
| - | | + | |
| - | | + | Al hacer push de '' |
| - | | + | |
| - | " | + | ===== Reglas para que la IA toque git ===== |
| - | } | + | |
| - | </sxh> | + | Una skill que ejecuta git puede hacer daño si improvisa. Estas reglas van en la skill y no se negocian: |
| + | |||
| + | | ||
| + | | ||
| + | * **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 '' | ||
| + | * '' | ||
| - | 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 ('' | + | En el tema 4 '' |
| - | Esto va en '' | + | < |
| ===== Ejercicios ===== | ===== 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. | ||
| ==== Ejercicio 1 ==== | ==== Ejercicio 1 ==== | ||
| - | * Crea un issue «Aplicación en Docker» e inícialo con '' | + | * Instala |
| - | * Pide al agente los dos '' | + | * Escribe |
| - | * Añade | + | * Crea '' |
| - | * '' | + | * Abre una conversación nueva en Claude Code y otra en OpenCode y pregunta al agente cómo se arranca |
| - | * Entra en '' | + | |
| ==== Ejercicio 2 ==== | ==== Ejercicio 2 ==== | ||
| - | * En el mismo worktree, pide al agente que añada JPA, MariaDB y Flyway, | + | * Crea la rama '' |
| - | * Crea '' | + | * Ponla como rama por defecto en GitHub con '' |
| - | * '' | + | * Comprueba en la web del repositorio |
| - | * Arranca con '' | + | |
| - | * Cambia un texto de la página de Angular, guarda y comprueba que el navegador se recarga solo. | + | |
| ==== Ejercicio 3 ==== | ==== Ejercicio 3 ==== | ||
| - | * Añade a '' | + | * Escribe la skill '' |
| - | * Escribe | + | * Pon en '' |
| - | * ''/ | + | * Pruébala en Claude Code y en OpenCode. |
| + | * Crea '' | ||
| + | * Haz commit | ||
| ==== Ejercicio 4 ==== | ==== Ejercicio 4 ==== | ||
| - | * Escribe '' | + | * Crea el tablero |
| - | * Amplía | + | * Comprueba en los // |
| - | * Finaliza el issue. | + | * Crea las etiquetas |
| + | * Crea con '' | ||
| ==== Ejercicio 5 ==== | ==== Ejercicio 5 ==== | ||
| - | * Crea dos issues cualesquiera, | + | * Descarga {{ : |
| - | * Cambia los datos de prueba | + | * Pide al agente que la adapte a este proyecto: quitar '' |
| - | * Finaliza los dos y comprueba con '' | + | * Pide que añada la operación '' |
| + | * Añade a '' | ||
| + | * Lee la skill entera y comprueba que '' | ||
| + | |||
| + | ==== Ejercicio 6 ==== | ||
| + | * ''/ | ||
| + | * Pasa los dos issues | ||
| + | * En el primer worktree pide al agente | ||
| + | * En cada worktree, | ||
| + | * ''/ | ||
| + | * ''/ | ||
| + | |||
| + | ==== Ejercicio 7 ==== | ||
| + | * ''/ | ||
| + | * Con la carpeta principal en '' | ||
clase/daw/daw-proyecto/tema03.1791972074.txt.gz · Última modificación: por claude
