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-latestlabel 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-latestwill 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):
| Tool | ubuntu-24.04 | ubuntu-26.04 |
|---|---|---|
| Default Java | 17 | 25 |
Java 8 (JAVA_HOME_8_X64) | Installed | Not installed |
| GCC and g++ | 13.2 | 15.2 |
| Clang | 16, 17, 18 | 20, 21, 22 |
| Default Python | 3.12.3 | 3.14.4 |
| Default Node.js | 22.23.4 | 24.22.2 |
| Ruby | 3.2.3 | 3.3.8 |
| Docker client and server | 28.0.4 | 29.4.2 |
| Docker Compose | 2.38.2 | 5.1.3 |
| Podman | 4.9.3 | 5.7.0 |
| systemd | 255.4 | 259.9 |
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-latestand passed onubuntu-24.04, looking forJAVA_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 devicewhile Docker unpacked a model layer of about 2.9 GB under/var/lib/containerd, and passed after pinningubuntu-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-uninitializederror in system headers (#14748, November 5). - Actions that install system packages.
egor-tensin/setup-wireguardfailed onubuntu-latestand 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.
- GitHub Changelog, Ubuntu 26 generally available and latest migration (September 17, 2026): the window, the pin, the warning that builds may break.
- actions/runner-images, #14748 "
ubuntu-latestlabel will use Ubuntu 26.04 in November 2026": the schedule, the x64 label, the comments of October and November quoted above. - actions/runner-images, #14747 "Ubuntu 26.04 and Ubuntu 26.04 Arm64 are now generally available": the labels, September 17, 2026.
- actions/runner-images, Ubuntu 26.04 image readme and Ubuntu 24.04 image readme: the tool versions in the table.
- actions/runner-images, #15197: the Set up job log above. #15233: the Docker disk-space failure. #15179: the runner shutdown.
- actions/runner-images, #14254: the Ubuntu 22.04 deprecation and the April 17, 2027 retirement.
- Ubuntu, Ubuntu 26.04 LTS release notes, summary for LTS users: sudo-rs and rust-coreutils.
- GitHub Changelog, Node 20 is no longer available in GitHub Actions (September 23, 2026).
- GitHub Docs, GitHub-hosted runners reference: the labels.
Updated November 9, 2026