Blog LLMs Cloud

setup-java v5.5.0: verificación de JDKs, Kona JDK y mejoras para Maven en GitHub Actions

Pipeline de GitHub Actions instalando un JDK verificado criptográficamente para compilar un proyecto Java

actions/setup-java es una de esas piezas de infraestructura que suelen pasar desapercibidas hasta que algo falla: una versión de JDK que cambia, una caché de Maven que no se restaura como esperábamos, un runner efímero que descarga binarios en cada ejecución o una cadena de suministro que depende de artefactos externos sin validación explícita. La versión v5.5.0 introduce cambios relevantes precisamente en ese punto intermedio entre productividad y seguridad: verificación criptográfica de los JDK descargados, soporte para Kona JDK y varias mejoras orientadas a usuarios de Maven.

Aunque el anuncio es breve, el impacto práctico es importante para equipos que ejecutan builds Java en GitHub Actions, especialmente cuando esos builds terminan produciendo imágenes de contenedor, paquetes internos, funciones serverless o artefactos desplegados en Azure. En un pipeline moderno, el JDK no es solo una herramienta de compilación; es una dependencia crítica de la cadena de suministro.

Por qué setup-java importa en una cadena CI/CD Java

actions/setup-java es la acción oficial de GitHub para instalar y configurar un JDK dentro de un workflow de GitHub Actions. Su uso habitual parece sencillo: se declara una distribución, una versión de Java y, opcionalmente, una estrategia de caché para Maven, Gradle o SBT. A partir de ahí, el runner puede compilar, ejecutar tests, publicar paquetes o construir imágenes.

El riesgo está en que esta simplicidad oculta una operación delicada: descargar software ejecutable desde una fuente externa durante el build. Si ese binario se sustituye, se corrompe o se obtiene desde un canal no esperado, el pipeline puede compilar con una herramienta comprometida. En aplicaciones empresariales, ese escenario debe analizarse como parte del modelo de amenazas de la plataforma, igual que haríamos con dependencias de terceros, secretos de despliegue o tokens de federación. Este enfoque conecta directamente con las prácticas descritas en modelado de amenazas en aplicaciones de IA, aunque aquí el dominio sea CI/CD: el punto clave es identificar activos, límites de confianza y vectores de manipulación antes de que el incidente ocurra.

La versión v5.5.0 de setup-java refuerza ese límite de confianza al añadir verificación criptográfica de firmas para los JDK descargados. No elimina la necesidad de controlar permisos, revisar workflows o fijar versiones, pero reduce una clase concreta de riesgo: consumir un JDK que no coincide con lo publicado por el proveedor esperado.

Qué cambia en setup-java v5.5.0

El cambio más importante anunciado para setup-java v5.5.0 es la verificación de firmas criptográficas de los JDK descargados. En la práctica, esto significa que la acción puede validar que el artefacto recibido corresponde a una publicación firmada por el origen esperado, en lugar de limitarse a descargar y extraer un paquete.

Además, la versión incorpora soporte para una nueva distribución, Kona JDK, y mejoras de calidad de vida para usuarios de Maven. Estas mejoras no siempre son tan visibles como una nueva feature de lenguaje, pero suelen tener más impacto operativo: reducen fricción en workflows repetidos cientos de veces al día y ayudan a mantener builds reproducibles.

Note: El anuncio de GitHub se centra en los cambios introducidos desde v5.4.0. Si tu organización usa una versión anterior de actions/setup-java, conviene revisar también las notas de versiones intermedias antes de actualizar directamente en workflows críticos.

Verificación criptográfica de JDKs descargados

La verificación criptográfica responde a una pregunta sencilla: ¿el JDK que acaba de descargar el runner es realmente el JDK publicado por el proveedor? Sin verificación, el pipeline puede validar propiedades indirectas, como que la URL responde, que el archivo se descomprime correctamente o que java -version devuelve una versión esperada. Eso no es equivalente a verificar procedencia.

