Magentoでマルチサイト構成のデプロイ時間に悩まされた話

takeda
2024-08-08
2024-08-08

こんにちは!

今回はMagentoおよびAdobe Commerce(以下まとめてMagento)のデプロイ時間に関するお話です。
Magentoの強みとして多言語対応やマルチサイト対応というものがあります。1つのシステム上でマルチサイトにおける商品管理やコンテンツ管理を一元的に行えるため、グローバルにECを展開している企業にとっては非常に強力な機能となっています。
とても便利な機能ですが、このような多言語マルチサイト構成のMagento環境でデプロイ時間について悩まされたことがあるので記事にまとめたいと思います。

今回の記事のポイント
  • 多言語マルチサイトにテーマを追加したらデプロイ時間がとんでもなく増加した
  • 原因は静的ビューファイル生成
  • 改善のポイントは静的ビューファイル生成時のテーマと言語の組み合わせ
  • 親テーマは生成しなくても良い

デプロイ時間がとんでもなく増加した

8か国にグローバル展開しているECサイトでの話。当初からコードデプロイに20~25分もかかる構成で、そこそこデプロイ時間がかかる印象はあったのですが、このサイトに新しくテーマを追加していったときデプロイ時間がどんどん増加していく事態になりました。

このサイトはマルチサイト構成ではありましたがテーマについては共通のテーマを使用していました。しかし各サイトに合わせたスタイルの調整が必要となったため、これまで共用していたテーマを各サイト毎に分けることになったのです。サイト用のテーマを作成し1つリリースする度にデプロイにかかる時間も少しずつ増加していき、最終的に8サイト分のテーマ対応が完了する頃には、デプロイ時間が50分近くかかる状況になっていました。
流石に時間がかかりすぎですし、状況によってはデプロイスクリプトがタイムアウトで停止してしまうリスクも出てきました。

原因は静的ビューファイル生成

テーマを追加すると静的ビューファイルの生成が増えます。その分、デプロイの時間もかかります。そんなことは容易に想像が付きますが、まぁ増えたとして多くて数分くらいだろうと考えていたのがちょっと甘かったです。

静的ビューファイルについて少し説明しておきますと、静的ビューファイルはMVCのビューの中におけるMagentoによって生成される恒久的な静的ファイルキャッシュ群の事です。もう少し具体的に言うとJavascriptやLESSのビルドによって構築されるJavascriptファイル、CSSファイル、サイト設定における恒久的な画像ファイル群、更にはフロントエンド側で利用する翻訳ファイルやHTMLテンプレート等のリソースファイルも含まれます。
これらはpub/static領域に静的なファイルとして配置されます。動作モードがdeveloperモードやdefaultモードの場合はオンデマンドに生成されますが、本番モードの場合はコマンドによるデプロイが必要です。

静的ビューファイルのデプロイは、次のコマンドで行います。(-f は動作モード問わずデプロイ強制するオプション)

bin/magento setup:static-content:deploy -f

普段からこのコマンドはよく使用していましたが -f 以外に細かなオプション指定などあまり意識せずに使っていたのが良くなかったです・・・。

pub/static領域にはテーマ毎にフォルダがあり更にその中でロケール毎にフォルダ分けがされています。そのためテーマと使用言語の組み合わせが多いほど生成されるフォルダとファイルが多くなります。

オプションを指定しない場合、全てのテーマおよび使用している全てのロケールの組み合わせを生成します。8言語も使用するようなマルチサイト構成ではサイト毎にテーマを用意するとテーマ×言語で膨大な数の静的ファイル群が生成されるため、デプロイ時間が非常に長くなってしまいました。その影響はファイル生成時だけに限らず、ファイルが多いという事はデプロイ時に行う旧ファイルの削除にも時間がかかりますし、ファイルパーミッションの変更などにも時間がかかります。

オプション指定しなかった場合のコマンド実行の様子

当時の再現をしてみます。オプション指定せずにコマンド実行するとこんな感じ。
(※テーマや言語は実際のものと異なります)

$ bin/magento setup:static-content:deploy -f

Deploy using quick strategy

