段階的な環境でモジュールを正しく削除する方法は?


17

一部のモジュールには、デルーチンルーチンがあります。通常、そのモジュールのデータベーステーブル、変数テーブルからの変数、およびそのモジュールによって導入されたロケールを削除します。これらのルーチンは.install、そのモジュールに存在します。

したがって、それらのモジュールが存在しないと実行できません。これが現在の手順です。私の質問は、これをより簡単に、より効果的に行うことができますか?foo_barモジュールを削除するとします。

  1. RCSで、次の新しいリリースを準備します。
    • foo_barを使用または構築するすべてのcssおよびテーマオーバーライドは削除されます。
    • foo_barに依存するモジュールのすべてのcssおよびテーマオーバーライドは削除されます。
  2. そのリリースを受け入れてください。運用データベースの最新のコピーを使用して、(admin / modulesからの)分散をテストします。
  3. すべてうまくいけば、新しいコードベースを本番環境にデプロイし、foo_barとその依存関係をそこに配置します。これにより、さまざまなモジュールでアンインストールが呼び出され、データベースがクリーンアップされます。
  4. RCS(git)で、コードが実際に削除される新しいリリースを準備します。
  5. 誤ってこれに依存していないかどうかをテストするために、それを受け入れます(一部のいモジュールまたはテーマ関数には、他のモジュールから直接ファイルが含まれます。特にCSS、JS、または画像ファイル)。
  6. 受け入れられたら、新しいリリースを実稼働環境にデプロイします。本番環境には、クリーンなデータベースとクリーンなコードベースがあります。

解決方法がわかりませんが、これには常に2つのリリースが必要です。Drupalでは、リリースにはサイトがオフラインである必要があるため、これは1つのモジュールを削除するために2回のダウンタイムを意味します。また、2つのリリース手順が必要です。これは、プロのホスティング環境では、非常に高価で、時間がかかり、イライラする可能性があります。

最初の反復でコードベースからモジュールを削除すると、アンインストールフックを実行できず、データベースに多くのリントが保持されます。いくつかのテーブルだけでなく、主に変数とロケール。モジュールをコードベースから削除しないと、コードベースが古くなった未使用のコードで成長することになります。これによりパフォーマンスのオーバーヘッドは発生しませんが、コードの維持はますます難しくなります。

これにどう対処しますか?

[編集:展開が困難な手順であるという注意を追加、多くの場合]


2
最初にステージングサーバーで手順1〜6を実行する場合、ライブサイトをHEAD ^に更新し、アンインストールしてからHEADに更新することはできませんか?
アンディ

すべてのプロジェクトがgit展開された場合、はい。ただし、tarballをメールで送信する必要のある人もいれば、ftpなどを使用する(だけの)ものもあります。しかし、git、およびいくつかのgit-hook-scriptsを調べることは確かに非常に興味深いアイデアです。
バーク

なぜサイトをダウンさせる必要があるのですか?
レサリオン

@Letharion:1)サイトを停止すると、データベースの変更プロセス中にデータベースへの不要な書き込みが禁止されます。Drupalはトランザクションを使用しません。2)特定のデータベースの状態(特定のcckフィールドを必要とするテーマなど)に依存する新しいコードをデプロイすると、コードの展開とデータベースの更新の間にサイトが破損します。
バーク

回答:


7

データベースとコードの同期を維持することに非常に注意してください。質問で述べたように、アンインストールするモジュールは、アンインストールフックがライブデータベースで実行されるまで、コードベースにとどまる必要があります。これは、Grutプルワークフローだけでは解決できないというDrupalの制限です。

プロセスを調整する代わりに、更新の処理に必要なダウンタイムを削減する方法を探すことをお勧めします。この問題を解決するには、ying / yangマルチサイトステージング環境をセットアップすることをお勧めします。nb上記のリンクに含まれるスクリプトを使用していません。展開中にライブサイトとステージサイトを交換できるという同じ考えに従って、異なる設定を行うこともできます。

質問で説明したのと同じ手順に引き続き、次の調整を加えます。

a。通常どおり、開発者からステージ(ヤン)に同期します。削除するモジュールをアンインストールしてから、コードを削除するなどの方法でテストします。Gitワークフローのメモ:コードのさまざまな状態のタグを作成するか、ハッシュIDをメモします。オーバーライド&c。必要に応じて削除など。おそらく、2つの参照のみが必要です。

