Skipbox

ubuntu-latest is moving to Ubuntu 26.04 (October 19 to November 19, 2026): what breaks and how to pin 24.04

GitHub is moving the ubuntu-latest label from Ubuntu 24.04 to Ubuntu 26.04, and its changelog says the migration "will roll out gradually between October 19 and November 19, 2026" (read on November 9, 2026). Until it finishes, a job on ubuntu-latest can land on either image, so a build can break with no change to your workflow. Pin runs-on: ubuntu-24.04 to keep the old image while you fix the job, and read the Runner Image lines in the job's Set up job step to see which image ran.

Skipbox publishes this post and sells a runner. Everything below comes from GitHub's changelog, GitHub's runner-images repository and Ubuntu's release notes, read on November 9, 2026 and linked under Sources.

What is changing, and when

GitHub made Ubuntu 26.04 generally available on September 17, 2026, as the ubuntu-26.04 and ubuntu-26.04-arm labels. The same day it announced the move of ubuntu-latest:

  • "The ubuntu-latest label will migrate from Ubuntu 24.04 to Ubuntu 26.04."
  • "This migration will roll out gradually between October 19 and November 19, 2026."
  • "During this window, workflows that use ubuntu-latest will automatically move to Ubuntu 26.04."
  • "Because this moves your workflows to a new operating system version, the migration may break builds that rely on tools, packages, or versions that changed between Ubuntu 24.04 and 26.04."

The tracking issue in actions/runner-images, #14748, is labelled a breaking change and says: "This change will be rolled out over a period of several weeks beginning October 19, 2026. We plan to complete the migration by November 19, 2026." It covers the x64 ubuntu-latest label only. On November 9, the issue was open with 132 comments, and GitHub hadn't posted that the migration was complete. The machine stays the same size on either image: ubuntu-latest runner specs.

Since September, jobs on ubuntu-latest carry an annotation pointing to it: "The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026." Commenters on the issue report that naming a version in runs-on makes it go away.

How to tell which image your job got

Open the job's log and expand Set up job. Its Runner Image section names the image and its version. From a run of October 28, quoted in #15197:

Operating System
  Ubuntu
  24.04.5
  LTS
Runner Image
  Image: ubuntu-24.04
  Version: 20261012.334.1
  Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20261012.334/images/ubuntu/Ubuntu2404-Readme.md

A job that landed on the new image shows Image: ubuntu-26.04 and Ubuntu 26.04.1. The Included Software link opens the list of every tool on that exact image version.

To print it from the job itself, add a step:

- name: Show the OS release
  run: lsb_release -a

When a job that passed last week fails today, compare the Runner Image section of the two runs first. If the image changed, the workflow didn't break; the machine under it did.

What breaks most

GitHub's table in #14748 lists only a few tools, and commenters found it wrong on Java: the issue says Java 17 stays the default, while the 26.04 image's own readme says 25. The readmes are the record. Comparing the two images' readmes on November 9 (ubuntu-24.04 version 20261101.360.1, ubuntu-26.04 version 20261101.186.1):

The versions in the tool cache, which actions/setup-node, actions/setup-python, actions/setup-go and ruby/setup-ruby reach first, are the same on both images. A job that names its version through a setup action is less exposed than one that uses whatever the image ships.