frontend/Magento/blank/en_GB            2817/2817           ============================ 100%   13 secs
frontend/Magento/blank/en_US            2817/2817           ============================ 100%   12 secs
frontend/Magento/blank/fr_FR            2817/2817           ============================ 100%   14 secs
frontend/Magento/blank/ja_JP            2817/2817           ============================ 100%   16 secs
frontend/Magento/blank/ko_KR            2817/2817           ============================ 100%   9 secs
frontend/Magento/blank/zh_Hans_CN       2817/2817           ============================ 100%   10 secs
frontend/Magento/blank/zh_Hant_HK       2817/2817           ============================ 100%   12 secs
frontend/Magento/blank/zh_Hant_TW       2817/2817           ============================ 100%   12 secs
frontend/Magento/luma/en_GB             2833/2833           ============================ 100%   14 secs
frontend/Magento/luma/en_US             2833/2833           ============================ 100%   13 secs
frontend/Magento/luma/fr_FR             2833/2833           ============================ 100%   16 secs
frontend/Magento/luma/ja_JP             2833/2833           ============================ 100%   14 secs
(・・・中略、延々とデプロイが続く・・・)
frontend/BlogSample/uksite/ko_KR            2945/2945           ============================ 100%   21 secs
frontend/BlogSample/uksite/zh_Hans_CN       2945/2945           ============================ 100%   23 secs
frontend/BlogSample/uksite/zh_Hant_HK       2945/2945           ============================ 100%   19 secs
frontend/BlogSample/uksite/zh_Hant_TW       2945/2945           ============================ 100%   18 secs

Execution time: 1452.6738471985

静的ビューファイルの生成だけで約24分もかかってしまいました。
ちなみにpub/static 内に生成されたファイル数をカウントしてみたら279,890ファイル、114,204フォルダもありました。28万ファイルて!!!そりゃ時間かかりますよね・・・。

デプロイ時間の改善

該当のサイトは8か国に展開していましたが、それぞれのサイトはその国の言語しか使用しないものだったので、実際には使用されない組み合わせが多くありました。
8テーマ×8言語すべての生成は必要なく、テーマに対してそれぞれが使用する言語は1つで良いため、コマンドのオプションを指定して必要な組み合わせだけが生成されるように工夫し改善を試みました。

必要なファイルのみ生成してみる

生成するテーマや言語は下記のオプションで指定できます。

--area   エリア(frontend or adminhtml)
--theme  生成するテーマを指定
--language 生成する言語を指定

--themeや--languageは複数指定できます。ただし組み合わせまでは指定することが出来ずコマンド一発では難しかったため、テーマ毎にコマンドを分けて1つずつ実行するように工夫しました。

コマンド例

8つのテーマ生成のためコマンドを8回に分けて実行する事にします、更に管理画面用のテーマもあるのでそれも別途実行します。また管理画面だけは英語と日本語の2言語を使用する想定にしています。結果下記のような9行のコマンドになりました。これでかなり実行時間が削減できるはずです。

bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/glsite" --language en_US
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/jpsite" --language ja_JP
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/cnsite" --language zh_Hans_CN
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/twsite" --language zh_Hant_TW
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/hksite" --language zh_Hant_HK
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/krsite" --language ko_KR
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/frsite" --language fr_FR
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/uksite" --language en_GB
bin/magento setup:static-content:deploy -f --area adminhtml --theme "BlogSample/AdminTheme" --language en_US --language ja_JP

実際にコマンドを実行してみると必要な言語だけが生成されるようになりデプロイ時間も改善されましたが、他に少し気になることが出てきました。デプロイの様子を見ていると指定したテーマだけでなく親テーマも一緒に生成されていることが分かります。
例えば下記は1行目のコマンドの実行結果です。

$ bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/glsite" --language en_US

Deploy using quick strategy
frontend/Magento/blank/en_US            2817/2817           ============================ 100%   18 secs
frontend/Magento/luma/en_US             2833/2833           ============================ 100%   10 secs
frontend/BlogSample/default/en_US       2942/2942           ============================ 100%   20 secs
frontend/BlogSample/glsite/en_US        2945/2945           ============================ 100%   16 secs

Execution time: 76.209250926971

