CI環境でのBundlerコマンドをモダンなオプションに移行
この変更では、GitHub Actions上でのBundler実行コマンドが最新のベストプラクティスに沿った形式に更新されました。非推奨となった --binstubs と --standalone オプションが削除され、bundle config による設定方式に統一されています。
背景
bundle install --binstubs のような古い形式のコマンドがCI環境で正常に動作しなくなった問題を受け、CI設定全体の見直しが行われました。#2880 のDescriptionには「Outdated command no longer works」と記載されており、動作しなくなった古いオプションの削除が主な目的です。
技術的な変更
GitHub Actionsワークフローの更新
.github/workflows/ci.yml で、従来の2ステップ実行が新しい script/bundle スクリプトに置き換えられました。
変更前:
- run: bundle install --standalone
- run: bundle binstubs --all
変更後:
- run: script/bundle
script/bundle は以下の処理を実行します:
echo "Set bundle path to .bundle/gems"
bundle config set --local path '.bundle/gems'
echo "bundle install"
bundle install
echo "bundle binstubs --all"
bundle binstubs --all
この変更により、--standalone オプションは削除されました。コメントによれば「Railsが動作しなくなる」という理由から、standalone形式のインストールは意図的に避けられています。
サンプルアプリ生成スクリプトの更新
example_app_generator/ci_retry_bundle_install.sh も同様の方針で書き換えられています。
変更前:
ci_retry eval "RUBYOPT=$RUBYOPT:' --enable rubygems' bundle install --gemfile ./Gemfile --path REPLACE_BUNDLE_PATH --retry=3 --jobs=3"
変更後:
ci_retry eval "bundle config set path REPLACE_BUNDLE_PATH; bundle install --gemfile ./Gemfile --retry=3 --jobs=3"
--path オプションが bundle config set path に置き換えられ、設定と実行が分離されました。また、RUBYOPT による --enable rubygems の設定も削除されています。これは script/functions.sh で RUBYOPT="--disable=gem" の定義が削除されたことと対応しています。
ヘルパー関数の更新
script/functions.sh に新しいRubyバージョン判定関数が追加されました。
function is_ruby_3_2_plus {
if ruby -e "exit(RUBY_VERSION.to_f >= 3.2)"; then
return 0
else
return 1
fi
}
function is_ruby_3_3_plus {
if ruby -e "exit(RUBY_VERSION.to_f >= 3.3)"; then
return 0
else
return 1
fi
}
これらの関数は、script/update_rubygems_and_install_bundler と script/run_build で使用され、Rubyバージョンに応じた処理の分岐に利用されています。特に Ruby 3.2未満 では古いRubyGemsとBundlerバージョンに制約される点が、明示的に管理されるようになりました。
if is_ruby_3_2_plus; then
gem update --no-document --system
gem install --no-document bundler
else
gem update --no-document --system '3.4.22'
gem install --no-document bundler -v '2.6.9'
gem uninstall error_highlight -v 0.3.0
gem install error_highlight -v 0.7.0
fi
Ruby 3.2未満の環境では、RubyGemsを3.4.22に、Bundlerを2.6.9に固定することで、古いRubyバージョンでの動作を保証しています。
script/run_build では、snippetsの実行がRuby 3.2以上に限定されました。
if is_ruby_3_2_plus; then
fold "snippets" script/run_snippets.sh
fi
CI マトリクスの調整
.github/workflows/ci.yml のtestジョブで、Ruby 3.2 × Rails main の組み合わせが削除されました。これにより、Rails mainブランチのテストはRuby 3.3以上でのみ実行されます。
- ruby: 3.3
env:
RAILS_VERSION: 'main'
# Ruby 3.2 × Rails main の組み合わせは削除された
設計判断
スクリプトファイルによる標準化 が選択されました。
CI設定内で直接Bundlerコマンドを実行する代わりに、script/bundle という共通スクリプトを作成することで、複数のワークフロー間でのコマンド実行方法が統一されています。この判断により、将来Bundlerのベストプラクティスが変わった場合でも、スクリプトファイル1箇所の修正で全CI環境に変更を反映できます。
また、Rubyバージョンごとの依存関係管理を明示化 する方針も読み取れます。is_ruby_3_2_plus のような判定関数を導入することで、どのRubyバージョンでどの制約が発生するかがコードから読み取りやすくなりました。特に error_highlight gemの手動更新は、Ruby 3.2未満の環境で発生する既知の問題への対処であることが、コメントから明確になっています。
まとめ
本PRは、動作しなくなったBundlerオプションを削除し、bundle config ベースの設定方式に移行した変更です。script/bundle による標準化とRubyバージョン判定の明示化により、CI環境の保守性が向上しています。この変更は、プロジェクトの実情(Railsとの互換性、古いRubyバージョンのサポート)を反映した判断といえます。