ubuntu-latest(Ubuntu 26.04)の「coreutils: unknown program」:Rust 版の coreutils(uutils)
ubuntu-latest は、2026年10月19日から11月19日にかけて Ubuntu 24.04 から 26.04 に移ります(ほかに変わること)。26.04 では、基本のコマンド(sleep・ls・cat・timeout など)のほとんどが、GNU coreutils を Rust で書き直した uutils のものです。GNU の動きを前提にしたスクリプトやテストはいくつかの形で落ち、いちばんよく出るメッセージがこれです:
coreutils: unknown program 'codex'
名前を変えた sleep のコピー
uutils はすべてのコマンドを1本のプログラムにまとめていて、呼ばれた名前でどのコマンドになるかを決めます。テストでは、pgrep で見つけられるように、sleep を別の名前でコピーしたりリンクしたりして、動き続けるプロセスの代わりにすることがよくあります。26.04 では、そのコピーがすぐに終わります(pithead #3783・crewship #4062):
coreutils: unknown program 'p2pool'
テストはそのあと、もういないプロセスを待って別のところで落ちます。fake-sleep のようにコマンドの名前で終わる名前なら、uutils は名前の終わりで照らし合わせるので動きます。どちらのイメージでも通る直し方は2つです:
- 名前を気にしない GNU の sleep をリンクかコピーします。26.04 では
gnusleepとして入っていて、24.04 にあるのはsleepだけで、そちらは GNU のものです:ln -s "$(command -v gnusleep || command -v sleep)" "$dir/codex"
- 代わりのプロセスを小さなスクリプトにします。Linux はスクリプトのプロセスにスクリプトの名前を付けるので、
pgrep -xでも見つかります(spicetify #4049):#!/bin/sh sleep 600
timeout -k がプロセスグループ全体を止めない
uutils の timeout は、最初のシグナルは GNU と同じようにコマンドのプロセスグループに送りますが、-k や -s KILL の KILL は直接の子プロセスにしか届きません(uutils #15768・まだ開いています)。コマンドが始めたプロセスは動き続けます。止まったインストールを timeout -k で止めていたステップは待ち続け、KILL を前提にしたテストは自分のタイムアウトで落ちます(openRepoTools #297)。GNU の timeout を使います。26.04 では gnutimeout として入っています(waitron #2400 がそうしています):
T=$(command -v gnutimeout || command -v timeout) "$T" -k 10 300 ./install.sh
CI で見られたほかの違い
- 閉じた標準入力や標準出力を渡された
catとechoが、GNU なら 1 で終わるところを 0 で終わることがあり、閉じた記述子のテストが落ちます(blairham/sh #7199)。 mkfifoは UTF-8 として正しくないファイル名を拒みます:error: invalid UTF-8 was detected in one or more arguments(proton-drive-sync-engine #509)。- すべてのコマンドが uutils というわけではありません。26.04 のランナーでは、
/usr/bin/cpと/usr/bin/mvは GNU のgnucpとgnumvを指し、/usr/bin/lsは/usr/lib/cargo/bin/coreutils/の中を指します。リンクをたどったパスがcpで終わると決めているテストは落ちます(kiwi #1479)。
ステップがどちらに当たったかは、コマンドに聞きます。26.04 では timeout --version が timeout (uutils coreutils) 0.10.0 と出し、readlink -f "$(command -v sleep)" で名前の指す先が分かります。
GNU のコマンドは入ったまま
26.04 の coreutils パッケージは coreutils-from-uutils に依存し、それが gnu-coreutils に依存しています。そのため GNU のコマンドは、gnusleep・gnutimeout・gnucat・gnudate・gnusort・gnutail などの gnu の付いた名前で、いつも入っています。1つのコマンドを直すなら、これがいちばん小さな直し方です。ubuntu:26.04 から作るイメージなら、Dockerfile で全部を GNU に戻しているプロジェクトもあります(kickstart-flavor-php #4):
apt-get install -y --allow-remove-essential coreutils-from-gnu coreutils-from-uutils-
または、スクリプトを直すまでジョブを runs-on: ubuntu-24.04 に固定します。GitHub が 24.04 を引退させるまでは持ちます。どちらにしても「Set up job」を見ます。Runner Image のグループに ubuntu-26.04 か ubuntu-24.04 と出ます。11月19日までは、やり直しが 24.04 に当たって通ることがあるので、やり直しで緑になっても何も証明されません。
26.04 のほかの失敗
- Ubuntu 26.04 の bubblewrap:
bwrapの中のサンドボックスが、AppArmor のbwrap-userns-restrictの下で落ちます。 - Ubuntu 26.04 の sudo -E:
sudoは-Eを無視する sudo-rs です。 - Ubuntu 26.04 の apt:名前が変わった・無くなったパッケージ。
- Ubuntu 26.04 の Playwright:1.61.0 より前の版はインストールで落ちます。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、Ubuntu は Canonical Ltd. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・Canonical・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「The ubuntu-latest label will migrate to Ubuntu 26」 · Ubuntu 26.04 の sudo -E · Ubuntu 26.04 の apt · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English