指定したテーマは「BlogSample/glsite」ですが、ベースにしている親のテーマの「default」や、更にはそのまた親テーマの「luma」や「blank」など継承元のテーマが全て生成されています。
これまで継承元テーマもデプロイされる事は当然だと思っていたので特に違和感が無かったのですが、これについて調べてみるとデプロイされた子テーマには継承した親テーマの静的ビューファイルは全て含まれているため、親テーマ自体をテーマに使用することが無いのであれば実はこれらの親テーマの生成は必須ではないようです。

そこで次はこれらの不要な親テーマの生成もしないようにしてみました。

親テーマの出力抑制

--no-parent オプションを指定すると親テーマを生成しないようにすることが出来ます。

改善後のコマンド例
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/glsite" --no-parent --language en_US
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/jpsite" --no-parent --language ja_JP
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/cnsite" --no-parent --language zh_Hans_CN
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/twsite" --no-parent --language zh_Hant_TW
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/hksite" --no-parent --language zh_Hant_HK
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/krsite" --no-parent --language ko_KR
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/frsite" --no-parent --language fr_FR
bin/magento setup:static-content:deploy -f --area frontend --theme "BlogSample/uksite" --no-parent --language en_GB
bin/magento setup:static-content:deploy -f --area adminhtml --theme "BlogSample/AdminTheme" --no-parent --language en_US --language ja_JP
ログの様子

Deploy using quick strategy
frontend/BlogSample/glsite/en_US            2945/2945           ============================ 100%   18 secs

Execution time: 19.926495075226

Deploy using quick strategy
frontend/BlogSample/jpsite/ja_JP            2945/2945           ============================ 100%   17 secs

Execution time: 22.672039031982

Deploy using quick strategy
frontend/BlogSample/cnsite/zh_Hans_CN       2945/2945           ============================ 100%   15 secs

Execution time: 19.342731952667

Deploy using quick strategy
frontend/BlogSample/twsite/zh_Hant_TW       2945/2945           ============================ 100%   20 secs

Execution time: 25.084573984146

Deploy using quick strategy
frontend/BlogSample/hksite/zh_Hant_HK       2945/2945           ============================ 100%   14 secs

Execution time: 18.487685918808

Deploy using quick strategy
frontend/BlogSample/krsite/ko_KR            2945/2945           ============================ 100%   18 secs

Execution time: 20.747480869293

Deploy using quick strategy
frontend/BlogSample/frsite/fr_FR            2945/2945           ============================ 100%   18 secs

Execution time: 22.517872095108

Deploy using quick strategy
frontend/BlogSample/uksite/en_GB            2945/2945           ============================ 100%   16 secs

Execution time: 19.579282999039

Deploy using quick strategy
adminhtml/BlogSample/AdminTheme/en_US       3406/3406           ============================ 100%   14 secs
adminhtml/BlogSample/AdminTheme/ja_JP       3406/3406           ============================ 100%   12 secs

Execution time: 29.950184106827

コマンドの実行時間は合計3分ほどで収まりました。
pub/static領域に生成されたファイル数については、27,202ファイル、11,138フォルダと、改善前と比べて10分の1に激減しています。
コードデプロイ全体で50分近くかかっていたスクリプト実行時間もなんやかんやで20~22分ほどになり、各サイトにテーマを追加する前と変わらない(むしろ少し早いくらいの)感じに改善されました。
・・・それでも20分強もかかるのには他にも沢山の改善ポイントがありそうなので、こちらについては今後取り組んでいきたいと思います。

まとめ

Magentoの静的ファイル生成は、実際に使用するテーマと言語の組み合わせのみに限定して生成するようにするとデプロイ時間やファイル容量の削減に大きく貢献できます。
たとえサイトが多言語やマルチサイト構成でなくても、標準のテーマであるblankやlumaはデプロイ不要な場合がありますし、フロントエンドが日本語だけのサイトならen_USのデプロイは不要です。適切なオプションを指定することで多くの場合でデプロイの改善が見込めると思います。

Magentoのコマンドには様々なオプションが用意されているので、何気なく普段使用しているコマンドもオプションについて詳しく調べてみると普段見落としがちな便利な使い方に気付くかもしれませんね。

オマケ

"bin/magento setup:static-content:deploy"という長ったらしいコマンドには実は省略形があります。

bin/magento se:s:d

ま、あんまり使わないかもですが、覚えておくと便利かも。

以上です。