Як правильно видалити модуль в поетапному середовищі?


17

Деякі модулі мають процедуру деінсталяції. З яких типово видаляються бази даних для цього модуля, змінні з таблиці змінних та локалі, введені цим модулем. Ці підпрограми живуть у .installцьому модулі.

Тому їх неможливо виконати без наявності цього модуля. Тож ось наші нинішні кроки. Моє запитання: чи можна це зробити простіше та ефективніше? Скажіть, я видаляю модуль foo_bar.

  1. У RCS підготуйте новий випуск, де:
    • Видаляються всі перестановки css та теми, які використовуються або створюються поверх foo_bar.
    • Видаляються всі css та теми для модулів залежно від foo_bar.
  2. Натисніть це звільнення до прийняття. Перевірте деінсталяцію (від адміністратора / модулів) за допомогою останньої копії виробничої бази.
  3. Якщо все піде добре, розгорніть нову базу коду для виробництва, а потім встановіть foo_bar та його залежності там. Це призведе до видалення в різних модулях, очищення бази даних.
  4. У RCS (git) підготуйте новий випуск, де код фактично видалений.
  5. Розгорніть це для прийняття, коли ми перевіряємо, чи нічого випадкового від цього не залежало (деякі потворні модулі або функції тем включають файли безпосередньо з інших модулів. Найбільш це CSS, JS або файли зображень).
  6. Якщо це прийнято, розгорніть новий випуск у виробництво. Зараз у виробництві є чиста база даних та чиста база даних .

Проблема, яку я не можу зрозуміти, як вирішити, полягає в тому, що для цього завжди потрібні два випуски. Оскільки в Drupal для випуску потрібний сайт в автономному режимі, це означає два рази простою, щоб видалити один модуль. Також потрібні дві процедури випуску, які в професійних хостингових середовищах можуть бути дуже дорогими, трудомісткими або розчарувальними.

Якщо ми видалимо модуль із бази даних коду під час першої ітерації, ми не можемо запустити гачки для видалення, зберігаючи багато базування в базі даних; не лише кілька таблиць, а в основному змінні та локалі. Якщо ми не видалимо модуль з кодової бази, це означає, що база даних буде рости зі старим, невикористаним кодом; це не дає високих показників продуктивності, але робить підтримку коду все складніше і складніше.

Як ти з цим справляється?

[редагувати: додана примітка про те, що розгортання є важкою процедурою, часто]


2
Якщо ви спершу зробите кроки 1 - 6 на сервері встановлення, чи не змогли ви потім оновити веб-сайт в реальному часі до HEAD ^, виконайте видалення, а потім оновіть до HEAD (все в один засідання)?
Енді

Якщо всі мої проекти були розгорнуті, тоді так. Але деяким потрібні тарболи, що надсилаються поштою, а інші використовують (лише!) Ftp тощо. Але вивчити git та деякі сценарії git-hook - це, звичайно, дуже цікава ідея.
berkes

Чому саме потрібно знімати сайт?
Летаріон

@Letharion: 1) Зняття сайту забороняє небажані записи у вашу базу даних під час зміни цієї бази; Drupal не використовує транзакції. 2) Розгортання нового коду, який залежить від певного стану бази даних (тема, яка вимагає певного поля cck, наприклад), порушить ваш сайт за час між розгортанням коду та оновленням бази даних.
berkes

Відповіді:


7

Будьте дуже уважні щодо синхронізації вашої бази даних та коду; як ви згадуєте у своєму запитанні, модулі, які потрібно видалити, повинні залишатися в кодовій базі, поки їхні гачки для видалення не будуть виконані на базі даних в реальному часі. Це обмеження Drupal, що потік робочих процесів самостійно вирішити не збирається.

Я рекомендую замість того, щоб намагатися налагодити процес, замість того, щоб шукати шляхи скорочення часу простою, необхідного для обробки ваших оновлень. Я б рекомендував створити багатостороннє інсценізаційне середовище інь / ян для вирішення цієї проблеми. nb Я не використовував скрипти, що містяться в попередньому посиланні; ви можете налаштувати речі по-іншому, дотримуючись тієї самої ідеї, що під час розгортання можна поміняти місцями живі та сценічні сайти.

Продовжуйте виконувати ту саму процедуру, яку ви вказали у своєму запитанні, з наступними коригуваннями:

а. Синхронізуйте від розробника до сцени (ян) як завжди. Тестуйте, видаляючи модулі, які потрібно видалити, після чого видаляйте код тощо. Примітки робочого процесу Git: створіть тег або відзначте хеш різних станів вашого коду: всі модулі на місці до видалення, видалені модулі коду, ваш перекриття & c. вилучається тощо за потребою. Можливо, потрібні лише дві довідки.

