【Drupal】Drupal9系からDrupal10へのバージョンアップ

# はじめに
私は新卒5年目としてSIerでエンジニアとしてWeb系の開発をおこなっており、
業務ではDrupalと呼ばれるオープンソースCMSを扱っています。

今回はDrupal9からDrupal10へのバージョンアップについて調査しましたため、
備忘もかねてやり方をまとめていきます。


# この記事の対象読者
* Drupalで構築されたWebサイトを扱う人
* これからDrupal10へバージョンアップしようとしている人


# おことわり
公式の手順や私自身の経験も含めて整理していますが、
読者の環境によっては例外もありますことをご留意ください。
また記載内容に誤りがあれば **優しく** ご指摘ください。


# 環境を確認する
使用している環境がバージョンアップを実行できる(orDrupal10を利用できる)環境であるか確認します。
WebサーバーやPHPなど一部のミドルウェア等はDrupalの管理画面から確認することができます。
[ログイン後]レポート > サイトの状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/dd09a540-cb8d-0cbe-1203-5f744d8ee37a.png)

## ブラウザ
以下ブラウザの最新メジャーバージョン
* Google Chrome
* FireFox
* Safari
* Safari for iOS
* Microsoft Edge
* Opera

## データベース
以下のDBMSおよびバージョンが推奨されています。
* MariaDB 10.3.7+
* MySQL/Percona 5.7.8+

また次の構成が推奨されています。
* プライマリストレージエンジンとしてInnoDBを採用していること
* PDOデータベース拡張機能

MySQLやMariaDBを使用する場合、
推奨されているトランザクション分離レベルは「 **READ COMMITTED** 」です。
デフォルトは「REPEATABLE READ」ですがデッドロックが発生してサイトアクセスに影響が及ぶ可能性があります。
非推奨のレベルは利用可能ですがサポートされていないことにご注意ください。

## Webサーバー
後述のPHPバージョンの要件を満たすPHPが搭載されているWebサーバーで動作します。
* Apache 2.4.7+
* Nginx 0.7.x, 0.8.x, 1.0.x, 1.2.x, 1.8.x, 1.9.x
* MS IIS 5,6,7,8,10

## PHP
DrupalはPHPで動作しています。
以下のPHPバージョンであればDrupal10に対応しています。
* PHP8.1.x以上（推奨はPHP8.1.6）

## Composer
Drupalのパッケージ管理はComposerを使用します。
以下のComposerであればDrupal10に対応しています。
* Composer 2.3.6以上

# Drupal9.4または9.5系にバージョンアップする
環境が確認出来ても、もし利用しているDrupalがバージョン9.3以下の場合、
一度Drupal9.4または9.5以上にバージョンアップする必要があります。

# コントリビュートテーマ/モジュールをアップデートする
DrupalのCoreをバージョンアップする前に、
サイトにインストールされているコントリビュートテーマやモジュールをDrupal10に互換性のあるバージョンにアップデートします。

Drupal10に互換性のあるバージョンが存在するかどうかはUpgrade Statusモジュールを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/287bf31b-bc34-0de6-13f6-b73ed70a498a.png)
[Upgrade Status | Drupal.org](https://www.drupal.org/project/upgrade_status)
このモジュールはサイトにインストールされている / インストール可能なモジュールが上位メジャーバージョンに対応しているかどうかをチェックしてくれます。
互換性のないモジュールについては作成者に互換バージョンの作成を依頼する必要があります。
※ただし多くの場合は互換性のあるバージョンが公開されていることが多いです。

# カスタムテーマ/モジュールをアップデートする
カスタムテーマ / モジュールを使用している場合はコードにDrupal10系で廃止されたコードが無いことを確認する必要があります。
カスタムテーマ / モジュール内のコードについても、上述のUpgradeStatusがチェックしてくれます。

# 非推奨のモジュールやテーマの使用を停止する
もしDrupal10で廃止されたモジュールやテーマを使用している場合はアンインストールしてください。

# バージョンアップ実施
ここまで準備できたらいよいよバージョンアップを実施します。
具体的な実行手順は次の通りです。（パスについては環境に応じて変更してください。）
## 設定ファイルに一時的に書き込み権限を付ける
Drupalの設定を管理するファイルを一時的に書き込みできるようにします。
```
chmod 777 web/sites/default
chmod 666 web/sites/default/*settings.php
chmod 666 web/sites/default/*services.yml
```

## composerを使ってパッケージを取得する
パッケージ間の依存関係が相互に合わないことを回避するために必ず`--no-update`オプションを付けます。
```
composer require 'drupal/core-recommended:^10' 'drupal/core-composer-scaffold:^10' 'drupal/core-project-message:^10' --update-with-dependencies --no-update
```
もし`drupal/core-dev`を使用している場合は以下も実行します。
```
composer require 'drupal/core-dev:^10' --dev --update-with-dependencies --no-update
```

## モジュールやテーマのコードをDrupal10向けにアップデートする
```
composer update
```

## データベースをDrupal10向けにアップデートする
コードをアップデート出来たらDBもアップデートします。
```
drush updatedb
```

## 設定ファイルを読み取り専用に戻す
手順の最初に書き込みを許可した設定ファイルは読み取り専用ファイルに戻します。
```
chmod 755 web/sites/default
chmod 644 web/sites/default/*settings.php
chmod 644 web/sites/default/*services.yml
```

## 管理画面でバージョンを確認する
サイトの状態でバージョンを確認してDrupal10になっていればバージョンアップ完了です！お疲れさまでした！


# さいごに
この記事ではDrupal9系からDrupal10にバージョンアップする手順について紹介しました。

体験談をお話しすると、composerでコードをバージョンアップする際、
モジュール間の依存関係の夜エラーでなかなかうまく進められないことがありました。
Drupal.orgのissueをみたり、公開されているパッチを使って対応しましたが依存関係の解消はかなり面倒だった記憶があります。

試行錯誤多くなる作業かと思いますがこれからバージョンアップを検討している方は是非参考にしてください。

# 参考

https://www.drupal.org/docs/upgrading-drupal/upgrading-from-drupal-8-or-later/upgrading-from-drupal-9-to-drupal-10/overview

https://www.drupal.org/node/3264830

https://www.drupal.org/node/3295061