Ruby on Rails · Gidas

Kaip atnaujinti Rails 6.1 iki Rails 8 nestabdant funkcijų kūrimo

Paskelbta Atnaujinta 8 min. skaitymo Autoriai: RubyPlius inžinieriai

Kodėl verta atnaujinti po vieną versiją

Kiekviena Rails versija iš pradžių pažymi elgseną kaip pasenusią ir tik vėlesnėje versijoje ją pašalina. Peršokus kelias versijas iš karto, aiškių įspėjimų sąrašas virsta krūva nepaaiškinamų klaidų. Judant po vieną versiją kiekvienas pakeitimas lieka pakankamai mažas, kad jį būtų galima peržiūrėti ir atšaukti.

1 žingsnis: auditas prieš keičiant Gemfile

  • Užfiksuokite dabartines Ruby ir Rails versijas ir patikrinkite jas pagal oficialią Rails palaikymo politiką.
  • Surašykite gem’us, kurie fiksuoja Rails versiją arba nebėra prižiūrimi.
  • Įvertinkite svarbiausių naudotojų scenarijų testų padengimą.
  • Surinkite įspėjimus apie pasenusius sprendimus iš žurnalų ir testų.

2 žingsnis: dual boot paruošimas

Dual boot leidžia tai pačiai kodo bazei veikti su dviem Rails versijomis. Naudojant next_rails gem’ą, antrasis lockfile seka naujesnę versiją, o produkcija toliau naudoja dabartinę.

# Gemfile
if next?
  gem "rails", "~> 7.0.0"
else
  gem "rails", "~> 6.1.7"
end
$ next_rails --init
$ next bundle install
$ next bundle exec rspec

Pridėkite antrą CI užduotį, kuri vykdo testus su naujesne versija, kad kiekvienas pakeitimas būtų tikrinamas su abiem.

3 žingsnis: pasenusių sprendimų taisymas ir naujos numatytosios reikšmės

Kai testai praeina su naujesne versija, įjunkite ją produkcijoje, bet palikite senąsias karkaso numatytąsias reikšmes. Tada naujas reikšmes įjunkite po vieną sugeneruotame inicializatoriuje.

# config/application.rb
config.load_defaults 6.1
# enable 7.0 defaults one at a time in
# config/initializers/new_framework_defaults_7_0.rb

4 žingsnis: kiekvieną žingsnį išleiskite į produkciją

Kiekvienas versijos žingsnis baigiasi produkcijoje prieš pradedant kitą. Jei kas nors sugenda, pakeitimas mažas, o grįžimas atgal – vienas diegimas.

Dažniausios kliūtys

  • Klasikinis autoloader. Rails 7.0 reikalauja Zeitwerk – pereikite prie jo dar su Rails 6.1.
  • Ruby versija. Rails 8 reikalauja Ruby 3.2 ar naujesnės – Ruby atnaujinimą planuokite kartu.
  • Apleisti gem’ai. Pakeiskite juos arba perkelkite į savo kodą, kol jie neužblokavo versijos žingsnio.
  • Išteklių apdorojimas. Naujos Rails 8 programos pagal nutylėjimą naudoja Propshaft; esamos gali palikti Sprockets ir pereiti vėliau.

Dažniausiai užduodami klausimai

Ar galima praleisti Rails 7.1 ir iš karto pereiti prie 7.2?

Galima, bet rizikingiau: 7.1 versijoje pažymėti pasenę sprendimai be įspėjimo virsta klaidomis. Einant per kiekvieną versiją dažniausiai bendrai išeina greičiau.

Kokio testų padengimo reikia?

Pakankamo, kad būtų padengti scenarijai, kurie neša pajamas ar tvarko jautrius duomenis. Šiuos testus paprastai parašome prieš pirmąjį versijos žingsnį.