Jak poprawnie usunąć moduł w środowisku etapowym?

17

Niektóre moduły mają procedury deinstalacji. Które zazwyczaj usuwają tabele bazy danych dla tego modułu, zmienne z tabeli zmiennych i ustawienia narodowe wprowadzone przez ten moduł. Te procedury działają w .installtym module.

Dlatego nie można ich uruchomić bez obecności tego modułu. Oto nasze aktualne kroki. Moje pytanie brzmi: czy można to zrobić prościej i skuteczniej? Powiedzmy, że usuwam moduł foo_bar.

  1. W RCS przygotuj nową wersję, w której:
    • Wszystkie css i przesłonięcia motywów, które używają lub budują na foo_bar są usuwane.
    • Wszystkie css i przesłonięcia motywów dla modułów w zależności od foo_bar są usuwane.
  2. Przekaż to wydanie do akceptacji. Przetestuj deïnstallation (od administratora / modułów) przy użyciu najnowszej kopii produkcyjnej bazy danych.
  3. Jeśli wszystko pójdzie dobrze, wdróż nową bazę kodu w środowisku produkcyjnym i usuń tam foo_bar i jego zależności. Spowoduje to wywołanie dezinstalacji w różnych modułach, czyszcząc bazę danych.
  4. W RCS (git) przygotuj nową wersję, w której kod zostanie faktycznie usunięty.
  5. Zastosuj to do akceptacji, gdy testujemy, czy nic przypadkowo nie zależało od tego (niektóre brzydkie moduły lub funkcje motywu zawierają pliki bezpośrednio z innych modułów. W szczególności CSS, JS lub pliki obrazów).
  6. Jeśli zostanie zaakceptowany, wdróż nową wersję do produkcji. produkcja ma teraz czystą bazę danych i czystą bazę kodów .

Problem, którego nie widzę jak rozwiązać, polega na tym, że zawsze wymaga to dwóch wydań. Ponieważ w Drupal wydanie wymaga, aby strona była offline, oznacza to dwa razy przestoje w celu usunięcia jednego modułu. Wymaga także dwóch procedur wydania, które w profesjonalnych środowiskach hostingowych mogą być bardzo drogie, czasochłonne lub frustrujące.

Jeśli usuniemy moduł z bazy kodu w pierwszej iteracji, nie będziemy mogli uruchomić haków deinstalacyjnych, utrzymując wiele kłopotów w bazie danych; nie tylko kilka tabel, ale głównie zmienne i ustawienia regionalne. Jeśli nie usuniemy modułu z bazy kodu, oznacza to, że baza kodu powiększy się o przestarzały, nieużywany kod; nie powoduje to narzutu wydajności, ale utrudnia utrzymanie kodu.

Jak sobie z tym radzisz?

[edytuj: często dodawano uwagę, że wdrożenie jest trudną procedurą]

berkes
źródło
2
Jeśli najpierw wykonasz kroki 1–6 na serwerze pomostowym, czy nie możesz zaktualizować witryny działającej w trybie HEAD ^, odinstalować, a następnie zaktualizować w wersji HEAD (wszystko za jednym razem)?
Andy
Jeśli wszystkie moje projekty zostały wdrożone git, to tak. Ale niektórzy potrzebują tarballi do rozsyłania, podczas gdy inni używają (tylko!) Ftp i tak dalej. Ale patrząc na git i niektóre skrypty git-hook są z pewnością bardzo interesującym pomysłem.
berkes
Dlaczego dokładnie trzeba usunąć stronę?
Letharion
@Letharion: 1) Usunięcie strony zabrania niechcianych zapisów do twojej bazy danych podczas procesu zmiany tej bazy danych; Drupal nie korzysta z Transakcji. 2) Wdrożenie nowego kodu, który zależy od określonego stanu bazy danych (motyw, który wymaga określonego pola cck, np.) Spowoduje uszkodzenie witryny w czasie między uruchomieniem kodu a aktualizacją bazy danych.
berkes

Odpowiedzi:

7

Zachowaj ostrożność przy synchronizowaniu bazy danych i kodu; jak wspomniałeś w swoim pytaniu, moduły do ​​odinstalowania muszą pozostać w bazie kodu, dopóki ich haki dezinstalacyjne nie zostaną uruchomione w bazie danych na żywo. Jest to ograniczenie Drupala, którego sam przepływ pracy ściągania gitów nie rozwiąże.

Zalecam, aby zamiast próbować dostosować proces, zamiast szukać sposobów na ograniczenie przestojów wymaganych do przetworzenia aktualizacji. Poleciłbym utworzenie wieloetapowego środowiska testowego ying / yang, aby rozwiązać ten problem. nb Nie korzystałem ze skryptów zawartych w poprzednim linku; Może chcesz ustawić rzeczy się inaczej, po tej samej idei, że można zamiana swoje sceniczne na żywo i miejsca podczas instalacji.

Postępuj zgodnie z procedurą opisaną w pytaniu, wprowadzając następujące zmiany:

za. Synchronizuj z programisty na scenę (yang) jak zwykle. Przetestuj, wykonując deinstalację modułów, które chcesz usunąć, a następnie usuń kod itp. Uwagi do przepływu pracy Git: utwórz znacznik lub zanotuj hashid różnych stanów kodu: wszystkie moduły na miejscu przed deinstalacją, moduły kodu usunięte, twoje zastępuje & c. usunięte itp. w razie potrzeby. Być może potrzebne są tylko dwa odniesienia.