En una cadena CI/CD, el JDK tiene privilegios amplios durante el build. Ejecuta compiladores, plugins, tests, generadores de código, tareas Maven y herramientas auxiliares. Si el binario estuviera manipulado, podría alterar artefactos, filtrar secretos presentes en el entorno o introducir modificaciones que no aparecen en el repositorio. Este tipo de riesgo se parece más a un problema de identidad y confianza que a un simple problema de disponibilidad. La misma lógica de controles fuertes que se aplica a usuarios, tokens y accesos, como se explica en las prioridades de seguridad de identidad y acceso, debe extenderse a las herramientas que ejecutan nuestros pipelines.

La verificación de firmas no convierte automáticamente un workflow en seguro, pero proporciona una garantía adicional: el artefacto fue firmado por quien debía firmarlo y no fue modificado desde entonces. En términos de defensa en profundidad, es una capa muy valiosa porque protege un punto que a menudo queda implícito.

Un workflow básico actualizado a [email protected] podría tener este aspecto para un proyecto Maven con Java 21:

name: build-java

on:
  pull_request:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
      - name: Descargar el repositorio
        uses: actions/checkout@v4

      - name: Configurar Java 21 con Temurin
        uses: actions/[email protected]
        with:
          distribution: temurin
          java-version: '21'
          cache: maven

      - name: Compilar y ejecutar tests
        run: mvn --batch-mode verify

La parte relevante no es solo el cambio de versión de la acción. El workflow fija permisos mínimos con contents: read, configura una distribución concreta y activa caché de Maven de forma explícita. La verificación introducida por v5.5.0 actúa durante la fase de obtención del JDK, antes de que Maven ejecute el build.

Warning: Evita usar referencias flotantes como actions/setup-java@main en pipelines de producción. Aunque @v5.5.0 facilita recibir exactamente esa versión, algunas organizaciones prefieren fijar acciones por SHA para reducir aún más la superficie de cambio. La elección depende del modelo de gobierno del repositorio.

Kona JDK: una nueva distribución disponible en el workflow

La segunda novedad destacada es el soporte para Kona JDK. Kona es una distribución de OpenJDK mantenida por Tencent. Su incorporación a setup-java permite seleccionarla como distribución dentro de los workflows, igual que se hace con otras distribuciones soportadas por la acción.

La elección de distribución no es un detalle menor. Aunque las distribuciones OpenJDK comparten una base común, pueden diferir en cadencia de parches, plataformas soportadas, políticas de soporte, certificaciones, empaquetado y comportamiento operativo en determinados entornos. Para la mayoría de proyectos, Temurin, Microsoft Build of OpenJDK, Zulu, Corretto u otras distribuciones conocidas serán suficientes. Sin embargo, hay organizaciones que estandarizan en una distribución específica por compatibilidad, soporte regional, requisitos regulatorios o alineamiento con su plataforma de ejecución.

Note: El anuncio confirma soporte para Kona JDK en setup-java v5.5.0, pero no detalla en el resumen público todos los valores, versiones o combinaciones soportadas. Antes de adoptar Kona en producción, valida la matriz exacta en la documentación oficial de actions/setup-java y en un repositorio de pruebas.

Un ejemplo de configuración con Kona seguiría el mismo patrón que cualquier otra distribución soportada por la acción. Si la documentación oficial confirma el identificador kona, el workflow sería similar al siguiente:

name: build-with-kona

on:
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
      - name: Descargar el código fuente
        uses: actions/checkout@v4

      - name: Configurar Kona JDK
        uses: actions/[email protected]
        with:
          distribution: kona
          java-version: '17'
          cache: maven

      - name: Validar versión de Java
        run: java -version

      - name: Ejecutar build Maven
        run: mvn --batch-mode clean verify

Lo importante de este ejemplo es separar dos decisiones que a veces se mezclan: la versión del lenguaje (java-version) y la distribución (distribution). Java 17 puede ejecutarse con distintas distribuciones; elegir Kona implica decidir quién proporciona ese runtime concreto y cómo encaja en la política de soporte de la organización.

Mejoras para Maven: menos fricción en builds repetibles

Maven sigue siendo una pieza central en muchos proyectos Java empresariales. En GitHub Actions, su rendimiento y estabilidad dependen en gran medida de cómo se gestionan las dependencias descargadas en ~/.m2/repository, de cómo se resuelven repositorios privados y de cómo se parametriza la ejecución en runners efímeros.

