Kaip atnaujinti Rails 6.1 iki Rails 8 nestabdant funkcijų kūrimo
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į.