б. Коли тестування завершено і прийнято, відновіть код на сцені (ян) до стану живого (ін).

c. Підготуйте веб-сайт в реальному часі до оновлення, відключивши можливість будь-якого користувача змінювати вміст у системі. Тут зазвичай робиться оновлення sql до таблиці дозволів. На даний момент користувачі все ще зможуть читати вміст на веб-сайті, але отримають дозволу, у якому відмовлено у помилці, якщо вони спробують оновити вміст. (Якщо ви круті, можливо, ви можете змінити дозвол, який забороняв дозволу, щоб надрукувати відповідне повідомлення про те, що функція тимчасово недоступна).

г. Тепер відсуньте базу даних live (ying) назад до бази даних (yang), виключаючи таблицю дозволів з оновлення.

е. Повторіть крок a. знову. Якщо у вас є хеш-теги, вам слід легко відновити стан, у якому існують модулі, які потрібно видалити, запустити гаки для видалення в базі даних, а потім повернутися до стану коду, де об’єднуються ваші елементи з кроку 1. Повернутися в.

f. Тепер ви готові змінити інь і янь. Зробіть це, скоригувавши свої директиви щодо налаштування Apache. Зверніть увагу, що якщо ви зробите це /etc/init.d/apache restart, деякі з’єднання можуть бути перервані, але /etc/init.d/apache reloadвони дозволять здійснити чисту заміну

г. Live - це "ян"; таблиця дозволів тут немодифікована, щоб користувачі могли створювати вміст. Якщо ви автоматизуєте дії e. і е., час недоступного повинен бути дуже низьким.

год. Натисніть живий (янг) назад до сцени (ін), як код, так і базу даних - або натисніть від розробника, якщо потрібно. Тепер у вас є чисте середовище, готове до наступної ітерації.


Ін-ян жахливо провалюється на кроці с. Працюватимуть лише дуже конкретні сайти, такі як редакція, керована лише редакцією. Це здебільшого тому, що не тільки коментарі, вузли та подібні повинні бути відключені, але й сесія-таблиця, сторожова собака, лічильники тощо будуть оновлені та записані до них. Простой час здається невдалим, але нездійсненним побічним ефектом. Хоча, дійсно, для деяких сайтів ін-ян - це дуже цікава концепція, яку слід використовувати при розгортанні.
berkes

Звичайно, ти маєш рацію; однак, якщо ви сценарій останнього кроку, вікно простою або втрачена інформація буде низькою. Якщо ви втратите запис із таблиці сеансів, користувачеві доведеться знову увійти. Лічильник може трохи вимкнутись. Ви можете пропустити сповіщення або два в сторожовій службі. Якщо це гірше, ніж за короткий період "цей веб-сайт не працює для обслуговування", то будь-яким чином використовуйте більш просте рішення. Якщо ви дійсно цього хотіли, ви можете спробувати відновити лічильник та повідомлення сторожової собаки після свопу. Це може бути складніше, ніж це коштувало, якщо тільки інформація + тривалість тривалості ДУЖЕ цінна.
greg_1_anderson

Ви можете розглянути можливість відстеження транзакцій на перехідному сайті за допомогою двійкового журналу mysql. Див. Dev.mysql.com/doc/refman/5.0/en/point-in-time-recovery.html . Я б не бажав просто об'єднувати речі разом, але ви могли б відслідковувати зайві повідомлення про зустрічні / сторожові собаки поза межами діапазону. Найпростішим способом роботи з таблицею сеансу було б також відключення входу під час переходу.
greg_1_anderson

Ваш коментар привів мене до можливого іншого рішення: об'єднайте всі гакові_установки для модуля як куки_представлення_n () s спеціального призначеного модуля: uninstall.module. Таким чином я можу видалити кодову базу під час першої ітерації / та / отримати набагато швидше децентралізацію у фактичному випуску. Може бути сценарій "Друш", який викреслює цю інформацію.
berkes

1
Ще одна річ, яка трохи допоможе. Змініть весь власний php-код таким чином, щоб будь-яке посилання на модуль, який потрібно видалити, було вкладено в нього if (module_exists('removeme')) { ... }. Розгорніть цей код. Якщо ви перевірите і підтвердите, що видалення модуля більше не порушує ваш спеціальний код, це спростить ваше розгортання. Ще рекомендується робити крок відключення на веб-сайті, який не використовується, але, можливо, це трохи звузить ваше вікно. Я не думаю, що ваш користувальницький гачок оновлення зробить безпечнішим відключення живого модуля.
greg_1_anderson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.