Ubuntu itself changed two defaults in 26.04: "The sudo-rs tool is now the default sudo provider", and "The core utilities of the operating system are now provided by the rust-coreutils package", with the GNU utilities still available (Ubuntu's release notes).

What people have reported since the rollout began:

  • Java 8 builds. A Gradle task failed on ubuntu-latest and passed on ubuntu-24.04, looking for JAVA_HOME_8_X64 (#14748, November 4). That variable doesn't exist on 26.04.
  • Disk space in Docker builds. In #15233 (opened November 3), a weekly build failed with no space left on device while Docker unpacked a model layer of about 2.9 GB under /var/lib/containerd, and passed after pinning ubuntu-24.04. The cause isn't confirmed.
  • A runner shut down mid-job. In #15179 (October 28), the same golangci-lint job finished on 24.04 and was cut off on 26.04 with "The runner has received a shutdown signal." The issue is open. That message often means the job ran out of memory: how to tell, and what to change.
  • sudo -E. The util-linux project's CI broke on it; the commenter traced it to sudo-rs and switched to --preserve-env= (#14748, November 2).
  • Cross-compilers. GCC 15 cross-compiles for S390 failed on a -Werror=maybe-uninitialized error in system headers (#14748, November 5).
  • Actions that install system packages. egor-tensin/setup-wireguard failed on ubuntu-latest and was fixed by its author on November 5 (#14748).

Pin 24.04 while you fix the job

Change every runs-on: ubuntu-latest in the failing workflow:

jobs:
  build:
    runs-on: ubuntu-24.04

GitHub's own advice: "If you are not ready to move, pin your workflows to ubuntu-24.04 to stay on the current image."

Then run the same job on both images until the 26.04 one passes. Two jobs side by side, with the new one allowed to fail:

jobs:
  build:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v5
      - run: make test

  build-on-26-04:
    runs-on: ubuntu-26.04
    continue-on-error: true
    steps:
      - uses: actions/checkout@v5
      - run: make test

On a private repository, each extra job is billed at the runner's rate, so drop the second job once it passes and move the first to ubuntu-26.04 or back to ubuntu-latest.

A pin isn't forever. GitHub says it "maintains the latest two stable versions of any given OS version" (#14254). With 22.04 on its way out, those two are 24.04 and 26.04, and the next Ubuntu LTS image will start the same countdown for 24.04.

Ubuntu 22.04 retires on April 17, 2027

The older image is on its way out. #14254: deprecation of ubuntu-22.04 and ubuntu-22.04-arm began on September 17, 2026, and they are "fully unsupported by April 17th" 2027. Before then GitHub fails jobs on those labels during scheduled brownouts, and afterwards "Workflows using the ubuntu-22.04, ubuntu-22.04-arm image labels will be terminated with an error." Move them to ubuntu-24.04 or ubuntu-26.04.

One more change from the same weeks: Node 20 is gone from GitHub Actions runners since September 23, 2026, and the ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION opt-out with it (changelog). An action still on node20 fails whatever image runs it.

Where Skipbox fits

Skipbox runs a private repository's jobs on runs-on: skipbox, each in a fresh Linux VM on Ubuntu 24.04, chosen by Skipbox rather than by a label GitHub moves. The VM has Docker CE with buildx and compose, Node 22 and Python 3.12. It isn't a copy of GitHub's image, so check that a job's tools are there before you move it, and keep testing on ubuntu-26.04 at GitHub: Skipbox doesn't run 26.04. Skipbox is $39, $79 or $149 a month with unlimited minutes. macOS, Windows, Arm and public-repository jobs stay on GitHub.

You can try it on your own jobs first: free for 7 days or 3,000 job-minutes, no card.

FAQ

When does ubuntu-latest switch to Ubuntu 26.04?

GitHub's changelog of September 17, 2026 says the migration "will roll out gradually between October 19 and November 19, 2026". Issue #14748 in actions/runner-images says: "We plan to complete the migration by November 19, 2026." During that window a job on ubuntu-latest can land on either image.

How do I keep using Ubuntu 24.04 on GitHub Actions?

Change the job's runs-on line from ubuntu-latest to ubuntu-24.04. GitHub's changelog says: "If you are not ready to move, pin your workflows to ubuntu-24.04 to stay on the current image." The ubuntu-24.04 label stays available after November 19.

How do I see which Ubuntu version my GitHub Actions job used?

Open the job's log and expand the Set up job step. Its Runner Image section shows the image name, such as ubuntu-24.04 or ubuntu-26.04, its version, and a link to that image's list of installed software. A step that runs lsb_release -a prints the release too.

Why did my build break on ubuntu-latest with no change to the workflow?

Most likely the job moved to the Ubuntu 26.04 image. Its default Java is 25 instead of 17, Java 8 is gone, GCC is 15 instead of 13, the default Python is 3.14 and Docker is 29. Compare the Runner Image section of a passing run and the failing one; if the image changed, pin ubuntu-24.04 and fix the job on ubuntu-26.04.

When is ubuntu-22.04 retired?

GitHub began deprecating the ubuntu-22.04 and ubuntu-22.04-arm images on September 17, 2026, and they are fully unsupported from April 17, 2027 (actions/runner-images issue #14254). Jobs that use those labels will then fail.

Sources

All read on 2026-11-09.

Updated November 9, 2026

Flat-price CI from your next push

Change one runs-on: line. Any minutes, one price.

  • No card
  • 7 days or 3,000 job-minutes free
  • 30-day refund on first payment