bin/rails app:update 実行時に CORS 設定がコメントアウトされる問題に注意to_time_preserves_timezone 設定は 8.1 で非推奨になったため削除するschema.rb のカラム順序がアルファベット順に変更されるため、スキーマダンプを実行してコミットに含める# 変更前
gem "rails", "~> 8.0"
# 変更後
gem "rails", "~> 8.1"
bundle update railsbundle exec rails app:update対話形式で各ファイルの更新を確認されます。基本的な判断基準は以下のとおりです。
config/application.rb → スキップ(既存設定を維持)config/environments/*.rb → 差分を確認して判断config/initializers/new_framework_defaults_8_1.rb → 作成bin/* → 上書きconfig/routes.rb → スキップconfig/application.rb を編集します。
config.load_defaults 8.1
load_defaults 8.0 で全て適用済みのため、以下のファイルがあれば削除します。
rm config/initializers/new_framework_defaults_7_1.rbRails 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
end
bundle exec rails zeitwerk:check
bundle exec rspecapp:update を実行すると、config/initializers/cors.rb がテンプレートで上書きされ、既存の CORS 設定が全てコメントアウトされることがあります。
API として動作しているアプリケーションでは、この変更により API が動作しなくなります。上書きしてしまった場合は、以下のコマンドで復元できます。
git checkout config/initializers/cors.rbapp: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 = :zone
8.1 では :zone がデフォルトの動作となっているため、削除しても挙動は変わりません。
Rails 8.1 で追加された主な機能は以下のとおりです。
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 は以下のような場面で役立ちます。
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-signoff長時間実行するジョブを複数ステップに分割し、中断後に続きから実行できるようになりました。
前述のとおり、schema.rb 内のテーブルカラムがアルファベット順にソートされるようになりました。