Каждый январь у нас одна традиция: пока задач мало, обновляемся. Монолит на Rails 8.0 и Ruby 3.4, команда из пяти человек, Hotwire и Kafka для событий. В этот раз сделали в два захода, и это было правильно.
Сначала Rails 8.1 на старом Ruby. Почти ничего не сломалось, app:update предложил новый config/ci.rb и bin/ci. Попробовали локальный CI: те же шаги, что в облачном, только гоняются на ноутбуке разработчика перед мержем. Наши 4200 тестов на свежем ноутбуке идут около шести минут, на старом у одного из ребят двенадцать, так что облачный CI пока не выключаем.
Потом Ruby 4.0. Два гема с нативными расширениями не собрались, у обоих уже были свежие версии, обновили. Новый JIT на проде пробовать не стали, он пока экспериментальный, оставили YJIT. Тесты зелёные, неделю на стейдже, в понедельник выкатываем.
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"
step "Tests: Rails", "bin/rails test"
end
Удобно, что это обычный Ruby: можно добавить условие и не гонять системные тесты, если менялся только бэкенд.
Цифры по Ruby 4.0 принесёте? Я мерил на синтетике и на одном API: YJIT на 4.0 против 3.4 в пределах 2-3 процентов по p50, почти шум. Новый JIT на том же API пока заметно медленнее YJIT, так что не трогать его на проде правильно.
а has_many ... deprecated: true из 8.1 кто-нибудь уже пробовал? Выглядит полезно для чистки старых связей
Цифры с прода принесу через неделю. По тестам набор на Ruby 4.0 идёт на 4% быстрее, но это может быть и шум. За deprecated в связях спасибо, у нас как раз три старые связи висят со времён первой версии, пометим и посмотрим, кто в них ходит.
Два захода, сначала Rails, потом Ruby, это правильно. Когда всё сразу, потом не понять, кто виноват