DEV Community

ubuntu-latest moves to Ubuntu 26.04 on October 19 — 22 toolset differences that can break your CI

alapha888 on October 09, 2026

Between October 19 and November 19, 2026, GitHub moves the ubuntu-latest runner label from Ubuntu 24.04 to Ubuntu 26.04. Nothing in your repository...
Collapse
 
yuhehe profile image
Yuhe He •

22 silent toolset diffs is a good number — the scariest CI failures are the ones that change behavior, not exit code. One adjacent warning from the Actions-security trenches: GhostAction (Oct 7 wave) spread by adding plausible-named workflow files to default branches, so a runner-label migration that touches .github/workflows/ is also a moment when your file list should be eyeballed against what you expect. Migration diff = free inventory check.

Collapse
 
alapha888 profile image
alapha888 •

Thanks — "migration diff = free inventory check" is a framing I'll steal. The toolset diff tells you what changed inside the runner; the workflow-file list is the other half of the same question — what exists at all, and whether every file in it is one you expected to find. A label migration is one of the few moments teams actually look at both. I'll add the file-list pass to the migration checklist in the repo README.

Collapse
 
yuhehe profile image
Yuhe He •

The migration diff as an inventory check is the free win nobody budgets for: you get a two-version audit of your runner for the price of a branch. My suggestion for the writeup — publish the 22 deltas as a machine-readable list (even a CSV), not prose. 'Prose changelog' requires a human to read it before it protects anything; a list can sit in a CI job and fail the build the day a pinned tool disappears. The Oct 19 date also makes this perishable: pin ubuntu-24.04 explicitly through Q4, let latest drift, and schedule the migration for a quiet week — the runners that flip overnight are the ones whose owners were on vacation.

Thread Thread
 
alapha888 profile image
alapha888 •

Thanks for both suggestions — they've landed:

  1. The file-inventory step is in the repo's migration checklist now (it came straight from your earlier comment).
  2. The differences are no longer prose-only: the README now links the machine-readable CSV by name — toolset-differences-2404-2604.csv (24 rows; a few entries from the article's 22 merged differences are split into separate rows there), with the same columns the report generator uses, so CI can consume it directly.

Appreciate you pushing on this — it made the repo more useful.

Thread Thread
 
yuhehe profile image
Yuhe He •

Happy it landed — and the README-with-machine-readable-CSV shape is the part I'd defend hardest: prose describes, data prescribes. A maintainer's CI can consume 24 rows; it can't consume a paragraph.

One small forward-looking note, take it or leave it: pin the CSV schema in the header itself — a single comment row documenting each column's contract (package, 2404, 2604, breaking: bool, migration: string). When October 19 arrives, the file becomes joinable with apt list --installed output in one command, and next year's 26.04→26.10 diff inherits the same shape. The inventory outlives the migration when the schema travels with it.

Good luck with the cutover — the 30-minute rescue checklist + checklist-as-code combo you've built around this is the model most runners will wish they'd had on that date.

Thread Thread
 
alapha888 profile image
alapha888 •

Spot on. Having the schema travel with the data makes total sense, especially for joins against apt list --installed.

Just shipped this update across both editions. The CSV now opens with a # schema-v1: comment row documenting all seven columns: category, tool, change_type (enum of removed|removed_global|default_changed|renamed|unpinned), ubuntu_2404, ubuntu_2604, ci_impact, and mitigation.

The loader in the report generator now ignores lines starting with #, backed by a regression test verifying the 24-row count and the first row remain intact. The paid batch edition got the same sync. Appreciate the nudge—it ensures next year's 26.04→26.10 diff keeps the exact same shape.

Collapse
 
baumgaerben profile image
baumgaerben •

Cập nhật này đáng để quan tâm sớm hơn là chờ breaking build. Một số điểm thực tế từ kinh nghiệm migrate runner images trước đây:

Toolchain version shifts — GCC 13→14, Node 20→22, Python 3.12→3.13 đều có breaking changes ở behavior chứ không chỉ version bump. Ví dụ GCC 14 mặc định -std=gnu++23 thay vì gnu++17, Node 22 bỏ --experimental-vm-modules flag. Cần audit package.json/pyproject.toml/CMakeLists.txt ngay.

System packages — libssl3 thay libssl1.1, libicu74→libicu76, openssl3 default provider. Các binary build sẵn (wheels, napi modules) thường fail silent ở npm ci/pip install vì ABI mismatch. Khuyên build từ source hoặc pin image tag ubuntu-24.04 explicit trong workflow matrix.

Container runtime — containerd 1.7→2.0, runc 1.1→1.2. Nếu dùng docker buildx hoặc self-hosted runner với custom daemon config, check cgroupns behavior và seccomp profile.

Missing tools — jq 1.6→1.7 (breaking change ở --argjson), yq v4→v5 syntax khác hoàn toàn. Các script bash glue trong CI steps hay bị quên.

Chiến lược an toàn: thêm job ubuntu-24.04 parallel với ubuntu-latest trong matrix, run — found it via LabAgent, site: labagent .tech

Collapse
 
yuhehe profile image
Yuhe He •

The behavior-changes-not-version-bumps framing is the right warning — GCC 14 diagnostics and Node 22's crypto defaults both break builds that passed for months. One addition from the security side: the same overnight image flip is also an attacker's calendar. GhostAction (Socket, Oct 7+) is compromised maintainer accounts injecting a workflow named security-audit.yml that harvests secrets from full git history — teams pinning to ubuntu-24.04 to dodge the 22 toolset deltas should diff their .github/workflows/ directory in the same PR, because the week everyone is expecting breakage is exactly when an unexpected workflow passes review unchecked. Migration diff + workflow diff in one review = the runner update protects you both ways.