Zkušenosti s upgradem webů z Drupalu 8 na Drupal 9

Mám za sebou několik upgradů webů běžících na Drupalu 8 na novější řadu. Všechny již běží na Drupal 9 a až na pár drobností byl přechod bez problémů. Ale i drobnosti mohou potrápit. Rád se o ně tedy v tomto článku podělím.

Samozřejmě, Drupal 9 už nějaký ten pátek používám. Pro nové projekty. Ale zatímco dříve jsem experimentoval na svých projektech a až poté nasazoval novinky ke klientům, nyní to bylo obráceně. Pravdou je, že Drupal 9 zase tak velký experiment není. Jde prostě o evoluci Drupalu 8, který je léty již dostatečně prověřen.

K upgradům jsem se ve větším měřítku dostal až během prosince. Došlo i na Maxiorla, takže teď už koukáte na Drupal 9. Povýšení na novou verzi se osmičkáři nemusí bát. Rozhodně je ale dobré se připravit a vše otestovat bokem.

Vývojová kopie, aktualizace osmičky, Upgrade Status

Prvním krokem při uvažovaném upgrade na Drupal 9 je tedy vytvoření kopie webu. Já, nepoužívajíc Docker, jsem sáhl po klasickém lokálním Apache, v prostředí macOS rozběhnutém s využitím Homebrew. Na vývojový server se mi weby stěhovat nechtělo.

Následuje aktualizace na nejnovější verzi Drupalu 8.9.x a všech použitých modulů. To vám samo o sobě zajistí, že budete mít snad vše kompatibilní s Drupalem 9. Alespoň já tedy používám většinou takové moduly, které jsou aktivně udržované a nenarazil jsem na závažnější problém, kvůli kterému bych na podporu Drupalu 9 musel čekat.

Dalším krokem je instalace modulu Upgrade Status. Po zapnutí vám v administrační části Logy > Upgrade status zobrazí několik informací s výsledky kontroly kompatibility vašeho webu s Drupalem 9.

Kontrola prostředí, tedy webového serveru, verze PHP a verze databáze, samozřejmě proběhne oproti místu, kde máte testovací kopii webu. Není-li na stejném serveru, pak je to zavádějící a doporučuji se důkladně ujistit, že parametry serveru/hostingu odpovídají požadavkům Drupalu 9.

Povyšte na kompatibilní řadu modulů

U některých modulů se mi stalo, že byly aktualizované na nejnovější verze své stávající řady, ale ta ještě Drupal 9 nepodporovala. Z výstupu Upgrade status to snadno zjistíte. Pak stačí jen příkaz composer require drupal/modul :^číslo_verze s následnou aktualizací databáze a modul je povýšen.

Co s nekompatibilními moduly?

Naprostá většina modulů, která se s Drupalem 9 zatím nekamarádila, postrádala jen drobné změny v info.yml souborech nebo jednoduché úpravy kódu. A vždy jsem našel v diskusích na drupal.org patch, který to řešil.

Určitě nechcete řešit ruční patchování modulu. Doplňte si do projektu composer require cweagans/composer-patches. V souboru composer.json v kořenové složce svého projektu vyhledejte část extra{} a na její začátek přidejte příkazy pro patchování v následujícím tvaru:

        "patches": {
            "drupal/modul": {

                "váš popisek": "https://www.drupal.org/…/neco.patch"
            },
            "drupal/jiny_modul": {
                "váš jiný popisek": "https://www.drupal.org/…/jiny.patch"
            },
        },

Kdykoli spustíte příkaz composer install, patchování modulů se provede.

Upgrade na Drupal 9 a vaše vlastní moduly

Specifická situace se týká vašich vlastních modulů a témat vzhledu. Jejich kompatibilitu za vás nevyřeší žádný obecný patch na drupal.org. Pokud nepoužíváte žádné deprecated funkce, pak to bude bez práce. Ale na rovinu: já jsem třeba u Maxiorla na řadu modulů nesáhl od doby, co jsem je připravil, takže samozřejmě v nich byla řada deprecated volání.

