[rails/spring] Rails 8.1とRuby 4.0のサポートを追加、CI/CDパイプラインを強化
Context
Railsの高速起動ツールである「Spring」が、最新のRails 8.1とRuby 4.0への対応を進めています。この変更は、Railsエコシステムの進化に追従し、開発者が最新のRubyとRailsバージョンでSpringを利用できるようにするためのものです。同時に、CI/CDパイプラインの改善により、テストマトリックスの失敗を適切に検出できるようになりました。
Technical Detail
テストマトリックスの拡張
GitHub Actionsのワークフローが更新され、新しいバージョンの組み合わせがテストマトリックスに追加されました。
matrix:
ruby: [ '3.1', '3.2', '3.3', '3.4', '4.0', 'head' ]
rails: [ '7.1', '7.2', '8.0', '8.1', 'edge' ]
Ruby 4.0とRails 8.1が追加され、より広範なバージョンでのテスト実行が可能になりました。
互換性の調整
古いバージョンの組み合わせで発生する問題を回避するため、excludeルールが追加されています。
exclude:
- ruby: '3.1'
rails: 'edge'
- ruby: '3.1'
rails: '8.0'
- ruby: '3.1'
rails: '8.1'
- ruby: '3.2'
rails: 'edge'
Ruby 3.1はRails 7.2までのサポートに限定され、Ruby 3.2はRails edgeとの組み合わせを除外することで、サポートされていない組み合わせでのテスト失敗を防いでいます。
CI/CDパイプラインの強化
新たにsummaryジョブが追加され、テストマトリックス全体の結果を集約して確認できるようになりました。
summary:
runs-on: ubuntu-latest
needs: tests
if: always()
steps:
- name: Check test matrix results
run: |
if [ "${{ needs.tests.result }}" != "success" ]; then
echo "Tests failed or were cancelled"
exit 1
fi
この変更により、マトリックス内のいずれかのテストが失敗した場合でも、CI全体のステータスが正確に反映されるようになります。従来はfail-fast: false設定により、一部のテストが失敗してもワークフロー全体は成功扱いになる可能性がありましたが、この問題が解決されました。
Minitest 6への対応
依存関係の管理として、Minitest 6未満のバージョンに固定する制約が追加されました。
gem "minitest", "< 6"
これは、Minitest 6で導入された破壊的変更への対応が完了するまでの暫定措置です。テストヘルパーでも同様の制約が適用されています。
append_to_file(application.gemfile, "gem 'minitest', '< 6'")
Bundlerコマンドの更新
受け入れテストにおいて、Bundlerの推奨される新しいコマンド形式に更新されました。
app.run! "bundle config set path '.bundle'"
app.run! "bundle install --local"
従来のbundle install --path .bundleは非推奨となっており、bundle configで設定を分離する形式に変更されています。これにより、Bundler 2.xとの互換性が向上します。
CI環境でのテスト調整
CI環境でのパフォーマンステストの安定性を向上させるため、速度改善のアサーションをスキップする際に明示的な成功を示すようになりました。
if ENV['CI']
yield
assert true
else
app.with_timing do
yield
end
end
開発環境の更新
DevContainerの設定が、最新のRuby 4.0.0イメージを使用するように更新されました。
"image": "ghcr.io/rails/devcontainer/images/ruby:4.0.0"
これにより、開発者はローカル環境でも最新のRubyバージョンを使用してSpringの開発を行えます。
Impact
この変更により、Springは以下の環境で動作することが保証されます:
- Ruby 3.1〜4.0(およびhead)
- Rails 7.1〜8.1(およびedge)
ただし、古いバージョンの組み合わせ(Ruby 3.1 + Rails 8.0/8.1、Ruby 3.2 + Rails edge)はサポート対象外となります。CI/CDパイプラインの改善により、これらの制約が明確に可視化され、開発プロセスの信頼性が向上しました。