rails-dev-box を Ubuntu 24.04 へ移行し、mise・Chrome 対応を追加

rails/rails-dev-box

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-devlibreadline-devzlib1g-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 の採用は、単なる互換対応にとどまらず、開発環境としての堅牢性を高める設計判断を伴っている。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
183532f5

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→背景・技術詳細・設計判断(各論)→まとめ(結論)という「総論→各論→結論」の3部構成が明確に適用されており、模範的な記事構成です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(`ruby:Vagrantfile`など)やGitHubのIssue/PRへのリンク記法(`[#215](URL)`)が、ガイドラインに従って正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Vagrant、Ubuntu、mise、PAMなどの用語を前提とした説明となっており、専門知識を持つエンジニアという対象読者に完全に適合しています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクション、各パラグラフがガイドラインに準拠しています。特に、各パラグラフの冒頭にトピックセンテンスが配置されているため、非常に読みやすく、内容を素早く把握できます。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

Vagrantfileおよびbootstrap.shから引用されたすべてのコードブロックは、提供されたDiffの内容と正確に一致しています。ファイルパスの指定も正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`bento`, `mise`, `PAM`, `signed-by` などの技術用語が、PRの文脈に沿って正確かつ適切に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

Rubyのバージョン要件、`/etc/environment`の役割、`MYSQL_CODESPACES`フラグの目的など、すべての技術的な説明がPR情報やコードの事実に裏付けられており、正確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(Canonicalのイメージ提供終了、Bentoへの移行、miseの採用理由など)が、PRのDescription、Diff内のコメント、参照されているIssueで正確に裏付けられており、ハルシネーションは見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#217)、Issue番号(#215)、Ubuntuのバージョン(24.04)、Rubyのバージョン(3.3.0, 4.x)など、すべての数値・固有名詞が正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトルは、PRの主題である「Ubuntu 24.04への移行」に加え、主要な変更点である「mise・Chrome対応」も含んでおり、PRの内容を正確かつ包括的に表現しています。

外部知識の正確性 ⚠ WARNING

PRに記載のない外部知識(LTS、サポート状況など)の不使用

PR情報に明示されていない「Bento」に関する一般的な説明(コミュニティメンテナンスであること、LTSで更新されること)が追加されています。これは読者の理解を助ける有益な補足情報であり、ハルシネーションではありませんが、ガイドラインに厳密に従うとPR外の知識となるためWARNINGと評価します。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

PRで行われた変更を過去の事実として記述しており、時間表現の歪曲や誤解を招く表現は見られません。