rails-dev-box を Ubuntu 24.04 へ移行し、mise・Chrome 対応を追加
Canonical が Ubuntu 24.04 以降の Vagrant イメージ提供を終了したことを受け、rails-dev-box のベースボックスを ubuntu/mantic64(23.10)から bento/ubuntu-24.04 に切り替えた。あわせて Ruby のインストール方法を mise 経由に変更し、Trilogy・railties テストの環境変数設定や Google Chrome の自動プロビジョニングも追加された。
背景
ubuntu/mantic64 の後継が存在しないことが移行の直接的なトリガーになった。#215 で報告されているとおり、Ubuntu 24.04 LTS (Noble Numbat) のリリースノートには「Starting in Ubuntu 24.04, Canonical no longer produces Vagrant images.」と明記されており、公式イメージへの依存を続けることができなくなった。
HashiCorp はベース OS 環境として Bento ボックス を推奨しており(公式ドキュメント)、今回の移行先として bento/ubuntu-24.04 が選択された。Bento はコミュニティメンテナンスの Vagrant ボックスセットで、LTS リリースに対して継続的に更新が提供されている。
この移行は単純なボックス差し替えに留まらず、Ruby のバージョン制約や MySQL 接続設定など、複数の環境差異への対処が必要になった。
技術的な変更
ベースボックスの切り替え
Vagrantfile のボックス指定を 1 行変更するだけでベース OS が置き換わる。
変更前:
config.vm.box = 'ubuntu/mantic64' # 23.10
変更後:
config.vm.box = 'bento/ubuntu-24.04' # 24.04 LTS
Ruby インストール方法の変更(パッケージ → mise)
Ubuntu 24.04 (Noble) の apt リポジトリに収録されている Ruby は 3.2 系であり、Rails main ブランチが要求する Ruby 3.3.0 以上を満たさない。そのため、ruby-full パッケージによるインストールを廃止し、mise を使ったバージョン管理に切り替えた。
変更前:
install Ruby ruby-full bundler libyaml-dev
# echo installing current RubyGems
gem update --system -N >/dev/null 2>&1
変更後:
install 'Ruby build dependencies' libyaml-dev libssl-dev libreadline-dev zlib1g-dev
echo installing mise
curl -fsSL https://mise.run | HOME=/home/vagrant sudo -u vagrant bash
echo 'eval "$(/home/vagrant/.local/bin/mise activate bash)"' >> /home/vagrant/.bashrc
echo installing Ruby via mise
sudo -u vagrant HOME=/home/vagrant /home/vagrant/.local/bin/mise use --global ruby@4 >/dev/null 2>&1
mise は vagrant ユーザーの権限で実行され、~/.bashrc への activate 行の追記によってログインシェルで自動的に有効化される。ビルドに必要な libssl-dev・libreadline-dev・zlib1g-dev が明示的に追加されており、ソースビルドに備えた構成になっている。
環境変数の設定先変更(.bashrc → /etc/environment)
MYSQL_SOCK の設定先が ~/.bashrc から /etc/environment に変更され、同時に MYSQL_CODESPACES=1 が追加された。
変更前:
# To address `unable to connect to /tmp/mysql.sock` for trilogy
echo "export MYSQL_SOCK=/var/run/mysqld/mysqld.sock" >> /home/vagrant/.bashrc
変更後:
# To address `unable to connect to /tmp/mysql.sock` for trilogy,
# and to pass MySQL root password in railties tests.
# /etc/environment is parsed by PAM for login sessions to expose these variables broadly.
cat >> /etc/environment <<'ENV'
MYSQL_SOCK=/var/run/mysqld/mysqld.sock
MYSQL_CODESPACES=1
ENV
/etc/environment は PAM がログインセッション時にパースするため、bash 以外のシェルや非インタラクティブセッションでも変数が参照できる。MYSQL_CODESPACES=1 は railties テストが MySQL の root パスワードとして 'root' を使用するために必要なフラグで、GitHub Codespaces と同一の挙動をプロビジョニング済み VM 上でも再現させる。
Google Chrome の自動インストール追加
ActionPack のシステムテストで必要な Google Chrome を、プロビジョニング時に自動インストールするステップが追加された。
echo installing Google Chrome
curl -fsSL https://dl.google.com/linux/linux_signing_key.pub | gpg --dearmor -o /usr/share/keyrings/googlechrome-linux-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/googlechrome-linux-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list
apt-get -y update >/dev/null 2>&1
install 'Google Chrome' google-chrome-stable
Google の GPG 鍵を /usr/share/keyrings/ に配置する現代的な signed-by 方式を採用しており、/etc/apt/trusted.gpg への直接追加(非推奨)は使用していない。
設計判断
環境変数の設定先として /etc/environment が選ばれた点に注目できる。コメントにも「/etc/environment is parsed by PAM for login sessions to expose these variables broadly.」と記されており、~/.bashrc ではカバーできない非インタラクティブな実行コンテキストでも確実に変数を参照させる意図がある。CI 的な使われ方や vagrant ssh -c による非インタラクティブコマンド実行など、より幅広い実行経路を考慮した選択といえる。
mise を ruby@4 という浮動バージョン指定で使用している点も設計上の特徴だ。固定バージョンを指定せず、4.x 系の最新版を追従させることで、プロビジョニングスクリプトを書き換えることなく Ruby のパッチリリースを継続的に受け取れる構成になっている。
まとめ
今回の変更は、Canonical の Vagrant イメージ提供終了という外部要因への対応を起点に、Ruby のバージョン管理・環境変数の適用スコープ・Chrome のプロビジョニングという複数の課題を一括して解消したものだ。/etc/environment への移行や mise の採用は、単なる互換対応にとどまらず、開発環境としての堅牢性を高める設計判断を伴っている。