Come rimuovere correttamente un modulo in un ambiente a fasi?


17

Alcuni moduli hanno routine di deinstallazione. Che di solito rimuovono i database disponibili per quel modulo, le variabili dalla tabella delle variabili e le localizzazioni introdotte da quel modulo. Queste routine vivono nel .installdi quel modulo.

Pertanto, non possono essere eseguiti senza che quel modulo sia presente. Quindi ecco i nostri passi attuali. La mia domanda è: può essere fatto in modo più semplice ed efficace? Di 'che rimuovo il modulo foo_bar.

  1. In RCS, preparare una nuova versione, in cui:
    • Tutti i CSS e le sostituzioni di temi che usano o si basano su of foo_bar vengono rimossi.
    • Tutti i CSS e le sostituzioni di temi per i moduli a seconda di foo_bar vengono rimossi.
  2. Spingi quel rilascio all'accettazione. Testare la disattivazione (da admin / moduli) con una copia molto recente del database di produzione.
  3. Se tutto va bene, distribuisci il nuovo codebase alla produzione e deinstall foo_bar e le sue dipendenze lì. Questo invocherà la disinstallazione nei vari moduli, ripulendo il database.
  4. In RCS (git), preparare una nuova versione in cui il codice viene effettivamente rimosso.
  5. Distribuiscilo all'accettazione laddove testiamo se nulla dipendesse accidentalmente da questo (alcuni brutti moduli o funzioni tematiche includono file direttamente da altri moduli. In particolare CSS, JS o file immagine).
  6. Se accettato, distribuire la nuova versione alla produzione. la produzione ora ha un database pulito e una base di codice pulita .

Il problema che non riesco a vedere come risolvere è che ciò richiede sempre due versioni. Poiché in Drupal una versione richiede che il sito sia offline, ciò significa due volte di inattività solo per rimuovere un modulo. Richiede anche due procedure di rilascio che, in ambienti di hosting professionale, possono essere molto costosi, che richiedono tempo o frustranti.

Se rimuoviamo il modulo da codebase nella prima iterazione, non possiamo eseguire i hook di disinstallazione, mantenendo molti lanugine nel database; non solo alcune tabelle, ma principalmente variabili e impostazioni locali. Se non rimuoviamo il modulo da codebase, ciò significa che codebase crescerà con codice non aggiornato e non utilizzato; ciò non comporta alcun sovraccarico di prestazioni, ma rende il mantenimento del codice sempre più difficile.

come lo gestisci?

[modifica: aggiunta nota sul fatto che la distribuzione è una procedura difficile, spesso]


2
Se esegui prima i passaggi da 1 a 6 su un server di gestione temporanea, non puoi quindi aggiornare il sito live a HEAD ^, eseguire le disinstallazioni, quindi aggiornare a HEAD (tutto in una volta)?
Andy,

Se tutti i miei progetti sono stati distribuiti in modo git, allora sì. Ma alcuni hanno bisogno di tarball per essere spediti in giro, mentre altri usano (solo!) Ftp e così via. Ma esaminare git e alcuni script git-hook è sicuramente un'idea molto interessante.
Berkes,

Perché è esattamente necessario smontare il sito?
Letharion,

@Letharion: 1) La rimozione del sito proibisce la scrittura indesiderata nel database durante il processo di modifica di tale database; Drupal non utilizza Transazioni. 2) La distribuzione di un nuovo codice che dipende da un determinato stato del database (un tema che richiede un determinato campo di memoria, ad es.) Interromperà il tuo sito nel tempo tra il lancio del codice e l'aggiornamento del database.
Berkes,

Risposte:


7

Prestare molta attenzione a mantenere sincronizzati il ​​database e il codice; come menzionato nella domanda, i moduli da disinstallare devono rimanere nella base di codice fino a quando i loro hook di disinstallazione non vengono eseguiti sul database live. Questa è una limitazione di Drupal che un flusso di lavoro git pull da solo non risolverà.

Raccomanderei che invece di tentare di adattare il processo, cerchi invece modi per ridurre i tempi di inattività richiesti per elaborare gli aggiornamenti. Consiglierei di impostare un ambiente di stadiazione multisito ying / yang per risolvere questo problema. nb non ho usato gli script contenuti nel link precedente; potresti voler impostare le cose in modo diverso, seguendo la stessa idea che puoi scambiare i tuoi siti live e sul palco durante la distribuzione.

Continuare a seguire la stessa procedura descritta nella domanda con le seguenti modifiche:

un. Sincronizzazione da dev a stage (yang) come al solito. Prova eseguendo una disinstallazione dei moduli da rimuovere seguita dalla rimozione del codice, ecc. Note sul flusso di lavoro Git: crea un tag o nota l'hashid dei diversi stati del tuo codice: tutti i moduli in atto prima della disinstallazione, moduli di codice rimossi, il tuo sostituisce & c. rimosso, ecc. secondo necessità. Forse sono necessari solo due riferimenti.

