Ruby 4.0.4 のインストール時ドキュメント生成を無効化するワークアラウンド
アップストリームのリグレッションにより Ruby 4.0.4 のインストールが失敗するようになった問題に対応するため、ruby-build 経由の両インストールパス(mise および rbenv)で --disable-install-doc オプションを適用するワークアラウンドが追加されました。
背景
Ruby 4.0.4 のインストール時ドキュメント生成でアップストリームのリグレッションが発生し、devcontainerのRuby featureがこのバージョンをプロビジョニングできなくなりました。mise と rbenv はともに内部で ruby-build を使用しているため、どちらのインストールパスも同じ問題の影響を受けています。この失敗は Ruby 4.0.4 固有のものであり、他バージョンのインストールフローは正常に動作しています。
対象バージョンのみにワークアラウンドを絞り込むことで、他バージョンの既存の挙動を変えず、影響範囲を最小限にとどめることが今回の設計方針の核心です。
技術的な変更
features/src/ruby/install.sh に run_ruby_install_command というヘルパー関数が新設され、バージョンごとのインストール前処理が一元化されました。
変更前は install_ruby_rbenv および install_ruby_mise のそれぞれが直接 su コマンドでインストールを実行していました。
変更前:
# rbenv
su "$_user" -c "/usr/local/share/rbenv/bin/rbenv install $_version"
# mise
su "$_user" -c "$_home_dir/.local/bin/mise install ruby@$_version"
変更後は、両関数ともインストールコマンドの実行を run_ruby_install_command に委譲します。この関数はバージョンが 4.0.4 のときのみ RUBY_CONFIGURE_OPTS='--disable-install-doc' を環境変数としてプレフィックスします。
変更後:
run_ruby_install_command() {
_user="$1"
_version="$2"
_command="$3"
_configure_opts=""
if [ "$_version" = "4.0.4" ]; then
_configure_opts="RUBY_CONFIGURE_OPTS='--disable-install-doc' "
fi
su "$_user" -c "${_configure_opts}${_command}"
}
# rbenv
run_ruby_install_command "$_user" "$_version" "/usr/local/share/rbenv/bin/rbenv install \"$_version\""
# mise
run_ruby_install_command "$_user" "$_version" "$_home_dir/.local/bin/mise install \"ruby@$_version\""
なお rbenv global および mise use -g のグローバル設定コマンドはインストール後の操作であるため、run_ruby_install_command を経由せず従来通り直接 su で実行されます。
設計判断
バージョン判定ロジックをヘルパー関数に集約する設計が採用されました。rbenv と mise の両パスにそれぞれ if [ "$VERSION" = "4.0.4" ] の分岐を書くのではなく、共通の run_ruby_install_command に一本化することで、将来同様のバージョン固有ガードレールが必要になった場合に変更箇所を1か所に限定できます。
また RUBY_CONFIGURE_OPTS の適用をインストールコマンドの環境変数プレフィックスとして渡す実装は、su -c で実行されるシェルのスコープに確実に環境変数を届けるための選択です。export でシェル変数として設定した場合、su による別ユーザーのサブシェルには引き継がれないため、この方法が適切といえます。
ワークアラウンドの適用範囲をRuby 4.0.4のみに明示的に限定しているため、将来このバージョン固有の問題が解消された際に、条件分岐を取り除くだけでクリーンに戻せる構造になっています。
まとめ
本PRは、アップストリームの一時的なリグレッションに対してスコープを限定したワークアラウンドを適切な抽象化とともに導入した変更です。run_ruby_install_command というヘルパー関数の追加により、バージョン固有の処理をDRYに管理しながら、他バージョンのインストールフローへの影響をゼロに抑えています。