Alguns módulos possuem rotinas de desinstalação. Que normalmente remove as tabelas de dados para esse módulo, variáveis da tabela de variáveis e códigos de idioma introduzidos por esse módulo. Essas rotinas residem no .install
módulo.
Portanto, eles não podem ser executados sem a presença desse módulo. Então, aqui estão nossas etapas atuais. Minha pergunta é: isso pode ser feito de maneira mais simples e eficaz? Digamos que eu remova o módulo foo_bar.
- No RCS, prepare um novo release, onde:
- Todas as substituições de css e temas usadas ou construídas em cima de foo_bar são removidas.
- Todas as substituições de css e tema dos módulos, dependendo de foo_bar, são removidas.
- Empurre esse release para aceitação. Teste a desinstalação (de admin / modules) com uma cópia muito recente do banco de dados de produção.
- Se tudo der certo, implante a nova base de código na produção e desinstale o foo_bar e suas dependências. Isso invocará a desinstalação nos vários módulos, limpando o banco de dados.
- No RCS (git), prepare um novo release em que o código seja realmente removido.
- Implante isso para aceitação, onde testamos se nada dependia acidentalmente disso (alguns módulos ou funções temáticas feios incluem arquivos diretamente de outros módulos. Mais notavelmente CSS, JS ou arquivos de imagem).
- Se aceito, implante um novo release na produção. a produção agora tem um banco de dados limpo e uma base de código limpa .
O problema que não consigo ver como resolver é que isso sempre precisa de dois lançamentos. Como no Drupal, uma versão requer que o site esteja offline, isso significa duas vezes o tempo de inatividade apenas para remover um módulo. Também requer dois procedimentos de liberação que, em ambientes de hospedagem profissional, podem ser muito caros, demorados ou frustrantes.
Se removermos o módulo da base de código na primeira iteração, não poderemos executar os ganchos de desinstalação, mantendo muitos fiapos no banco de dados; não apenas algumas tabelas, mas principalmente variáveis e localidades. Se não removermos o módulo da base de código, isso significa que ela crescerá com código antigo e não utilizado; isso não gera sobrecarga de desempenho, mas torna a manutenção do código cada vez mais difícil.
Como você lida com isso?
[editar: nota adicional sobre a implantação ser um procedimento difícil, geralmente]
fonte
Respostas:
Tenha muito cuidado em manter seu banco de dados e código sincronizados; como você mencionou na sua pergunta, os módulos a serem desinstalados precisam permanecer na base de código até que seus ganchos de desinstalação sejam executados no banco de dados ativo. Essa é uma limitação do Drupal que um fluxo de trabalho com git pull sozinho não resolverá.
Eu recomendaria que, em vez de tentar ajustar seu processo, procure maneiras de reduzir o tempo de inatividade necessário para processar suas atualizações. Eu recomendaria a configuração de um ambiente de armazenamento temporário multissite ying / yang para resolver esse problema. nb eu não usei os scripts contidos no link anterior; convém configurar as coisas de maneira diferente, seguindo a mesma idéia de que você pode trocar seus sites ao vivo e de palco durante a implantação.
Continue seguindo o mesmo procedimento descrito na sua pergunta com os seguintes ajustes:
uma. Sincronize do dev para o estágio (yang), como de costume. Teste fazendo uma desinstalação dos módulos a serem removidos, seguida pela remoção do código, etc. Notas sobre o fluxo de trabalho do Git: crie uma tag ou observe o hashid dos diferentes estados do seu código: todos os módulos em vigor antes da desinstalação, substituições & c. removido etc., conforme necessário. Talvez apenas duas referências sejam necessárias.
b. Quando o teste for concluído e aceito, restaure o código no palco (yang) para o estado de vida (ying).
c. Prepare o site ativo (ying) para atualização, desativando a capacidade de qualquer usuário de alterar o conteúdo do sistema. Uma atualização sql para a tabela de permissões geralmente é feita aqui. Nesse momento, os usuários ainda poderão ler o conteúdo no site ativo, mas receberão um erro de permissão negada se tentarem atualizar o conteúdo. (Se você é legal, talvez possa alterar o manipulador de permissão negada para imprimir um aviso apropriado de que a função está temporariamente indisponível).
d. Agora empurre o banco de dados ativo (ying) de volta ao banco de dados de estágio (yang), excluindo a tabela de permissões da atualização.
e Repita a etapa a. novamente. Se você tem suas hashtags à mão, deve ser fácil restaurar para o estado em que os módulos a serem removidos existem, executar os ganchos de desinstalação no banco de dados e voltar ao estado do código em que os itens da etapa 1 são mesclados de volta.
f. Agora você está pronto para trocar ying e yang. Faça isso ajustando suas diretrizes de configuração do Apache. Observe que, se você fizer um
/etc/init.d/apache restart
, algumas conexões poderão ser interrompidas, mas/etc/init.d/apache reload
permitirão uma troca limpa.g. Live agora é 'yang'; a tabela de permissões não é modificada aqui, para que os usuários possam criar conteúdo. Se você automatizar as etapas e. e f., o tempo indisponível deve ser muito baixo.
h. Empurre ao vivo (yang) de volta ao estágio (ying), código e banco de dados - ou empurre a partir do dev, conforme necessário. Agora você tem um ambiente limpo pronto para sua próxima iteração.
fonte
if (module_exists('removeme')) { ... }
. Implante esse código. Se você testar e confirmar que a remoção do módulo não quebra mais seu código personalizado, isso simplifica sua implantação. Ainda é aconselhável executar a etapa de desativação em um site que não esteja ativo, mas talvez isso restrinja sua janela um pouco. Não acho que seu gancho de atualização personalizado torne mais seguro desativar um módulo ativo.