b. Quando il test è completo e accettato, ripristina il codice sul palco (yang) allo stato live (ying).

c. Preparare il sito live (ying) per l'aggiornamento disabilitando la possibilità di qualsiasi utente di modificare il contenuto del sistema. Un aggiornamento sql alla tabella dei permessi di solito farà qui. A questo punto, gli utenti saranno ancora in grado di leggere il contenuto sul sito live, ma riceveranno un errore di autorizzazione negata se provano ad aggiornare il contenuto. (Se sei forte, forse potresti modificare il permesso negato al gestore per stampare un avviso appropriato che la funzione è temporaneamente non disponibile).

d. Ora riporta il database live (ying) al database stage (yang), escludendo la tabella delle autorizzazioni dall'aggiornamento.

e. Ripetere il passaggio a. ancora. Se hai gli hashtag a portata di mano, dovrebbe essere facile ripristinare lo stato in cui esistono i moduli da rimuovere, eseguire gli hook di disinstallazione sul database e quindi tornare allo stato del codice in cui vengono uniti i tuoi elementi dal passaggio 1 di nuovo dentro.

f. Ora sei pronto per scambiare ying e yang. Fallo modificando le direttive di configurazione di Apache. Si noti che se si esegue una /etc/init.d/apache restart, alcune connessioni potrebbero essere eliminate, ma /etc/init.d/apache reloadconsentirà uno scambio pulito.

g. Live è ora "yang"; la tabella delle autorizzazioni non è modificata qui, quindi gli utenti possono creare contenuti. Se automatizzi i passaggi e. e f., il tempo non disponibile dovrebbe essere molto basso.

h. Riporta live (yang) allo stage (ying), sia codice che database - oppure invia da dev, se necessario. Ora hai un ambiente pulito pronto per la tua prossima iterazione.


Ying-yang fallisce orribilmente sul passaggio c. Funzioneranno solo siti molto specifici, come ad esempio un accesso diretto agli editoriali. Ciò è dovuto principalmente al fatto che non solo commenti, nodi e simili devono essere disabilitati, ma tabella delle sessioni, watchdog, contatori, ecc. Verranno aggiornati e scritti. I tempi morti sembrano un effetto collaterale sfortunato, ma inevitabile. Sebbene, in effetti, per alcuni siti lo ying-yang sia un concetto molto interessante da utilizzare durante la distribuzione.
Berkes,

Certo che hai ragione; tuttavia, se si esegue lo script del passaggio finale, la finestra dei tempi di inattività o delle informazioni perse sarà bassa. Se si perde una voce dalla tabella delle sessioni, l'utente dovrà accedere nuovamente. Un contatore potrebbe essere spento di un po '. Potresti perdere una notifica o due nel watchdog. Se questo è peggio di un breve periodo di "questo sito è inattivo per manutenzione", allora usa la soluzione più semplice. Se lo desideri davvero , potresti provare a recuperare il contatore e i messaggi del watchdog dopo lo scambio. Questo potrebbe essere più complicato di quanto valesse, a meno che info + uptime MOLTO prezioso.
greg_1_anderson,

Si consiglia di tenere traccia delle transazioni sul sito di transizione utilizzando il registro binario mysql. Vedi dev.mysql.com/doc/refman/5.0/en/point-in-time-recovery.html . Personalmente sarei riluttante a unire le cose, ma potresti tenere traccia dei messaggi di contatore / watchdog extra fuori banda. Il modo più semplice per gestire la tabella delle sessioni sarebbe disabilitare anche gli accessi durante la transizione.
greg_1_anderson,

Il tuo commento mi ha portato a un'altra possibile soluzione: aggregare tutte le hook_uninstall per un modulo come hook_update_n () s di un modulo appositamente progettato: uninstall.module. In questo modo posso rimuovere la base di codice nella prima iterazione / e / ottenere una deinstallazione molto più veloce nella versione attuale. Potrebbe essere un drush-script che raschia queste informazioni.
Berkes,

1
Un'altra cosa che aiuterà un po '. Cambia tutto il tuo codice php personalizzato in modo tale da racchiudere qualsiasi riferimento al modulo da rimuovere if (module_exists('removeme')) { ... }. Distribuisci quel codice. Se si verifica e si conferma che la rimozione del modulo non interrompe più il codice personalizzato, ciò semplifica la distribuzione. È comunque consigliabile eseguire il passaggio di disabilitazione su un sito che non è attivo, ma forse questo restringerà leggermente la finestra. Non credo che il tuo hook di aggiornamento personalizzato renderà ancora più sicuro disabilitare un modulo live.
greg_1_anderson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.