Qué se rompe cuando ubuntu-latest pasa a Ubuntu 26.04 en GitHub Actions

Foto de Marco Orta | 8 min de lectura
Portada tipográfica sobre fondo verde oscuro: ubuntu-latest y Ubuntu 26.04 en letras grandes y un diff de dos líneas que cambia ubuntu-24.04 por ubuntu-26.04
Tabla de Contenidos

    GitHub está moviendo la etiqueta ubuntu-latest de Ubuntu 24.04 a Ubuntu 26.04: el despliegue empezó el 19 de octubre de 2026 y GitHub dice que terminará el 19 de noviembre. Si tu workflow dice runs-on: ubuntu-latest, durante estas semanas algunos jobs ya corren en 26.04 y otros todavía en 24.04, así que un fallo que aparece y desaparece sin que hayas tocado nada tiene un sospechoso obvio. Lo que cambia por debajo es mucho: kernel 7.0, Node 24 por defecto, PHP 8.5, Python 3.14, Docker 29, Java 25 y once herramientas que dejaron de venir preinstaladas.

    El arreglo de emergencia cabe en una línea (runs-on: ubuntu-24.04) y está en el propio aviso de GitHub. Lo que sigue es para que sepas qué se rompe antes de decidir si fijas la versión o migras. Todo sale de los avisos y del README de la imagen en actions/runner-images, consultados el 13 de noviembre de 2026; donde algo es un reporte abierto de un usuario y no una decisión de GitHub, lo digo.

    El calendario

    FechaQué pasó o pasaFuente
    11-jun-2026Ubuntu 26.04 y 26.04 Arm, en vista previa pública#14226
    17-sep-2026Disponibilidad general: etiquetas ubuntu-26.04 y ubuntu-26.04-arm#14747
    17-sep-2026Aviso de que ubuntu-latest pasará a 26.04#14748
    19-oct-2026Empieza el despliegue gradual de ubuntu-latest#14748
    19-nov-2026Fecha prevista para terminar la migración#14748
    17-abr-2027Se retira ubuntu-22.04#14254

    El aviso habla de la etiqueta ubuntu-latest x64; las etiquetas fijas (ubuntu-24.04, ubuntu-26.04) no cambian de significado. Es la misma mecánica de lo que se rompió con GitHub Actions este otoño: el aviso lo dan con semanas de margen y casi nadie lo lee hasta que un job falla.

    Qué cambia en la imagen

    La tabla compara el README de Ubuntu 24.04 (imagen 20261111) con el de Ubuntu 26.04 (imagen 20261101). Las versiones exactas cambian con cada imagen semanal; lo que importa es el salto de línea mayor.

    ComponenteUbuntu 24.04Ubuntu 26.04
    Sistema24.04.5 LTS26.04.1 LTS
    Kernel6.177.0
    systemd255259
    Node.js por defecto22.23.424.22.2
    PHP8.3.68.5.4
    Python3.12.33.14.4
    Ruby3.2.33.3.8
    Perl5.38.25.40.1
    Docker (cliente y servidor)28.0.429.4.2
    Docker Compose2.38.25.1.3
    GCC13.215.2
    Java por defecto1725
    p7zip-full16.02reemplazado por 7zip 26.00

    Los números de kernel y systemd son los que da GitHub en el aviso #14748; el resto, los del README de cada imagen.

    Lo que se rompe, por impacto

    1. Java por defecto pasa de 17 a 25, y Java 8 desaparece

    El aviso lo dice sin rodeos: «Default version updated to Java 25». Un build de Maven o Gradle que no declara versión (sin actions/setup-java) ya no compila con 17. Además, la lista de JDK de 26.04 es 11, 17, 21 y 25: no hay JAVA_HOME_8_X64, y en 24.04 sí había un Java 8. La solución es la de siempre y sirve en cualquier imagen: declarar la versión.

    - uses: actions/setup-java@v4
      with:
        distribution: temurin
        java-version: '21'
    

    2. Docker 29 y Compose 5: la primera vez que cambia el cliente en mucho tiempo

    Docker sube de 28.0.4 a 29.4.2 y Compose de 2.38.2 a 5.1.3. No probé tus pipelines, pero hay dos reportes abiertos que conviene conocer:

    • Contenedores i386 sin red. En #14790 un usuario reporta que Docker 29.4.2 trae un perfil seccomp que bloquea socketcall(2); las imágenes i386 con glibc no resuelven nombres. Según el reporte, Docker 29.4.3 o posterior ya lo revierte. Las imágenes basadas en musl (i386/alpine) no se ven afectadas. Es un reporte de usuario, no una nota de GitHub; el README de hoy sigue listando 29.4.2.
    • Disco. En #15233 alguien reporta que un docker build con una capa grande se quedó sin espacio en ubuntu-latest durante el despliegue y que fijando ubuntu-24.04 terminó. Es un solo caso, abierto, sin causa confirmada: no lo des por hecho, pero si tus builds de imágenes grandes empiezan a fallar con «no space left on device», es el primer sitio donde mirar.

    3. Node, PHP y Python por defecto suben de línea mayor

    Si tu job usa el node, php o python3 del sistema en vez de setup-node, setup-php o setup-python, hoy ejecuta Node 24, PHP 8.5 y Python 3.14. Un proyecto que sigue en Laravel 12 corre bien en PHP 8.5 (Laravel 12 soporta 8.2 a 8.5, según las notas de versión), pero uno con dependencias que no declaran 8.5 puede fallar en composer install. La solución es dejar de depender del valor por defecto: shivammathur/setup-php con php-version: '8.3' y actions/setup-node con node-version: 22 o 26 (qué cambia en Node 26).

    4. Herramientas que ya no vienen preinstaladas

    Comparando los dos README, estas once desaparecen de 26.04: Fastlane, Haveged, Julia, Lerna, MediaInfo, Mercurial, Miniconda, Newman, Parcel, Pulumi y Sphinx Open Source Search Server. No encontré un aviso de GitHub que las enumere; es el resultado de comparar las listas de herramientas de los dos README el 13 de noviembre, así que si falta alguna en mi lista es porque no la detecté. Un lerna run o un pulumi up que antes «simplemente funcionaba» ahora da command not found; instálalo en el job (npm i -g lerna, pulumi/actions, etc.).

    Y un detalle de paquetes de sistema: p7zip-full y p7zip-rar quedaron como 7zip y 7zip-rar. Si tu workflow hace apt-get install p7zip-full, comprueba que el paquete siga existiendo en 26.04 o cámbialo por 7zip.

    5. Cosas más finas del sistema

    • /etc/sysctl.conf no se aplica al arrancar. #15108 (abierto): la imagen escribe fs.inotify.max_user_instances=1280 y max_user_watches=655360, pero en 26.04 el kernel conserva 128 y 64097 porque systemd ya no lee ese archivo. Si un watcher de archivos (Vite, Jest en modo watch, webpack) falla con ENOSPC o «too many open files», es esto. Tu job puede subirlos con sudo sysctl -w.
    • setfacl falla. #15004 (abierto) lo reporta rompiendo openai/codex-action.
    • Podman rootless tiene reportes de AppArmor (#15184, #15182). Si usas Podman en lugar de Docker, mira esos dos.
    • Azure DevOps: el usuario del agente pasó de vsts a runner (#15028); afecta rutas con /home/.... No toca a GitHub Actions estándar.

    Cómo saber si te toca

    # Workflows que usan ubuntu-latest (los afectados)
    grep -rn "ubuntu-latest" .github/workflows/
    
    # En una organización, con la CLI de GitHub
    gh search code "ubuntu-latest" --owner TU_ORG --filename "*.yml" --limit 100
    

    Y para ver en qué sistema corrió realmente un job, añade un paso al principio del workflow: cat /etc/os-release | grep VERSION=. Durante el despliegue, el mismo workflow puede dar 24.04 hoy y 26.04 mañana.

    Qué hacer

    1. Probar ya en 26.04 sin tocar el workflow principal: una copia con runs-on: ubuntu-26.04 (GitHub lo recomienda en el aviso para probar explícitamente la imagen nueva).
    2. Si falla y no tienes tiempo: fija runs-on: ubuntu-24.04. Es la vía de escape que ofrece el propio aviso. No es una solución permanente: una etiqueta fija deja de recibir imágenes nuevas algún día, y no encontré en los avisos de hoy una fecha de retiro de 24.04, así que revisa actions/runner-images cada tanto.
    3. Declarar versiones explícitas de Java, Node, PHP y Python con las acciones setup-*. Es lo que evita que el próximo cambio de ubuntu-latest te sorprenda.
    4. Abandonar la dependencia de herramientas preinstaladas que no son de uso común: instálalas en el job.

    El CI de este sitio corre en ubuntu-latest (con un respaldo configurable) y declara Node 24 con actions/setup-node, así que no depende del Node del sistema: es la regla que aplico, nada que importe se hereda de la imagen.

    Preguntas frecuentes

    ¿Cuándo pasa ubuntu-latest a Ubuntu 26.04?

    GitHub empezó el despliegue gradual el 19 de octubre de 2026 y prevé terminarlo el 19 de noviembre de 2026, según el aviso 14748 de actions/runner-images. Mientras dura, el mismo workflow puede correr en 24.04 o en 26.04.

    ¿Cómo me quedo en Ubuntu 24.04?

    Cambia runs-on: ubuntu-latest por runs-on: ubuntu-24.04. Es la mitigación que propone el aviso de GitHub. Para probar la imagen nueva sin migrar todo, usa runs-on: ubuntu-26.04 en una copia del workflow.

    ¿Qué versiones de Node, PHP y Python trae Ubuntu 26.04 en GitHub Actions?

    Según el README de la imagen del 1 de noviembre de 2026: Node.js 24.22.2, PHP 8.5.4 y Python 3.14.4 (Ubuntu 24.04 trae Node 22.23.4, PHP 8.3.6 y Python 3.12.3). Para no depender del valor por defecto, usa setup-node, setup-php y setup-python.

    ¿Qué herramientas quitaron de la imagen de Ubuntu 26.04?

    Comparando el README de 24.04 con el de 26.04 el 13 de noviembre de 2026, ya no aparecen Fastlane, Haveged, Julia, Lerna, MediaInfo, Mercurial, Miniconda, Newman, Parcel, Pulumi ni Sphinx Open Source Search Server. GitHub no publicó esa lista en un aviso; es el resultado de la comparación.

    ¿Cambia ubuntu-latest también en los runners ARM?

    El aviso 14748 habla de la etiqueta x64 ubuntu-latest. Las etiquetas ubuntu-26.04 y ubuntu-26.04-arm existen desde el 17 de septiembre de 2026 y se pueden usar explícitamente en cualquier momento.

    ¿Te sirvió? Compártelo

    ¿Te sirvió? Recibe la próxima por correo

    Una vez por semana: qué se rompe al actualizar, IA para desarrolladores y lo que estoy construyendo, con fuentes. Sin spam.

    Al suscribirte aceptas nuestro aviso de privacidad.

    Buscar

    Etiquetas

    Migración PHP IA Laravel JavaScript Tutorial Seguridad Desarrollo Web Upgrade Buenas Prácticas SEO Agentes MCP OpenAI Backend