Drupal 9 se totiž od Drupalu 8 liší především tím, že ruší věci, které byly v Drupalu 8.9 označeny jako zastaralé, ale zatím stále fungovaly. Příkladem takové funkce je třeba drupal_set_message(), kterou nově voláte jako \Drupal::messenger()->addMessage().

V první řadě se vraťte na stránku s hlášením Upgrade status. Zaklikněte svoje moduly a tlačítkem vespod spusťte jejich kontrolu. Pokud v nich kontrola najde problémy, zobrazí se v samostatné tabulce s možností si počet problémů rozkliknout a dozvědět se více.

Výstup z modulu Upgrade Status

Ty detailnější informace vás velmi dobře navedou. Uvidíte konkrétní soubor v modulu, kde je něco špatně a zároveň i návrh řešení. Takto vše projdete, poté spustíte kontrolu modulu znovu a jste hotovi. Ve výsledku vám bude fungovat jak v Drupalu 8.9, tak potom v ryzí devítce.

Upgradujeme jádro na Drupal 9

Jakmile máte všechna rozšíření kompatibilní, mělo by to jít jako po drátkách:

  1. Ve složce /web/sites/default nastavte zápis pro soubory *settings.php a *services.yml.
  2. Zavolejte příkaz composer require drupal/core-recommended:^9.0.0 drupal/core-composer-scaffold:^9.0.0 drupal/core-project-message:^9.0.0 --update-with-dependencies --no-update
  3. Následně prostý composer update
  4. Aktualizujte databázi, ideálně z příkazového řádku přes drush updatedb -y
  5. Ujistěte se, že v composer.json máte "drupal/core": "^9.0.0",
  6. Zrušte práva zápisu k souborům uvedeným v bodu 1.

Podrobně je tato část popsána zde v dokumentaci na drupal.org.

Jestliže patchujete info.yml soubory některých modulů tak, aby v nich byla uvedena kompatibilita s Drupalem 9, je potřeba je ošálit, aby si před aplikací patche mysleli, že běží na osmičce. Zařídí to následující příkaz, který upraví composer.json.

composer require "drupal/core:9.0.0 as 8.9.0"

Čísla verzí upravte na aktuálně dostupné a použité.

Co může kontrole kompatibility uniknout

Bohužel Upgrade Status není všemocný, takže nějaké drobnosti mu mohou uniknout. Při upgradu Maxiorla jsem na nějaké narazil.

Po upgrade uvidíte bílou stránku a v error logu hlášení: You have requested a non-existent service "path.alias_manager". Did you mean this: "path_alias.manager"?

Řešením je přepsat volání služeb z path.alias_manager na path_alias.manager. Tato změna se odehrála opět někdy v průběhu života Drupalu 8 a do verze 8.9 fungovalo kvůli zpětné kompatibilitě obojí. Ideálně, když vyhledáte všechny výskyty původního řetězce a necháte jej přepsat.

Kontrole v Upgrade Status v mém případě uniklo také volání getVocabularyId(), které je třeba nahradit za bundle().

Tyto problémy odhalíte velice snadno, bohužel ale až poté, co upgrade provedete. Proto je tak důležité mít testovací verzi a na ní vše připravit.

Nasazujeme na ostrý web

V momentě, kdy máte vše vyzkoušeno na testovací kopii, mělo by stačit provést překopírování vašich vlastních modulů (jestli ručně nebo Gitem, to je fuk, neřeším vaše workflow) a na produkci zavolat composer install s následnou aktualizací databáze.

Přeji vám, ať se vám upgrade na Drupal 9 podaří, máte na to čas do listopadu letošního roku. A budu rád, když se o své zkušenosti případně podělíte v komentářích nebo mi napíšete někam na sociální sítě.

Tagy

Buďme ve spojení, přihlaste se k newsletteru

Odesláním formuláře souhlasíte s podmínkami zpracováním osobních údajů. 
Více informací v Ochrana osobních údajů.

Autor článku: Jan Polzer

