Ako na upgrade z Drupal 9 na Drupal 10

Publikované - 26. septembra 2023
Upgrade z Drupal 9 na Drupal 10

Tento postup predpokladá že...

  1. Máme aspoň nejaké základy programovania, vieme čo je to terminál, command line, bash...
  2. Máme náš Drupal projekt nainštalovaný cez composer a tomu zodpovedá aj štruktúra adresárov v projekte - https://www.drupal.org/docs/understanding-drupal/directory-structure#s-composer-build-directories  
  3. Máme projekt nainštalovaný na lokále (ddev,lando...)
  4. Používame Drush - https://www.drush.org 
  5. Kód máme uložený v repozitáre niekde na gite (gitlab, bitbucket, github)

UPGRADE STATUS

Ako prvé si nainštalujeme a aktivujeme modul https://www.drupal.org/project/upgrade_status 

composer require 'drupal/upgrade_status'; drush en upgrade_status

Prejdeme na stránku /admin/reports/upgrade-status (Hlásenia > Upgrade Status)
Tu máme možnosť vidieť na koľko percent je stránka kompaktibilná s Drupal 10 a čo všetko nám treba vyriešiť.

Medzi prvými vidíme moduly na odstránenie - sú to moduly ktoré nie sú nainštalované a majú zastaralé verzie alebo nie sú kompaktibilné s novou verziou Drupalu. Keďže ich nepoužívame mali by sme ich odstrániť. Ďalej vidíme moduly ktoré je potrebné aktualizovať - sú nainštalované ale majú nekompaktibilné verzie


Potom vidíme v prehľade custom moduly ktoré sú nekompaktibilné a je potrebné ich upraviť.
A na konci sú moduly ktoré sú kompaktibilné a nevyžadujú si žiadnu akciu z našej strany. 

UPDATE MODULOV

Moduly ktoré nepotrebujeme môžeme oddinštalovať ale ja zvyčajne aktualizujem všetky moduly. Pred tým ešte skontrolujem v súbore composer.json (root projektu) či neobsahuje patche ktoré už boli vyriešené.

composer update -W
drush updb -y

po tomto kroku mi ostane pár modulov v tabuľke na odstránenie a niekoľko modulov ktoré neboli aktualizované. Ide o moduly ktoré si vyžadujú prechod na vyššie verzie. Napríklad máme na projekte modul webform s verziou 6.1.5 ale s Drupal 10 je kompaktibilná verzia 6.2. Modul teda aktualizujeme.

composer require 'drupal/webform:^6.2'; drush updb -y


Rovnakým spôsobom postupujeme aj pri ostatných moduloch. Moduly na odstránenie možeme odstrániť.

Príklad odstránenia modulu block class:

composer remove drupal/block_class

Po clearnuti cache sa mi objavil error ktorý súvisel s chýbajucou knižnicou dompurify tak ju bolo potrebné nainštalovať
https://www.drupal.org/project/colorbox/issues/2869067#comment-15126214 (mohlo ísť o lokálny problém, chyba sa nemusí prejaviť na každom projekte).

Teraz som sa dostal na 89% a ostáva vyriešiť custom moduly a contrib moduly ktoré ešte nepodporujú Drupal 10. 

UPRAVA CUSTOM MODULOV a CONTRIB MODULOV

Zaškrtneme checkboxy pri všetkých custom moduloch, prescrolujeme dole a potvrdíme buttom 'Scan selected'.
Po preskenovaní sa nám moduly presunuli do tabuliek
FIX WITH RECTOR a FIX MANUALY.
V stĺpcoch LOCAL SCAN RESULT si môžeme pozrieť konflikty ktoré treba v moduloch vyriešiť.

V mojom prípade viem vyriešiť len jeden prípad Rectorom https://www.drupal.org/project/rector a ostatné problémy je potrebné riešiť manuálne.

Inštalácia a použitie rector nástroja

composer require --dev palantirnet/drupal-rector
cp vendor/palantirnet/drupal-rector/rector.php .

skontrolujeme custom moduly na opravu kódu (zatiaľ na nečisto)


vendor/bin/rector process web/modules/custom/ --dry-run
vendor/bin/rector process web/themes/custom/ --dry-run

Ak máme vo výsledku návrh na zmenu, skontrolujeme to a spustíme na ostro


vendor/bin/rector process web/themes/custom/


Po tomto budú zmeny v kóde zapracované.