b. Po zakończeniu testów i zaakceptowaniu przywróć kod na scenie (yang) do stanu na żywo (ying).

do. Przygotuj witrynę aktywną (ying) do aktualizacji, wyłączając możliwość zmiany treści w systemie przez dowolnego użytkownika. Zazwyczaj aktualizacja sql do tabeli uprawnień będzie tutaj. W tym momencie użytkownicy nadal będą mogli czytać treści w aktywnej witrynie, ale otrzymają błąd odmowy uprawnień, jeśli spróbują zaktualizować zawartość. (Jeśli jesteś fajny, być może możesz zmienić odmowę obsługi, aby wydrukować odpowiednie powiadomienie, że funkcja jest chwilowo niedostępna).

re. Teraz przenieś bazę danych live (ying) z powrotem do bazy danych stage (yang), wyłączając tabelę uprawnień z aktualizacji.

mi. Powtórz krok a. jeszcze raz. Jeśli masz pod ręką hashtagi, powinno być łatwo przywrócić do stanu, w którym istnieją moduły do ​​usunięcia, uruchom haki dezinstalacyjne w bazie danych, a następnie przejdź z powrotem do stanu kodu, w którym elementy z kroku 1 zostały scalone z powrotem w.

fa. Jesteś teraz gotowy, aby zamienić ying i yang. Zrób to, dostosowując dyrektywy konfiguracyjne Apache. Pamiętaj, że jeśli wykonasz/etc/init.d/apache restart , niektóre połączenia mogą zostać porzucone, ale /etc/init.d/apache reloadpozwolą na czystą zamianę.

sol. Życie to teraz „yang”; tabela uprawnień jest tutaj niezmodyfikowana, więc użytkownicy mogą tworzyć treści. Jeśli zautomatyzujesz kroki e. i f. niedostępny czas powinien być bardzo krótki.

h. Wciśnij na żywo (yang) z powrotem na scenę (ying), zarówno kod, jak i bazę danych - lub w razie potrzeby wypchnij z dev. Teraz masz czyste środowisko gotowe do następnej iteracji.

greg_1_anderson
źródło
Ying-Yang strasznie zawodzi w kroku c. Działa tylko bardzo specyficzne witryny, takie jak dostęp tylko dla redakcji z dostępem anonowym. Jest tak głównie dlatego, że nie tylko komentarze, węzły i takie muszą być wyłączone, ale tabela sesji, watchdog, liczniki itp. Zostaną zaktualizowane i zapisane w. Przestój wydaje się niefortunnym, ale nieuniknionym efektem ubocznym. Chociaż w rzeczywistości dla niektórych witryn ying-yang jest bardzo interesującą koncepcją do zastosowania podczas wdrażania.
berkes
Oczywiście masz rację; jeśli jednak skryptujesz ostatni krok, okno przestoju lub utraconych informacji będzie niskie. Jeśli utracisz wpis z tabeli sesji, użytkownik będzie musiał zalogować się ponownie. Licznik może być trochę wyłączony. Możesz przegapić jedno lub dwa powiadomienia w ramach nadzoru. Jeśli jest to gorsze niż krótki okres „ta strona nie działa z powodu konserwacji”, to zdecydowanie skorzystaj z prostszego rozwiązania. Jeśli naprawdę chcesz, możesz spróbować odzyskać licznik i stróżować wiadomości po zamianie. Może to być bardziej skomplikowane niż było warte, chyba że informacje + czas sprawności BARDZO cenne.
greg_1_anderson
Możesz rozważyć śledzenie transakcji w witrynie przejścia za pomocą dziennika binarnego mysql. Zobacz dev.mysql.com/doc/refman/5.0/en/point-in-time-recovery.html . Byłbym niechętny, aby po prostu scalić wszystko razem, ale możesz śledzić dodatkowe wiadomości licznika / watchdoga poza pasmem. Najłatwiejszym sposobem radzenia sobie z tabelą sesji byłoby również wyłączenie logowania podczas przejścia.
greg_1_anderson
Twój komentarz przywiódł mnie do innego możliwego rozwiązania: zsumuj wszystkie hook_uninstall dla modułu jako hook_update_n () specjalnego modułu specjalnego: uninstall.module. W ten sposób mogę usunąć bazę kodową podczas pierwszej iteracji / i / uzyskać znacznie szybszą deinstalację w aktualnej wersji. Może to być skrypt drush, który usuwa te informacje.
berkes
1
Jeszcze jedna rzecz, która trochę pomoże. Zmień cały swój niestandardowy kod php, aby zawrzeć w nim wszelkie odniesienia do modułu, który ma zostać usunięty if (module_exists('removeme')) { ... }. Wdróż ten kod. Jeśli przetestujesz i potwierdzisz, że usunięcie modułu nie psuje już kodu niestandardowego, uprości to wdrożenie. Nadal zaleca się wykonanie kroku wyłączania w witrynie, która nie jest aktywna, ale być może nieco zawęzi okno. Nie sądzę, że niestandardowy hak aktualizacji sprawi, że bezpieczniej będzie wyłączyć moduł na żywo.
greg_1_anderson