ubuntu-latest の切り替えで CI が止まる構成、止まらない構成
GitHub Actions の ubuntu-latest が Ubuntu 26.04 に切り替わって CI が落ちた。latest のままでよい構成と、版を固定したほうがよい構成を、公開リポジトリの運用と合わせて整理する。
参考: 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 のコンテナに寄せることになる。