Introducción: de pipelines básicos a soluciones industriales
Un pipeline básico de CI/CD para un proyecto Java está bien. Pero en el desarrollo real, cuando el proyecto crece hasta tener decenas de módulos y el equipo está formado por varios desarrolladores, un simple `mvn clean test` deja de cumplir con los requisitos. Surgen preguntas: ¿cómo acelerar la compilación? ¿Cómo probar en diferentes versiones de JDK? ¿Cómo organizar la ejecución paralela de pruebas? ¿Cómo publicar artefactos automáticamente en Docker Hub?
En este artículo, analizaremos técnicas avanzadas de configuración de GitHub Actions para proyectos Java. Aprenderá cómo transformar su pipeline de una secuencia lineal de pasos a un potente sistema de integración y entrega continua, paralelo y optimizado.
1. Compilaciones matriciales: pruebas en múltiples JDK y SO
Una de las tareas clave de CI es garantizar que su código Java funcione en todas las plataformas compatibles. Ejecutar pruebas manualmente en Windows, macOS y Linux con diferentes versiones de JDK (11, 17, 21) es un lujo inaceptable. GitHub Actions ofrece una solución elegante: compilaciones matriciales (matrix builds).
Cómo funciona
Usted define una matriz de parámetros (versiones de JDK, sistemas operativos) y GitHub crea automáticamente un trabajo separado para cada combinación. Todos se ejecutan en paralelo.
Ejemplo de configuración
name: Java CI Matrixon: [push, pull_request]
jobs: build: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] java: [11, 17, 21] exclude: - os: windows-latest java: 21 # Excluimos JDK 21 en Windows, si no es compatible fail-fast: false # No detener los demás trabajos si uno falla
steps: - uses: actions/checkout@v4 - name: Set up JDK ${{ matrix.java }} uses: actions/setup-java@v4 with: java-version: ${{ matrix.java }} distribution: 'temurin' - name: Build with Maven run: mvn -B clean verify --file pom.xmlPuntos clave:
strategy.matrix— define las combinaciones de parámetros.exclude— permite excluir combinaciones que se sabe que no funcionan o son innecesarias.fail-fast: false— si un trabajo falla, los demás continúan. Esto proporciona una imagen completa de la compatibilidad.
2. Almacenamiento en caché de dependencias: acelere la compilación 2-3 veces
Cada ejecución del pipeline comienza con un entorno limpio. Maven o Gradle descargan todas las dependencias de los repositorios nuevamente. Esto puede llevar de 3 a 5 minutos. El almacenamiento en caché resuelve este problema guardando la carpeta ~/.m2/repository (para Maven) o ~/.gradle/caches (para Gradle) entre ejecuciones.
GitHub Actions proporciona la acción integrada actions/cache. La clave de caché se forma basándose en el archivo de dependencias (pom.xml). Si el archivo no ha cambiado, la caché se restaura instantáneamente.
Ejemplo para Maven
steps: - uses: actions/checkout@v4
- name: Cache Maven dependencies uses: actions/cache@v3 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} restore-keys: | ${{ runner.os }}-maven-
- name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin'
- name: Build with Maven run: mvn -B clean verify --file pom.xmlImportante: El almacenamiento en caché debe ir antes del paso de compilación. La clave hashFiles('**/pom.xml') garantiza que la caché solo se actualice cuando cambien las dependencias.
3. Ejecución paralela de pruebas y artefactos de compilación
Cuando su proyecto contiene cientos o miles de pruebas, y