Temos um aplicativo de comércio eletrônico que desenvolvemos em nossa empresa. É uma aplicação LAMP razoavelmente padrão que desenvolvemos há cerca de 3 anos. Desenvolvemos o aplicativo em um domínio de teste, aqui adicionamos novos recursos e corrigimos bugs etc. Nosso rastreamento de bugs e desenvolvimento de recursos são todos gerenciados em uma solução de subversão hospedada (unfuddle.com). Como os bugs são relatados, fazemos essas correções no domínio de teste e, em seguida, confirmamos as alterações no svn quando estamos felizes que o bug foi corrigido. Seguimos esse mesmo procedimento com a adição de novos recursos.
Vale ressaltar a arquitetura geral do nosso sistema e aplicativo em nossos servidores. Cada vez que um novo recurso é desenvolvido, lançamos essa atualização em todos os sites usando nosso aplicativo (sempre um servidor que controlamos). Cada site que utiliza nosso sistema basicamente usa exatamente os mesmos arquivos para 95% da base de código. Temos duas pastas em cada site que contêm arquivos sob medida para esse site - arquivos / imagens css etc. Além disso, as diferenças entre cada site são definidas por várias definições de configuração no banco de dados de cada site.
Isso vai para a própria implantação real. Quando estamos prontos para lançar algum tipo de atualização, executamos um comando no servidor em que o site de teste está. Isso executa um comando de cópia (cp -fru / testsite / / othersite /) e passa por cada força do vhost atualizando os arquivos com base na data da modificação. Cada servidor adicional no qual hospedamos possui um vhost no qual sincronizamos a base de código de produção e, em seguida, repetimos o procedimento de cópia em todos os sites desse servidor. Durante esse processo, removemos os arquivos que não queremos que sejam substituídos, retornando-os quando a cópia estiver concluída. Nosso script de implementação executa várias outras funções, como aplicar comandos SQL para alterar cada banco de dados, adicionar campos / novas tabelas etc.
Ficamos cada vez mais preocupados com o fato de nosso processo não ser suficientemente estável, tolerante a falhas e também ser um método de força bruta. Também estamos cientes de que não estamos fazendo o melhor uso do subversion, pois temos uma posição em que trabalhar em um novo recurso nos impediria de lançar uma importante correção de bug, pois não estamos usando ramos ou tags. Também parece errado que tenhamos tanta replicação de arquivos em nossos servidores. Também não podemos executar facilmente uma reversão do que acabamos de lançar. Realizamos um diff antes de cada lançamento, para que possamos obter uma lista de arquivos que serão alterados para que possamos saber o que foi alterado depois, mas o processo de reversão ainda seria problemático. Em termos de banco de dados, comecei a procurar no dbdeploy como uma solução potencial. O que realmente queremos é uma orientação geral sobre como podemos melhorar nosso gerenciamento e implantação de arquivos. Idealmente, queremos que o gerenciamento de arquivos seja mais intimamente vinculado ao nosso repositório, para que uma implementação / reversão esteja mais conectada ao svn. Algo como usar o comando export para garantir que os arquivos do site sejam iguais aos arquivos de repo. Também seria bom se a solução talvez também parasse a replicação de arquivos em nossos servidores.
Ignorando nossos métodos atuais, seria muito bom ouvir como outras pessoas abordam o mesmo problema.
para resumir ...
- Qual é a melhor maneira de fazer com que os arquivos em vários servidores fiquem sincronizados com o svn?
- Como devemos evitar a replicação de arquivos? links simbólicos / alguma outra coisa?
- Como devemos estruturar nosso repositório para que possamos desenvolver novos recursos e corrigir os antigos?
- Como devemos acionar lançamentos / reversões?
desde já, obrigado
EDITAR:
Recentemente, li muitas coisas boas sobre o uso do Phing e Capistrano para esse tipo de tarefa. Alguém pode dar mais informações sobre eles e quão bons eles seriam para esse tipo de tarefa?