setup-java ya ofrecía integración con caché para Maven mediante cache: maven. Esta opción permite reducir tiempos de build al restaurar dependencias entre ejecuciones cuando el archivo de dependencias no cambia. Las mejoras de calidad de vida incluidas en v5.5.0 apuntan a simplificar o corregir aspectos de esa experiencia, aunque el anuncio resumido no enumera aquí cada fix concreto. La lectura operativa es clara: si tus builds Maven dependen de setup-java, actualizar puede resolver comportamientos incómodos sin requerir cambios profundos en el proyecto.

Una configuración habitual para Maven en CI debería priorizar tres objetivos: salida estable, ejecución no interactiva y caché controlada. El siguiente workflow combina esos elementos:

name: maven-ci

on:
  pull_request:
  push:
    branches:
      - main

jobs:
  verify:
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
      - name: Descargar el repositorio
        uses: actions/checkout@v4

      - name: Configurar JDK y caché Maven
        uses: actions/[email protected]
        with:
          distribution: temurin
          java-version: '21'
          cache: maven

      - name: Verificar proyecto
        run: mvn --batch-mode --no-transfer-progress verify

El parámetro --batch-mode evita prompts interactivos y adapta Maven a entornos CI. --no-transfer-progress reduce ruido en logs, algo especialmente útil cuando hay muchas dependencias. La caché gestionada por setup-java elimina parte de la configuración manual que antes se resolvía con actions/cache.

En proyectos con varios módulos o builds de larga duración, la claridad de los logs se vuelve un factor de seguridad y mantenibilidad. Si un pipeline oculta errores relevantes entre miles de líneas de descarga, el tiempo medio de diagnóstico aumenta. Lo mismo ocurre en sistemas más complejos, como servicios que combinan backend Java con componentes de IA generativa en .NET. En esos entornos híbridos, como los descritos en implementaciones de IA generativa con Large Language Models en C#, la consistencia de la plataforma CI/CD es tan importante como el código de aplicación.

Recomendaciones para actualizar desde v5.4.0

Actualizar de [email protected] a [email protected] debería ser una operación sencilla en la mayoría de workflows, pero no conviene tratarla como un cambio puramente cosmético. La acción participa en una fase crítica del build y puede afectar a resolución de JDK, caché y comportamiento de Maven.

Una estrategia razonable es empezar por repositorios de bajo riesgo o workflows ejecutados bajo demanda. Después, comparar tiempos de build, logs de resolución de Java, restauración de caché y resultados de tests. Si el proyecto usa matrices con varias versiones de Java, conviene validar todas las combinaciones, no solo la versión principal.

strategy:
  fail-fast: false
  matrix:
    java-version: ['17', '21']
    distribution: ['temurin']

steps:
  - name: Descargar el repositorio
    uses: actions/checkout@v4

  - name: Configurar Java $
    uses: actions/[email protected]
    with:
      distribution: $
      java-version: $
      cache: maven

  - name: Ejecutar verificación
    run: mvn --batch-mode --no-transfer-progress verify

Este patrón permite detectar diferencias entre versiones de Java sin duplicar workflows. fail-fast: false evita que un fallo en una combinación cancele el resto de la matriz, lo que facilita saber si el problema afecta solo a una versión o distribución concreta.

Warning: Si tu build depende de repositorios Maven privados, credenciales inyectadas en settings.xml o perfiles específicos, valida la actualización en ramas protegidas antes de aplicarla globalmente. Un fallo de autenticación puede parecer un problema de Maven cuando en realidad procede de permisos, secretos o configuración del workflow.

Seguridad de supply chain: más allá del JDK

La verificación de firmas del JDK cubre una pieza concreta, pero el pipeline Java típico descarga muchas más cosas: dependencias Maven, plugins de build, imágenes base, acciones de terceros y herramientas auxiliares. Cada una añade una relación de confianza. Por eso, actualizar setup-java debe verse como parte de un programa más amplio de seguridad de supply chain.

Un enfoque práctico consiste en revisar los puntos donde el workflow ejecuta código externo. Las acciones deben fijarse a versiones explícitas, los permisos del token de GitHub deben minimizarse por job, los secretos deben limitarse a workflows que realmente los necesitan y las dependencias deben evaluarse con herramientas de análisis. En organizaciones con amenazas activas de robo de credenciales o manipulación de sesiones, la seguridad del pipeline también se cruza con técnicas de phishing y acceso no autorizado. El análisis de cómo operaba Tycoon2FA como kit de phishing AiTM ilustra por qué los controles técnicos deben asumir que las credenciales pueden ser objetivo directo.

