ubuntu-latest(Ubuntu 26.04)の「libxml2.so.2」「libicudata.so.74」:cannot open shared object file
ubuntu-latest は、2026年10月19日から11月19日にかけて Ubuntu 24.04 から 26.04 に移ります(ほかに変わること)。26.04 では、多くのプログラムがリンクしている2つのライブラリの名前が変わりました。libxml2 は 2.15 でパッケージは libxml2-16、ファイルは libxml2.so.16 です。24.04 はパッケージ libxml2 の libxml2.so.2 でした。ICU は 78(libicu78)で、24.04 は ICU 74(libicuuc.so.74・libicudata.so.74・libicui18n.so.74)でした。24.04 で作られたプログラムは古い名前を探し、何もしないうちに止まります。
出る文
24.04 で保存した Playwright のブラウザーのキャッシュから戻った WebKit です(owl-be-there #46・WebKit のテスト260件が起動で失敗)。Chromium と Firefox は自分のライブラリを持っているので通ります(tessera #364):
MiniBrowser: error while loading shared libraries: libicudata.so.74: cannot open shared object file
24.04 のキャッシュから戻った R のパッケージのライブラリです(flu-scenario-modeling-hub #55):
unable to load shared object '.../Library/stringi/libs/stringi.so': libicui18n.so.74: cannot open shared object file
24.04 のキャッシュから戻った Ruby の gem の一式で、libxml-ruby の拡張が入っていたものです(bulkrax #1266・テストのファイルがすべて読み込めなかった):
LoadError: libxml2.so.2: cannot open shared object file
24.04 向けに作られた組み立て済みのバイナリで、ここではリリースのアーカイブの SwiftLint 0.65.1 です。終了コードは127です(SwiftLint #6966):
swiftlint: error while loading shared libraries: libxml2.so.2: cannot open shared object file: No such file or directory
24.04 で保存したキャッシュ
runner.os は、どの Ubuntu のイメージでも Linux です。${{ runner.os }}-${{ hashFiles('Gemfile.lock') }} のようなキーは 24.04 と 26.04 で同じなので、26.04 のジョブが 24.04 のジョブの作ったものを戻し、その中でコンパイルされたものは古いライブラリにリンクしています。キーにイメージを入れます。ホストのランナーは、ImageOS を 24.04 では ubuntu24、26.04 では ubuntu26 にしています:
- id: image
run: echo "os=${ImageOS:?ImageOS is not set on this runner}" >> "$GITHUB_OUTPUT"
- uses: actions/cache@v6
with:
path: vendor/bundle
key: gems-${{ runner.os }}-${{ steps.image.outputs.os }}-${{ hashFiles('Gemfile.lock') }}
restore-keys: gems-${{ runner.os }}-${{ steps.image.outputs.os }}-
上のように、ステップで読みます。${{ env.ImageOS }} は空です。env の文脈には、ワークフローが決めた変数だけが入り、ランナー自身の変数は入りません(GitHub の文脈の説明)。dorkos #3347 では、そう直したあとも、キーがどちらのイメージでも pnpm-store-Linux--X64-... になっていました。${ImageOS:?...} と書くと、セルフホストのランナーのように変数が無いときに、空の文字でキーを作らずにステップが失敗します。
restore-keys も変えます。イメージの入っていない前方一致は、24.04 の分を見つけてしまいます。それぞれのイメージの最初の実行は、キャッシュに1回当たらず、新しく保存します。Playwright なら、Playwright の版もキーに残します。26.04 用には別のブラウザーのビルドを落とすからです。
actions/setup-python・actions/setup-go のキャッシュと、ruby/setup-ruby の bundler-cache は、もともとキーに Ubuntu の版を入れています。危ないのは、自分で actions/cache に書いたキーです。
24.04 向けに作られたバイナリや wheel
こちらはキャッシュと関係がなく、新しく落としても同じエラーになります。26.04 向けのビルドか、静的にリンクされたビルドを探します。いまのところ、SwiftLint の動的にリンクされた Linux のバイナリ(#6966・11月4日の時点で開いたまま)と、PyPI の libcellml の wheel の報告があり、後者では circulatory_autogen #622 が CI を 24.04 に戻しました。26.04 では apt-get install libxml2 は効きません。そのパッケージは 26.04 に無く、libxml2-16 にあるのは libxml2.so.16 だけです。プロジェクトが 26.04 向けのビルドを出すまでは、そのジョブを runs-on: ubuntu-24.04 に残します。
見分け方
- プログラムが自分の出力を何も出さないうちに「error while loading shared libraries」で止まり、終了コードは127のことが多い。
ldd path/to/program | grep 'not found'で、足りないライブラリが全部出ます。- キャッシュのステップのログの「Cache restored from key: ...」にキーが出ます。キーにイメージが入っていなければ、24.04 の分かもしれません。その分を消すかキーを変えてもう一度動かすと、キャッシュが原因かが分かります。
- 「Set up job」の Runner Image の欄が
ubuntu-26.04かubuntu-24.04かを見ます。11月19日までは、再実行が 24.04 に当たって通ることがあります。
ほかの 26.04 の失敗
- Ubuntu 26.04 の GCC 15 で通らなくなった C と C++ のビルド:既定の gcc が 13 から 15 に上がるので、C は C23 としてコンパイルされ、古い警告の6つがエラーになり、C++ のヘッダーは
<cstdint>を読み込んでくれなくなります。 - Ubuntu 26.04 の setup-ruby の「Unavailable version」:26.04 向けには Ruby の各系列の一部のパッチしか作られていないので、
.ruby-versionの 3.4.2 のような固定は Ruby のステップで止まります。 - Ubuntu 26.04 の Playwright:Playwright 1.50〜1.60 は「does not support chromium on ubuntu26.04-x64」と出します。
- Ubuntu 26.04 の apt:名前が変わった・無くなったパッケージ。
- Ubuntu 26.04 の rootless Podman:
pastaの AppArmor のプロファイルが Podman の SIGTERM を断るので、Podman のソケット越しのdocker compose downが「rootless netns: kill network process: permission denied」で落ちます。 - Ubuntu 26.04 の「client version ... is too old」:Docker 29 は API 1.40 より古いクライアントを断るので、古い Testcontainers は「Could not find a valid Docker environment」で落ちます。
- 「coreutils: unknown program」:基本のコマンドのほとんどが uutils です。
失敗したジョブを 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」 · 「Cache not found for input keys」 · Ubuntu 26.04 の Playwright · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English