投稿

ubuntu-latest の切り替えで CI が止まる構成、止まらない構成

GitHub Actions の ubuntu-latest が Ubuntu 26.04 に切り替わって CI が落ちた。latest のままでよい構成と、版を固定したほうがよい構成を、公開リポジトリの運用と合わせて整理する。

ubuntu-latest の切り替えで CI が止まる構成、止まらない構成

参考: actions/runner-images / Renovate の github-runners datasource

まとめ

  • GitHub Actions のランナーは VM で、container: を書かなければジョブは VM の OS の上で直接動く
  • OS の変化がジョブの中身まで届くのは、ホストの上でネイティブ拡張をビルドするジョブ(setup-ruby のあとの bundle install など)
  • ubuntu-latest のまま運用している公開リポジトリの多くは、重いジョブを自分で固定したコンテナの中で動かしている。latest で困らないのはこの構成のとき
  • ホストの上でビルドするなら、版を固定して Renovate に更新 PR を出させる型がある。ただし固定しても、イメージの中のソフトは毎週変わる

何が起きたか

全ブランチの CI が bundle install で落ちるようになった。 ubuntu-latest の指す先が Ubuntu 24.04 から 26.04 に切り替わったのが始まりで、bundler のキャッシュキーに OS 名が入っていたため、キャッシュが外れて gem を一から作り直すことになった。 作り直しに使われたのは 26.04 の新しい GCC で、デバッガ系の古い gem debase の C 拡張が -Wincompatible-pointer-types で止まった。GCC 14 からは、何も指定しなければこの警告がエラーになる。 24.04 の上ではキャッシュ済みのビルド結果を使い回していたので、この問題は表に出ていなかった。

どれを選ぶか

表1: 選定フロー

手順 判断すること 結果
1 ジョブがホストの OS の上でネイティブ拡張やバイナリをビルドするか しないなら ubuntu-latest のままでよい(lint やラベル付けなど)
2 そのジョブを container: で自分が決めたイメージの中に移せるか 移せるなら ubuntu-latest のままでよい。コンパイラやライブラリの版はイメージ側で決まる
3 どちらにも当てはまらない ubuntu-24.04 のように版を書き、Renovate で更新 PR を出させる

既定は手順 3 の「固定して更新 PR で上げる」。 ホストでビルドしているかどうかは、ワークフローを読まないと分からないことが多いからだ。 手順 1・2 で latest に残せるのは、OS が変わっても中身が変わらないと説明できるジョブだけになる。

公開リポジトリはどうしているか

表2: 公開リポジトリの運用(2026-11-09 時点の default branch)

リポジトリ ubuntu-latest で動かしているもの 重いジョブの実行場所 運用の型
rails/rails labeler・stale などの補助ジョブ 9 か所 Buildkite。ruby イメージから作った Docker イメージの中 追従
discourse/discourse テストを含む 19 か所 container: discourse/discourse_test:release の中 追従
hashicorp/terraform ビルド・テストを含む 20 か所 ホストの上 追従
vercel/next.js ビルド・テストを含む 42 か所 ホストの上 追従
mastodon/mastodon なし(ubuntu-26.04 を 25 か所に明記) ホストの上(setup-ruby を使い、container: は無い) 固定して Renovate で更新

Rails と Discourse は、表1 の手順 1・2 に当たる形で latest に残している。 Mastodon は今回と同じくホストの上で Ruby を入れる構成で、2026-10 末に ubuntu-latest を ubuntu-24.04 に書き換えてから、Renovate の PR で 26.04 に上げた(mastodon#41345)。 Terraform と Next.js はホストでビルドしたまま追従しているが、9 月以降の .github の変更に OS 切り替えへの対応は見当たらず、26.04 でもそのまま動いたのか、別の場所で直したのかは分からなかった。

固定しても固定しきれないもの

runner-images の README は、意図しない移行を避けたいなら版を明記するよう案内している。 ただし ubuntu-24.04 と書いても固定されるのは OS の版だけで、イメージに入っているツールは毎週更新される。これを理由に ubuntu-latest へ戻した例もある(ikemo3/renovate-config#33)。 もう一つ、Mastodon の PR には、matrix の変数で指定した OS は Renovate が上げなかったと書かれている。固定するなら runs-on に版を直接書くほうが更新から漏れにくい。 OS の版を固定して防げるのは今回のような OS の切り替えまでで、コンパイラ以外の中身まで揃えたいなら、表1 の手順 2 のコンテナに寄せることになる。