Adobe Commerce パッチを大規模に配布するためのベストプラクティス
複数のAdobe Commerce インストールを管理する場合、 パッチ適用は複雑なプロセスになる可能性があります。 一元的なパッチ適用は、企業にとってベストプラクティスです。 Adobe Commerceのすべてのインストールに適切なパッチを適用するのに役立ちます。 このトピックでは、すべての種類のAdobe Commerce パッチ に対して一元的にパッチを配布する方法について説明します。
影響を受ける製品とバージョン
- Adobe Commerce on cloud infrastructure
- Adobe Commerce オンプレミス
戦略
パッチには様々な種類があり、適用する方法も多いので、最初に適用するパッチを知るにはどうすればよいでしょうか? パッチが多ければ多いほど、同じファイルや同じコード行に適用される可能性が高くなります。 パッチは次の順序で適用されます。
-
セキュリティパッチは、Adobe Commerce リリースの静的コードベースの一部です。
-
コンポーザーのパッチ ~
composer installおよびcweagans/composer-patchesなどのcomposer update個のプラグイン。 -
すべての 必要なパッチ は、Cloud Patches for Commerce パッケージに含まれています。
-
[Quality Patches Tool]に含まれる高品質のパッチ を選択しました。
-
カスタムパッチとAdobe Commerceは、パッチ名でアルファベット順に
/m2-hotfixesディレクトリのパッチをサポートします。note important IMPORTANT パッチを適用すればするほど、コードが複雑になります。 複雑なコードを使用すると、新しいバージョンのAdobe commerceへのアップグレードがより困難になり、総所有コストが増加する可能性があります。
Adobe Commerceの複数のインストールを管理する責任がある場合、すべてのインスタンスに同じパッチセットがインストールされていることを確認することは困難です。 各インストールには、独自のGit リポジトリ、/m2-hotfixes ディレクトリ、およびcomposer.json ファイルがあります。 お客様が持っている唯一の保証は、クラウドユーザーに必要な セキュリティパッチ と パッチ がすべて、メインのAdobe Commerce版の一部としてインストールされていることです。
現在、この問題に対する一元的な解決策はありませんが、Composerはギャップを埋める方法を提供します。 cweagans/composer-patches パッケージでは、依存関係🔗から パッチを適用できます。 すべてのパッチをインストールするComposer パッケージを作成し、そのパッケージをすべてのプロジェクトに必要とすることができます。
セキュリティパッチ、必要なパッチ、コンポーザーのパッチについて説明しますが、品質パッチと/m2-hotfixes ディレクトリの内容については何でしょうか?
高品質のパッチとホットフィックスの適用
vendor/bin/magento-patches apply コマンドを使用して、クラウドインフラストラクチャとオンプレミスの両方のインストールに高品質のパッチをインストールできます。 vendor/bin/magento-patches apply コマンドがcomposer install操作の後に実行されていることを確認する必要があります。
.magento.env.yaml ファイルに品質パッチをリストしてインストールすることもできます。 ここで説明する例では、vendor/bin/magento-patches apply コマンドを使用する必要があります。カスタム Composer コンポーネントパッケージのcomposer.json ファイルに適用するパッチを指定し、composer install操作の後にコマンドを実行するプラグインパッケージを作成できます。
要約すると、この一元化されたパッチ適用の例では、2つのカスタムコンポーザーパッケージを作成する必要があります。
-
コンポーネントパッケージ:
centralized-patcher- インストールする品質パッチと
m2-hotfixesのリストを定義します centralized-patcher-composer-pluginパッケージが必要です。composer install操作の後にvendor/bin/magento-patches applyコマンドを実行します
- インストールする品質パッチと
-
プラグインパッケージ:
centralized-patcher-composer-plugincentralized-patcherパッケージから品質パッチリストを読み取るCentralizedPatcherPHP クラスを定義しますvendor/bin/magento-patches applyコマンドを実行して、composer install操作の後に品質パッチのリストをインストールします
centralized-patcher
Composer コンポーネントパッケージ (centralized-patcher)を作成して、すべてのAdobe Commerce インストールで高品質のパッチと/m2-hotfixesを一元管理できます。
コンポーネントパッケージは次の必要があります。
- デプロイメント時に、
/m2-hotfixesディレクトリの内容をすべてのインストールにコピーします。 - インストールする品質パッチのリストを定義します。
vendor/bin/magento-patchesコマンドを実行して、すべてのインストールに同じ品質パッチのリストをインストールします(centralized-patcher-composer-pluginプラグインパッケージを依存関係として使用)。
centralized-patcher コンポーネントパッケージを作成するには:
-
次の内容の
composer.jsonファイルを作成します。note NOTE 次の例の require属性は、この例の後で作成する必要がある プラグインパッケージ に対するrequire依存関係を示しています。code language-json { "name": "magento-services/centralized-patcher", "version": "0.0.1", "description": "Centralized patcher for patching multiple web stores from a central place", "type": "magento2-component", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { "magento-services/centralized-patcher-composer-plugin": "~0.0.1" }, "require-dev": { "composer/composer": "^2.0" }, "extra": { "map": [ ], } -
パッケージ内に
/m2-hotfixesディレクトリを作成し、composer.jsonファイルのmap属性に追加します。map属性には、このパッケージからパッチを適用するターゲットプロジェクトのルートにコピーするファイルが含まれています。code language-json { ... "extra": { "map": [ [ "/m2-hotfixes", "/m2-hotfixes" ] ], }note NOTE centralized-patcherパッケージは、/m2-hotfixesディレクトリの内容をcomposer installのターゲット プロジェクトのm2-hotfixes ディレクトリにコピーします。 クラウド展開スクリプトはcomposer installの後にm2-hotfixを適用するので、すべてのホットフィックスは展開メカニズムによってインストールされます。 -
quality-patches属性にインストールする品質パッチを定義します。code language-json { ... "extra": { "map": [ [ "/m2-hotfixes", "/m2-hotfixes" ] ], "quality-patches": [ "MDVA-30106", "MDVA-12304" ] }
前述のコードサンプルのquality-patches属性には、例として フルパッチリスト の2つのパッチが含まれています。 これらの品質のパッチは、vendor/bin/magento-patches apply コマンドを使用してcentralized-patcher パッケージを必要とするすべてのプロジェクトにインストールされます。
テストの目的で、サンプル パッチ (/m2-hotfixes/EXAMPLE-PATCH_2.4.6.patch)を作成できます。
m2-hotfixes ディレクトリに配置する必要があります。パッチ ファイルの例(/m2-hotfixes/EXAMPLE-PATCH_2.4.6.patch):
diff --git a/vendor/magento/framework/Mview/View/Subscription.php b/vendor/magento/framework/Mview/View/Subscription.php
index 03a3bf9..681e0b0 100644
--- a/vendor/magento/framework/Mview/View/Subscription.php
+++ b/vendor/magento/framework/Mview/View/Subscription.php
@@ -16,6 +16,7 @@ use Magento\Framework\Mview\ViewInterface;
/**
* Mview subscription.
+ * Test Patch File
*/
class Subscription implements SubscriptionInterface
{
centralized-patcher-composer-plugin
この例では、オンプレミス メソッドを使用して品質のパッチをインストールするため、composer install操作の後にvendor/bin/magento-patches apply コマンドが実行されていることを確認する必要があります。 このプラグインは、vendor/bin/magento-patches apply コマンドを実行するcomposer install操作の後にトリガーされます。
centralized-patcher-compose-plugin コンポーネントパッケージを作成するには:
-
次の内容の
composer.jsonファイルを作成します。code language-json { "name": "magento-services/centralized-patcher-composer-plugin", "version": "0.0.1", "description": "Centralized patcher composer plugin to apply quality patches from the centralized patcher", "type": "composer-plugin", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { "symfony/process": "^4.1 || ^5.1", "magento/magento-cloud-patches": "~1.0.20", "magento/framework": "~103.0.5-p1", "composer-plugin-api": "^2.0" }, "require-dev": { "composer/composer": "^2.0" }, "suggest": { "magento-services/centralized-patcher": "~0.0.1" }, "autoload": { "psr-4": { "MagentoServices\\CentralizedPatcherComposerPlugin\\": "" } }, "extra": { "class": "MagentoServices\\CentralizedPatcherComposerPlugin\\Patcher" } } -
PHP ファイルを作成し、
CentralizedPatcherクラスを定義して、centralized-patcherコンポーネントパッケージから品質パッチリストを読み取り、composer install操作の直後にインストールします。code language-php <?php declare(strict_types=1); namespace MagentoServices\CentralizedPatcherComposerPlugin; use Composer\Composer; use Composer\EventDispatcher\EventSubscriberInterface; use Composer\IO\IOInterface; use Composer\Plugin\PluginInterface; use Composer\Script\ScriptEvents; use Symfony\Component\Process\Exception\ProcessFailedException; use Symfony\Component\Process\Process; class Patcher implements PluginInterface, EventSubscriberInterface { /** * @var Composer $composer */ protected $composer; /** * @var IOInterface $io */ protected $io; /** * @param Composer $composer * @param IOInterface $io * @return void */ public function activate(Composer $composer, IOInterface $io) { $this->composer = $composer; $this->io = $io; } /** * @param Composer $composer * @param IOInterface $io * @return void */ public function deactivate(Composer $composer, IOInterface $io) { // Method must exist } /** * @param Composer $composer * @param IOInterface $io * @return void */ public function uninstall(Composer $composer, IOInterface $io) { // Method must exist } /** * @return string[] */ public static function getSubscribedEvents() { return [ ScriptEvents::POST_UPDATE_CMD => 'installPatches', ScriptEvents::POST_INSTALL_CMD => 'installPatches', ]; } /** * Apply patches from magento-services/centralized-patcher * * @param \Composer\Script\Event $event * @return void */ public function installPatches(\Composer\Script\Event $event) { $patches = []; $this->io->write('Applying centralized quality patches'); $packages = $this->composer->getLocker()->getLockData()['packages']; foreach ($packages as $package) { if ($package['name'] !== 'magento-services/centralized-patcher') { continue; } $patches = $package['extra']['quality-patches'] ?? []; } if (empty($patches)) { $this->io->error("No centralized quality patches to install"); exit(0); } $command = array_merge( ['php','./vendor/bin/magento-patches','apply','--no-interaction'], $patches ); $process = new Process($command); try { $this->io->debug($process->getCommandLine()); $process->mustRun(); $this->io->write( str_replace("\n\n", "\n", trim($process->getErrorOutput() ?: $process->getOutput(), "\n")) ); } catch (ProcessFailedException $e) { $process = $e->getProcess(); $error = sprintf( 'The command "%s" failed. %s', $process->getCommandLine(), trim($process->getErrorOutput() ?: $process->getOutput(), "\n") ); throw new \RuntimeException($error, $process->getExitCode()); } } }
プロジェクト固有のパッチの処理方法
すべてのプロジェクトで必要なパッチの95%のみが適用され、一部のパッチは特定のインスタンスにのみ適用されるシナリオがある場合があります。 パッチを適用する通常の方法は引き続き機能します。 プロジェクト固有のパッチは/m2-hotfixes ディレクトリに保存し、プロジェクトごとに品質のパッチをインストールできます。
このアプローチを使用する場合、はcentralized-patcher コンポーネントパッケージによってプロジェクトにコピーされた/m2-hotfixes ディレクトリのパッチを コミットしません。 /m2-hotfixesを.gitignore ファイルに追加することで、誤ったコミットを防ぐことができます。 .gitignore ファイルを更新した後、git add –force コマンドを使用して、プロジェクト固有の/m2-hotfixesを追加する必要があることを忘れないでください。
Adobe Commerceの様々なバージョンを実行
centralized-patcher コンポーネントパッケージで適切な依存関係を設定していることを確認してください。 例えば、パッケージの特定のバージョンに対してAdobe Commerce 2.4.5-p2が必要になる場合があり、Adobe Commerce 2.4.5-p2と互換性のあるパッチのみが提供されます。 このパッケージの別のバージョンが、Adobe Commerce 2.4.4と互換性がある場合があります。
結果の把握
Adobe Commerce on cloud infrastructureと同様に、この記事では、デプロイメントプロセスでcomposer updateまたはgit pullではなくcomposer install コマンドを使用して新しいコードをサーバーにデプロイすることを前提としています。 一元化されたパッチのインストールのフローは次のようになります。
-
Composer インストール
- -p1または – p2のセキュリティおよび機能パッチを含むAdobe Commerceをインストールします
- 一元化された
/m2-hotfixesとサポートパッチをプロジェクト固有の/m2-hotfixesとサポートパッチと組み合わせる cweagans/composer-patchesComposer パッケージと共にインストールされているすべてのパッチを適用します
-
composer install以降- Composer プラグインは、一元化された品質パッチをインストールします
-
展開
- 必要なパッチとプロジェクト固有の品質パッチは、
.magento.env.yamlファイルに基づいてインストールされます(Adobe Commerce クラウドインフラストラクチャプロジェクトのみ)。 /m2-hotfixesディレクトリのカスタムパッチとサポートパッチは、パッチ名でアルファベット順にインストールされます。
- 必要なパッチとプロジェクト固有の品質パッチは、
これにより、すべてのインストールのすべてのパッチを一元管理でき、Adobe Commerce ストアのセキュリティと安定性をより確実に保証できます。 パッチのステータスを確認するには、次の方法を使用します。