Tvůrce webů z Brna se specializací na Drupal, WordPress a Symfony. Acquia Certified Developer & Site Builder. Autor několika knih o Drupalu.
Web Development Director v Lesensky.cz. Ve volných chvílích podnikám výlety na souši i po vodě. Více se dozvíte na polzer.cz a mém LinkedIn profilu.

Komentáře k článku

návštěvník

Dobrý den, je to zajímavý článek. Samotný přechod z drupalu 8.9.15 na 9.1.8 na localhost proběhl až zázračně hladce. Jinak řečeno na localhostu to šlape krásně jak má. Komplikace bohužel nastaly při snaze o přesunutí na doménu. Zde jsem zjistil, že je nutné po uploadování databáze a nakopírování souborů spustit composer kvůli dependenies. Stávající provider toto zatím neumožňuje, tudíž se vracím zpět na D8, prozatím...

Profile picture for user Jan Polzer

Zdravím. Asi nerozumím. Pokud vám to běží na localhostu, pak stačí web zkopírovat 1:1 na hosting, ne?

návštěvník

Dobrý den, děkuji za radu. O kopírování webu 1-1 se snažím.
Doposud jsem používal D8 be composeru. Abych dokázal migrovat na D9 předělal jsem stránky, tudíž teď je struktura localhost/nazev/web. stránky na localhostu fungují, jak pro d8, tak pro d9.
Problém / těžkosti jsou s přenesením na doménu. Okopíruji vše co je pod /web/ do www adresáře na doméně, Natáhnu databázi, upravím settings.php a pokud chí spustit web na doméně, hodí to tuto chybu:
Warning: require(/data/web/virtuals/276373/virtual/www/../vendor/autoload.php): failed to open stream: No such file or directory in /data/web/virtuals/276373/virtual/www/autoload.php on line 16

Fatal error: require(): Failed opening required '/data/web/virtuals/276373/virtual/www/../vendor/autoload.php' (include_path='.:/data/web/virtuals/276373/virtual') in /data/web/virtuals/276373/virtual/www/autoload.php on line 16

i když projdu autoload nenacházím nic co by to mělo způsobovat.

'return require __DIR__ . '/../vendor/autoload.php';'

Pravdou je, že na hostingu nemůžu spustit composer a updatnout dependencies (wedos).

Tudíž se chci zeptat, co udělat pro přesun stránky 1 : 1 tak, aby to tuto chybu nehlásilo.
Stejná chyba se ukazuje jak pří D8, tak D9 upgradovaných/aktualizovaných přes composer. Stránky stvořené manuálně při přesouvání komplikace nemají.
Děkuji za radu
Libor

Profile picture for user Jan Polzer

No to samozřejmě takto nepůjde. Musíte překopírovat všechno, tedy web, vendor atd. do složky www na hostingu. Jinak vám samozřejmě chybí soubory. Následně musíte v nastavení hostingu změnit, aby se web nenačítal ze složky www, ale ze složky www/web. Pokud to hosting neumožňuje, tak musíte jít jinam nebo si pohrát s nastavením v .htaccess, to je ale zbytečně komplikované a nevhodné.

S composerem to nemá co dělat.

návštěvník

Dobrý den, děkuji za adu. provider tuto změnu udělat neumí, tudíž zůstává už jen prekopat .htaccess.
L

Přidat komentář

Odesláním komentáře souhlasíte s podmínkami Ochrany osobních údajů

reklama
Moje kniha o CMS Drupal

 

Kniha 333 tipů a triků pro Drupal 9


Více na KnihyPolzer.cz

Sledujte Maxiorla na Facebooku

Maxiorel na Facebooku

Hosting pro Drupal a WordPress

Hledáte český webhosting vhodný nejenom pro redakční systém Drupal? Tak vyzkoušejte Webhosting C4 za 1200 Kč na rok s doménou v ceně, 20 GB prostoru a automatické navyšováním o 2 GB každý rok. Podrobnosti zde.

@maxiorel na Twitteru

Maxiorel na Twitteru