この記事のポイント
- Rails 8.0 → 8.1 は比較的小規模なアップグレードで、破壊的変更は少ない
bin/rails app:update実行時に CORS 設定がコメントアウトされる問題に注意- Active Storage を使っていない場合、自動生成されるマイグレーションは削除してよい
to_time_preserves_timezone設定は 8.1 で非推奨になったため削除するschema.rbのカラム順序がアルファベット順に変更されるため、スキーマダンプを実行してコミットに含める
前提条件
- Ruby 3.2.0 以上
- Rails 8.0.x
アップグレード手順
1. Gemfile の更新
# 変更前
gem "rails", "~> 8.0"
# 変更後
gem "rails", "~> 8.1"2. bundle update の実行
bundle update rails3. app:update の実行
bundle exec rails app:update対話形式で各ファイルの更新を確認されます。基本的な判断基準は以下のとおりです。
config/application.rb→ スキップ(既存設定を維持)config/environments/*.rb→ 差分を確認して判断config/initializers/new_framework_defaults_8_1.rb→ 作成bin/*→ 上書きconfig/routes.rb→ スキップ
4. load_defaults の更新
config/application.rb を編集します。
config.load_defaults 8.15. 古いデフォルト設定ファイルの削除
load_defaults 8.0 で全て適用済みのため、以下のファイルがあれば削除します。
rm config/initializers/new_framework_defaults_7_1.rb6. スキーマダンプの実行
Rails 8.1 では schema.rb のカラム順序がアルファベット順にソートされるようになりました。アップグレード後にスキーマダンプを実行して、変更をコミットに含めます。
bundle exec rails db:schema:dumpこの変更により、schema.rb の差分が大きくなりますが、これは一度限りの変更です。以降はカラム順序が一貫するため、マシン間でのスキーマダンプの差分が減り、レビューがしやすくなります。
変更例を示します。
# 変更前(定義順)
create_table "assets" do |t|
t.bigint "workspace_id", null: false
t.string "file", null: false
t.string "name", limit: 100, null: false
t.string "checksum", limit: 64, null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
# 変更後(アルファベット順)
create_table "assets" do |t|
t.string "checksum", limit: 64, null: false
t.datetime "created_at", null: false
t.string "file", null: false
t.string "name", limit: 100, null: false
t.datetime "updated_at", null: false
t.bigint "workspace_id", null: false
end7. テストの実行
bundle exec rails zeitwerk:check
bundle exec rspec注意が必要なポイント
CORS 設定の上書き問題
app:update を実行すると、config/initializers/cors.rb がテンプレートで上書きされ、既存の CORS 設定が全てコメントアウトされることがあります。
API として動作しているアプリケーションでは、この変更により API が動作しなくなります。上書きしてしまった場合は、以下のコマンドで復元できます。
git checkout config/initializers/cors.rbActive Storage マイグレーションの自動生成
app:update 実行時に Active Storage 関連のマイグレーションが自動生成されます。
db/migrate/YYYYMMDD..._add_service_name_to_active_storage_blobs.active_storage.rb
db/migrate/YYYYMMDD..._create_active_storage_variant_records.active_storage.rb
db/migrate/YYYYMMDD..._remove_not_null_on_active_storage_blobs_checksum.active_storage.rbCarrierWave など他のファイルアップロードライブラリを使用していて Active Storage を使っていない場合、これらのマイグレーションは不要です。削除して問題ありません。
非推奨設定の削除
config.active_support.to_time_preserves_timezone は Rails 8.1 で非推奨となり、8.2 で削除予定です。この設定が config/environments/test.rb などに存在する場合は削除します。
# 削除する行
config.active_support.to_time_preserves_timezone = :zone8.1 では :zone がデフォルトの動作となっているため、削除しても挙動は変わりません。
新機能
Rails 8.1 で追加された主な機能は以下のとおりです。
ローカル CI 機能
bin/ci コマンドと config/ci.rb が追加されます。ローカルで CI 相当のチェックを一括実行できる機能です。
デフォルトで生成される config/ci.rb には RuboCop と Brakeman のステップが含まれています。
# config/ci.rb
CI.run do
step "Setup", "bin/setup --skip-server"
step "Style: Ruby", "bin/rubocop"
step "Security: Brakeman code analysis", "bin/brakeman --quiet --no-pager --exit-on-warn --exit-on-error"
endプロジェクトに合わせたカスタマイズ
RSpec などのテストを追加する場合は、config/ci.rb を編集します。
# config/ci.rb
CI.run do
step "Setup", "bin/setup --skip-server"
step "Style: Ruby", "bin/rubocop"
step "Security: Brakeman", "bin/brakeman --quiet --no-pager --exit-on-warn --exit-on-error"
step "Test: RSpec", "bin/rspec"
end実行方法
bin/ci各ステップが順番に実行され、失敗した場合はそこで停止します。全てのステップが成功すると、CI が通ったことが確認できます。
活用シーン
ローカル CI は以下のような場面で役立ちます。
- プルリクエストを作成する前に、CI で失敗しないことをローカルで確認したい
- GitHub Actions などのリモート CI の実行を待たずに、手元で素早くチェックしたい
- チーム全体で統一された CI チェック手順を共有したい
GitHub との連携
gh CLI と gh-signoff 拡張を使うと、CI 成功時に GitHub のコミットステータスを更新できます。これにより、ローカル CI が通った PR のみマージ可能にするワークフローも実現できます。
# config/ci.rb
CI.run do
step "Setup", "bin/setup --skip-server"
step "Style: Ruby", "bin/rubocop"
step "Test: RSpec", "bin/rspec"
if success?
step "Signoff", "gh signoff"
end
endこの機能を使うには、事前に以下のセットアップが必要です。
gh extension install basecamp/gh-signoffActive Job Continuable
長時間実行するジョブを複数ステップに分割し、中断後に続きから実行できるようになりました。
schema.rb のカラム順序変更
前述のとおり、schema.rb 内のテーブルカラムがアルファベット順にソートされるようになりました。