También conviene separar builds de pull requests externos de workflows con permisos elevados. Un pull request no confiable no debería tener acceso a secretos de publicación, credenciales de repositorios privados o tokens con permisos de escritura. La instalación de un JDK verificado mejora la confianza en la herramienta descargada, pero no protege contra un workflow que ejecuta comandos peligrosos con permisos excesivos.

Patrón recomendado para proyectos Java en Azure

En proyectos Java desplegados en Azure App Service, Azure Container Apps, Azure Kubernetes Service o Azure Functions, el pipeline suele tener dos fases: validación del código y publicación del artefacto. setup-java v5.5.0 encaja especialmente bien en la primera fase, donde el objetivo es compilar y probar de forma reproducible antes de construir imágenes o desplegar.

Un patrón básico separa el job de verificación del job de publicación. El primero usa permisos mínimos y no requiere secretos de despliegue. El segundo solo se ejecuta tras pasar tests y, normalmente, en ramas protegidas o releases etiquetadas.

name: java-azure-pipeline

on:
  push:
    branches:
      - main
  pull_request:

jobs:
  verify:
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
      - name: Descargar código
        uses: actions/checkout@v4

      - name: Configurar JDK verificado
        uses: actions/[email protected]
        with:
          distribution: temurin
          java-version: '21'
          cache: maven

      - name: Ejecutar tests
        run: mvn --batch-mode --no-transfer-progress verify

  package:
    needs: verify
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
      - name: Descargar código
        uses: actions/checkout@v4

      - name: Configurar JDK para empaquetado
        uses: actions/[email protected]
        with:
          distribution: temurin
          java-version: '21'
          cache: maven

      - name: Crear paquete
        run: mvn --batch-mode --no-transfer-progress package -DskipTests

Este ejemplo no incluye autenticación contra Azure porque el mecanismo exacto depende de la plataforma de destino y de si se usa federación OIDC, publicación de contenedores o despliegue directo. Lo relevante es la estructura: verificar primero, empaquetar después y mantener la configuración del JDK consistente en ambos jobs.

Checklist de adopción

Antes de aplicar setup-java v5.5.0 en todos los repositorios, merece la pena revisar algunos puntos operativos. Esta lista está pensada para equipos que mantienen varios servicios Java y quieren evitar actualizaciones manuales inconsistentes.

  • Identificar workflows que usen actions/setup-java con versiones anteriores.
  • Confirmar distribuciones y versiones de Java soportadas por cada proyecto.
  • Actualizar primero workflows no críticos o ejecutados bajo demanda.
  • Revisar logs de instalación del JDK y restauración de caché Maven.
  • Validar builds con repositorios Maven privados si existen.
  • Comprobar que los jobs usan permisos mínimos.
  • Evitar referencias flotantes a acciones en pipelines productivos.
  • Documentar la distribución estándar recomendada para nuevos servicios Java.

Esta revisión no debería ser un proceso pesado. De hecho, uno de los beneficios de acciones como setup-java es estandarizar configuración repetitiva. Pero la estandarización solo funciona si se acompaña de criterios claros: qué distribución se usa, qué versiones se soportan, cómo se cachea Maven y qué permisos recibe cada job.

Conclusión

setup-java v5.5.0 es una actualización pequeña en superficie, pero relevante para la calidad de los pipelines Java. La verificación criptográfica de JDKs descargados refuerza la cadena de suministro en un punto sensible; el soporte para Kona JDK amplía las opciones de distribución; y las mejoras para Maven reducen fricción en builds cotidianos.

Para equipos que compilan servicios Java destinados a Azure, la recomendación práctica es evaluar la actualización de forma controlada y convertirla en parte de una revisión más amplia de CI/CD. Un JDK verificado no sustituye al control de permisos, al aislamiento de secretos o a la revisión de dependencias, pero sí añade una capa de confianza donde antes muchas organizaciones simplemente asumían que la descarga era correcta.

En pipelines modernos, la seguridad no empieza en producción. Empieza en el primer binario que el runner descarga para construir el software.