Ďalej sa pustíme do manuálnych akcií. Na úpravu a vývoj používam integrované vývojové prostredie (IDE) PHPStorm alebo VisualStudioCode.
Tieto akcie som zatiaľ musel urobiť skoro na každom projekte. 

  • vo všetkých custom moduloch a témach upravím v *.info.yml riadok na core_version_requirement: ^9 || ^10
  • vyriešime závislosti/dependencies ktoré je potrebné upraviť napr. crop zmenime na crop:crop pretože sa jedna o contrib modul a image zmenime na drupal:image pretože sa jedna o modul v jadre
  • upravíme všetky entity query ak je to potrebné https://www.drupal.org/node/3201242 (pridáme accessCheck)
  • zrefaktorujeme kód kôli odstránenej jquery.once knižnici https://www.drupal.org/node/3158256 

Ak sme vyriešili všetko v našich custom moduloch prejdeme na contrib moduly. 

  • pozrieme sa či existuje patch ktorý vyrieši kompaktibilitu
  • ak existuje použijeme ho resp. použijeme dev verziu modulu ak ešte nebol vydaný nový release modulu
  • ak neexistuje, upravíme modul manuálne (resp. za pomoci rectora) a vytvoríme vlastný patch ktorý tiež pridáme na Drupal.org

V mojom prípade šlo napríklad o modul spamicide ktorý stačilo nahradiť dev verziou https://www.drupal.org/project/spamicide/releases/8.x-1.x-dev 

OSTATNÉ POŽIADAVKY

Upgrade status mi ešte hlásil v requirmentoch zastaralé moduly jadra Drupalu ktoré je potrebné oddinštalovať resp. nahradiť ich verzie contrib modulmi pretože sa už v jadre nenachádzajú. 
Je potrebné sa oboznámiť s týmto postupom https://www.drupal.org/node/3223395 . Na mojom projekte som odinštaloval moduly Color, Quick Edit a tému Bartik.
Potom som nainštaloval CKEditor (ktorý neskôr premigrujeme na CKEditor5), RDF a témy Classy (môže to byť téma potrebná pre custom tému) a Seven


Problém s oprávneniami som vyriešil skriptom https://www.drupal.org/node/3193348#comment-14969643 

UPGRADE JADRA

Konečne sme sa dostali k finále. Rectora už môžeme oddinštalovať keďže ho už nebudeme potrebovať, zároveň si vytvoríme zálohy a exportujeme nastavenia. Všetky zmeny som commitol v branchi upgrade_d10.

composer remove palantirnet/drupal-rector; rm rector.php

drush cex -y
git checkout -b upgrade_d10

git add .

git commit -m 'Update Drupal 9'

následne skúsime spustiť upgrade

composer require drupal/core-recommended:^10.0 drupal/core-composer-scaffold:^10.0 drupal/core-project-message:^10.0 --no-update --update-with-all-dependencies
composer update -W

Žiaľ ešte nikdy sa mi nestalo že to zbehlo na prvý krát (ani na druhý:). 
Musel som ešte odinštalovať drupal/console ktorý sa na mojich projektoch nepoužíval a taktiež som aktualizoval drush/drush na verziu 12.
+ bolo potrebné aktualizovať jeden patch

Je možné že budete potrebovať 

composer require mglaman/composer-drupal-lenient 

ktorý umožní nainštalovať aj nekompaktibilné moduly. Využíva sa v prípade ak patch ešte nebol mergnutý do modulu.

Taktiež možno budete potrebovať spustiť pre niektoré moduly

vendor/bin/drush php-eval "\Drupal::keyValue('system.schema')->delete('color');"

na odstranenie zaznamov z odinštalovaných modulov.

Ak update composera zbehne v poriadku nezabutnite spustiť update databázy

drush updb -y

a commitnúť všetky nové zmeny

HOTOVO

Možeme skontrolovať stránku s hlásením stavu /admin/reports/status a vyriešiť prípadné chyby ktoré môžu byť na každom projekte individuálne.

Ak je na backende všetko v poriadku môžeme testovať frontend prípadne nasadiť upgrade na staging kde sa otestuje klientom (alebo ak ide o malý projekt môže ísť na produkciu). Pred tým si ale vždy zálohujte produkčné databázy…keby niečo ;)

Držím palce!

 

Kontaktujte ma

info@romanhaluska.sk

+421 907 956 992

2023 Roman Haluška - Web developer

Beží na: NextJS, DRUPAL 10