ubuntu-latest-check: Workflow-Jobs finden, die auf Ubuntu 26.04 brechen

Ein Prüfwerkzeug, das GitHub-Actions-Workflows liest und die ubuntu-latest-Jobs auflistet, die auf Ubuntu 26.04 an entfernten apt-Paketen, fehlenden setup-python-Builds oder alten Playwright-Versionen scheitern.

Das Problem

GitHub stellt das Runner-Label ubuntu-latest zwischen dem 19. Oktober und dem 19. November 2026 von Ubuntu 24.04 auf Ubuntu 26.04 um. Drei Arten von Fehlern lassen sich allein aus dem Workflow vorhersagen: apt-Pakete, die es in 26.04 nicht mehr gibt (zum Beispiel gcc-9, gcc-10, clang-14 bis clang-16, postgresql-client-16, lzma-dev, libatlas-base-dev), Python-Versionen, die actions/setup-python auf 26.04 nicht installieren kann, und Playwright-Versionen ohne Unterstützung für 26.04.

Der Bedarf ist belegt:

Wie es funktioniert

ubuntu-latest-check liest die Workflow-Dateien und expandiert Matrizen nach GitHubs Regeln für include und exclude, sodass jeder Befund die betroffenen Kombinationen nennt. Für jeden Job auf ubuntu-latest führt es drei Prüfungen aus:

  1. Jedes Paket aus apt-get install oder apt install in run:-Schritten oder aus awalsh128/cache-apt-pkgs-action wird in den Paketindizes des Ubuntu-Archivs für beide Releases nachgeschlagen (Release, -updates und -security, alle vier Komponenten, einschließlich Provides). Ein Paket, das es in 24.04 gibt, in 26.04 aber nicht, wird gemeldet.
  2. Angeforderte Python-Versionen werden mit dem Manifest von actions/python-versions verglichen. Für 26.04 gibt es keine Builds von 3.8 und 3.9 und nur Patch-Releases, die nach Einführung der 26.04-Unterstützung gebaut wurden. Exakte Angaben wie 3.12.3 schlagen deshalb ebenfalls fehl.
  3. Für Jobs, die playwright install ausführen, wird die festgeschriebene Playwright-Version aus package-lock.json, pnpm-lock.yaml oder yarn.lock gelesen. Versionen vor 1.61.0 scheitern; 1.61.0 ist das erste Release mit Einträgen für ubuntu26.04 in seiner Browser-Registry.

Jobs in einem container: oder auf self-hosted-Runnern werden übersprungen. --repo und --owner prüfen entfernte Repositories über gh, --label ubuntu-24.04 prüft auch festgeschriebene Jobs, und der Exit-Code ist 1, sobald es einen Fehler gibt. Der Befehl kann also als CI-Schritt laufen.

Das ist die Ausgabe für den Demo-Workflow im Repository:

$ ubuntu-latest-check examples/demo
examples/demo/.github/workflows/ci.yml:9: error: job test [os=ubuntu-latest, python-version=3.9]: python 3.9: actions/setup-python has no Python 3.9 build for Ubuntu 26.04 (it has one for 24.04)
examples/demo/.github/workflows/ci.yml:23: error: job test: apt gcc-10: apt package exists in Ubuntu 24.04 but not in 26.04
examples/demo/.github/workflows/ci.yml:23: error: job test: apt postgresql-client-16: apt package exists in Ubuntu 24.04 but not in 26.04
examples/demo/.github/workflows/ci.yml:34: error: job e2e: playwright 1.59.1: Playwright 1.59.1 (from web/package-lock.json) does not support Ubuntu 26.04, 'playwright install' fails there; 1.61.0 is the first release that does
examples/demo/.github/workflows/ci.yml:33: error: job e2e: apt libgdk-pixbuf2.0-0: apt package exists in Ubuntu 24.04 but not in 26.04
examples/demo/.github/workflows/ci.yml:33: error: job e2e: apt libx264-164: apt package exists in Ubuntu 24.04 but not in 26.04
1 workflow files, 2 jobs on ubuntu-latest, 6 errors, 0 warnings (Ubuntu 24.04 -> 26.04)

Auf den Default-Branches öffentlicher Repositories meldete es am 29. Oktober 2026 unter anderem lzma-dev in python/mypy, libatlas-base-dev in numpy/numpy und Playwright 1.58.2 in CieloVistaSoftware/wb-starter. Mit --label ubuntu-24.04 meldete es die in cncf/maintainer-d festgeschriebene Playwright-Version 1.57.0, die das dortige Issue beschreibt.

Tests

Die Unit-Tests laufen gegen feste Paket- und Versionslisten. Sie decken das Herauslesen von apt-Paketnamen aus Shell-Skripten ab, die Expansion von Matrizen, das Erkennen von runs-on und container, den Abgleich von Python-Versionen, die drei Lockfile-Formate, apt-Quellen, die einen Fehler zur Warnung herabstufen, übersprungene Jobs und ungültiges YAML. Zwei Live-Tests verwenden das echte Ubuntu-Archiv und das python-versions-Manifest: Der Demo-Workflow muss genau die sechs Befunde oben liefern, und der eigene Workflow des Repositories muss bestehen. Das CI führt alle Tests mit Python 3.9 und 3.13 aus, bei jedem Push und einmal pro Woche.

Grenzen

  • Geprüft wird nur, was im Workflow steht. Pakete, die Skripte, Makefiles oder Shell-Variablen installieren, sieht das Werkzeug nicht.
  • Fügt ein Job eine apt-Quelle hinzu, wird ein fehlendes Paket als Warnung gemeldet. Ob ein PPA für 26.04 baut, wird nicht geprüft.
  • Geprüft wird nur x64.
  • Ausdrücke außer Verweisen auf matrix.*, literalen Strings und || werden nicht ausgewertet.
  • Andere Änderungen im 26.04-Image (Ruby-Versionen, die Standard-Java-Version, /tmp als tmpfs, neuere Compiler) werden nicht geprüft.
  • Entfernte Scans lesen nur den Default-Branch.

Code und Installationsanleitung liegen unter github.com/Jwrede/ubuntu-latest-check.