From 4730a44e4cc3a085c1a6bd0d747d51ffc34efe8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isidoro=20Nevares=20Mart=C3=ADn?= Date: Thu, 19 Mar 2026 14:29:50 +0100 Subject: [PATCH] =?UTF-8?q?Incluye=20informacui=C3=B3n=20de=20docker=20y?= =?UTF-8?q?=20docker-compose?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 167 ++++++++++++++++++++++++++---------------------------- 1 file changed, 81 insertions(+), 86 deletions(-) diff --git a/README.md b/README.md index 233ddf1..2088ce2 100644 --- a/README.md +++ b/README.md @@ -1,104 +1,99 @@ -# CI/CD con Maven y GitHub Actions +# Uso de Docker y Docker Compose -## 1. Estructura del proyecto Maven +Este proyecto utiliza **Docker** para contenerizar la aplicación Spring Boot y **Docker Compose** para levantar la aplicación junto con MySQL. -Un proyecto Maven bien organizado es la base para que el pipeline de CI funcione sin problemas: +## Conceptos Clave -``` -proyecto/ -├── src/ -│ ├── main/java/ # Código de producción -│ └── test/java/ # Tests unitarios -└── pom.xml # Dependencias, plugins y versión de Java -``` +### Imágenes (`image`) +Contienen el sistema operativo, JDK/JRE y la aplicación empaquetada (`.jar`). -> **Regla clave:** Si `mvn clean install` funciona en local → debe funcionar en CI. +### Contenedores (`container`) +Instancias de las imágenes que se ejecutan de forma aislada. +Se pueden asignar nombres con `--name` para facilitar su gestión. ---- +### Multi-stage build +- **Stage 1**: build de Maven para generar el `.jar` +- **Stage 2**: runtime con JRE/JDK ligero -## 2. Dependencias y plugins esenciales +Permite que la imagen final sea **más ligera** y solo contenga lo necesario para ejecutar la app. -### Testing -- **`spring-boot-starter-test`** (proyectos Spring Boot): incluye JUnit 5, AssertJ y Mockito. - -### Plugins Maven importantes - -| Plugin | Función | -|--------|---------| -| `maven-compiler-plugin` | Compila el proyecto | -| `maven-surefire-plugin` | Ejecuta tests unitarios | -| `maven-failsafe-plugin` | Ejecuta tests de integración (opcional) | - ---- - -## 3. Tests - -Buenas prácticas para que los tests pasen en un entorno limpio de CI: - -- Deben ejecutarse **sin depender del IDE**. -- Evitar dependencias de rutas locales o bases de datos externas → usar **H2 en memoria** si es necesario. -- Nombres descriptivos con un único escenario por test: - ``` - metodo_cuandoCondicion_retornaResultado - ``` - ---- - -## 4. Flujo básico con GitHub Actions - -Archivo de configuración: `.github/workflows/ci-mvn.yml` +### Puertos (`ports`) +Se mapean del contenedor al host con el formato `"host:container"`. ```yaml -name: CI con Maven - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - name: Set up JDK - uses: actions/setup-java@v3 - with: - java-version: '23' - distribution: 'temurin' - - - name: Cache Maven packages - uses: actions/cache@v3 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven- - - - name: Build with Maven - run: mvn clean install +ports: + - "8080:8080" # acceso a Spring Boot desde el navegador ``` -### ¿Qué hace `mvn clean install`? -1. **clean** → Elimina artefactos anteriores -2. **compile** → Compila el código fuente -3. **test** → Ejecuta los tests unitarios -4. **package** → Genera el `.jar` o `.war` +### Variables de entorno (`environment`) +Configuran la aplicación y servicios externos como la conexión a MySQL. -> Si algún test falla, GitHub Actions marcará el workflow como **Failed** ✗ +```yaml +environment: + SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mapamundi + SPRING_DATASOURCE_USERNAME: root + SPRING_DATASOURCE_PASSWORD: secret +``` ---- +### Volúmenes (`volumes`) +Persisten datos fuera del contenedor. Hay dos tipos: -## 5. Buenas prácticas +- **Bind mounts**: montan una ruta específica del host (`./data:/var/lib/mysql`). El contenido depende de lo que haya en esa ruta local. +- **Named volumes**: gestionados por Docker (`db_data:/var/lib/mysql`), declarados al final del `docker-compose.yml`. Son la opción recomendada para bases de datos. -1. **Mantén el `pom.xml` limpio**: no sobreescribas versiones de dependencias gestionadas por Spring Boot. -2. **Evita dependencias del entorno local**: sin rutas absolutas ni servicios externos sin mock. -3. **Usa perfiles Maven** si necesitas configuraciones distintas para CI (p. ej., base de datos H2 para tests). -4. **Verifica la versión de Java**: el runner de GitHub Actions debe usar la misma que la configurada en el proyecto. -5. **Habilita la caché de Maven**: reduce significativamente el tiempo de build en cada ejecución. +```yaml +volumes: + db_data:/var/lib/mysql + +# Al final del docker-compose.yml: +volumes: + db_data: +``` + +### Redes (`networks`) +Docker Compose crea automáticamente una red interna para que los servicios se comuniquen por nombre (`db` en lugar de IP), permitiendo usar `jdbc:mysql://db:3306/...` en Spring Boot. + +### Dependencias entre servicios (`depends_on`) +Controla el orden de arranque, pero **solo garantiza que el contenedor haya iniciado**, no que el servicio esté listo para aceptar conexiones. MySQL puede tardar unos segundos en estar operativo, lo que puede provocar fallos en Spring Boot al arrancar. + +Para esperar a que MySQL esté realmente listo, se combina con `healthcheck`: + +```yaml +db: + image: mysql:8 + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] + interval: 10s + timeout: 5s + retries: 5 + +app: + depends_on: + db: + condition: service_healthy +``` + +## Comandos básicos + +```bash +# Construir imagen Docker (desde la carpeta en la que está el fichero Dockerfile) +docker build -t mapamundi-app . + +# Lanzar un contenedor asociado a una imagen Docker +docker run -p 8080:8080 --name mapamundi_sb_xxx mapamundi-app + +# Ver contenedores en ejecución +docker ps + +# Levantar servicios con Docker Compose (desde la carpeta en la que está el fichero docker-compose.yml) +docker compose up -d + +# Seguir los logs en tiempo real (muy útil en desarrollo) +docker compose logs -f + +# Detener contenedores +docker compose down +``` --- Fuentes: [ChatGPT](https://chat.openai.com) + [Claude](https://claude.ai) \ No newline at end of file