CI環境でのBundlerコマンドをモダンなオプションに移行

rspec/rspec-rails

この変更では、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.shRUBYOPT="--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_bundlerscript/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バージョンのサポート)を反映した判断といえます。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
3回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

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

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト(```言語:ファイルパス)やGitHubのPR番号へのリンク記法([#2880](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

BundlerやGitHub Actionsに関する専門用語が適切に使用されており、専門知識を持つエンジニアという対象読者に適合した内容になっています。

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

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

各セクション、各パラグラフが「総論→各論」の構造で書かれており、トピックセンテンスが段落の冒頭に配置されているため、非常に高い可読性を実現しています。1段落1トピックの原則も守られています。

Diff内容との照合 ✓ PASS

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

記事内で引用されているすべてのコードブロックは、提供されたDiff情報と完全に一致しています。ファイルパスや変更内容も正確に反映されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「Bundler」「--standalone」「binstubs」「GitHub Actions」などの技術用語が文脈に応じて正確に使用されています。

説明の技術的正確性 ✓ PASS

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

「--standaloneがRailsで問題を起こす」「RUBYOPTの変更」など、Diff内のコメントやコードの関連性を踏まえた技術的な説明が正確かつ論理的です。

事実の突合 ✓ PASS

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

記事内のすべての主張は、PRのDescriptionやDiff内のコード、コメントによって裏付けられており、ハルシネーション(捏造)は見られません。

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

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

PR番号(#2880)、Rubyバージョン(3.2, 3.3)、gemのバージョン番号などがすべて正確に記載されています。

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

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

記事のタイトル「CI環境でのBundlerコマンドをモダンなオプションに移行」は、PRの主題である「古いコマンドの削除と新しい設定方法への更新」を的確に要約しています。

外部知識の正確性 ✓ PASS

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

PR情報に含まれないバージョンサポート状況やリリース日程などの外部知識の追加はなく、すべての記述が提供された情報に基づいています。

時間表現の正確性 ✓ PASS

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

PRの「no longer works(もはや動作しない)」という状況を、「正常に動作しなくなった」と過去・完了形で正確に表現しており、時間表現の歪曲はありません。