b。テストが完了して受け入れられたら、ステージ(yang)のコードをライブ(ying)の状態に復元します。

c。システム上のコンテンツを変更するユーザーの機能を無効にして、更新用のライブ(ying)サイトを準備します。通常、権限テーブルのsql更新がここで行われます。この時点で、ユーザーはライブサイトのコンテンツを引き続き読むことができますが、コンテンツを更新しようとすると、アクセス許可拒否エラーが表示されます。(クールな場合は、おそらくアクセス許可拒否ハンドラーを変更して、関数が一時的に利用できないことを示す適切な通知を出力できます)。

d。次に、更新から権限テーブルを除外して、ライブ(ying)データベースをステージ(yang)データベースにプッシュします。

e。手順aを繰り返します。再び。ハッシュタグが手元にあれば、削除するモジュールが存在する状態に簡単に復元し、データベースでアンインストールフックを実行し、ステップ1のアイテムがマージされたコードの状態に戻る必要があります。戻って

f。これで、yingとyangを入れ替える準備ができました。これを行うには、Apache構成ディレクティブを調整します。を実行すると/etc/init.d/apache restart、一部の接続がドロップされる場合がありますが、/etc/init.d/apache reloadクリーンなスワップが可能になることに注意してください。

g。ライブは現在「陽」です。ここでは権限テーブルは変更されていないため、ユーザーはコンテンツを作成できます。手順を自動化する場合e。f。、利用できない時間は非常に短くなければなりません。

h。ライブ(yang)をコードとデータベースの両方のステージ(ying)にプッシュするか、必要に応じてdevからプッシュします。これで、次の反復に備えてクリーンな環境が整いました。


陰陽はステップcで恐ろしく失敗します。edit-driven-anon-access-onlyなどの非常に特定のサイトのみが機能します。これは主に、コメント、ノードなどを無効にする必要があるだけでなく、セッションテーブル、ウォッチドッグ、カウンターなどが更新されて書き込まれるためです。ダウンタイムは不幸なようですが、避けられない副作用です。確かに、特定のサイトでは、ying-yangは展開時に使用する非常に興味深い概念です。
-berkes

もちろん、あなたは正しいです。ただし、最後の手順をスクリプト化すると、ダウンタイムや情報の損失の可能性は低くなります。セッションテーブルからエントリを失った場合、ユーザーは再度ログインする必要があります。カウンターが少しずれている場合があります。ウォッチドッグで1つまたは2つの通知を見逃すことがあります。「このサイトはメンテナンスのためダウンしている」という短期間よりも悪化している場合は、必ず、よりシンプルなソリューションを使用してください。本当にやりたい場合は、スワップ後のカウンターとウォッチドッグメッセージの回復を試みることができます。info + uptimeが非常に価値がない限り、これは価値があるよりも複雑かもしれません。
greg_1_anderson

mysqlバイナリログを使用して、移行サイトでトランザクションを追跡することを検討できます。dev.mysql.com/doc/refman/5.0/en/point-in-time-recovery.htmlを参照してください。私は物事を一緒にマージすることに消極的ですが、余分なカウンタ/ウォッチドッグメッセージを帯域外で追跡することができます。セッションテーブルを処理する最も簡単な方法は、移行中もログインを無効にすることです。
greg_1_anderson

あなたのコメントは他の可能性のある解決策に私を連れて行きました:モジュールのすべてのhook_uninstallを特別な目的のモジュールのhook_update_n()sとして集約する:uninstall.module。そうすれば、最初のイテレーションでコードベースを削除できます/そして/実際のリリースではるかに高速なデインストールを取得できます。この情報をこすり落とすスクリプトである可能性があります。
バーク

1
もう少し役立ちます。削除するモジュールへの参照がにラップされるように、カスタムphpコードをすべて変更しますif (module_exists('removeme')) { ... }。そのコードをデプロイします。モジュールを削除してもカスタムコードが破損しないことをテストして確認すると、展開が簡単になります。ライブではないサイトで無効化手順を実行することをお勧めしますが、これによりウィンドウがわずかに狭くなる可能性があります。カスタムアップデートフックによって、ライブモジュールの無効化がより安全になるとは思わない。
greg_1_anderson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.