melhore nossa estratégia de deployment

Temos um aplicativo de comércio eletrônico que desenvolvemos em nossa empresa. É um aplicativo LAMP razoavelmente padrão que desenvolvemos dentro e fora por cerca de 3 anos. Desenvolvemos o aplicativo em um domínio de teste, aqui nós adicionamos novos resources e corrigimos bugs, etc. Nosso rastreamento de bugs e desenvolvimento de resources é gerenciado em uma solução de subviewsão hospedada (unfuddle.com). Como os erros são relatados, nós fazemos essas correções no domínio de teste e, em seguida, confirmamos alterações no svn quando estamos felizes, o erro foi corrigido. Seguimos o mesmo procedimento com a adição de novos resources.

Vale ressaltair a architecture geral do nosso sistema e aplicação em nossos serveres. Cada vez que um novo recurso é desenvolvido, rolo esta atualização paira todos os sites que usam nosso aplicativo (sempre um server que controlamos). Cada site que usa nosso sistema essencialmente usa exatamente os mesmos files paira 95% da base de código. Nós temos algumas pastas em cada site que contêm files feitos a esse site – files css / imagens, etc. Além de as diferenças entre cada site serem definidas por várias configurações dentro de cada database de sites.

Isso passa paira a própria deployment. A pairtir de quando estamos prontos paira lançair uma atualização de algum tipo, executamos um command no server no qual o site de teste está ativado. Isso executa um command de cópia (cp -fru / testsite / / othersite /) e passa por cada força vhost atualizando os files com base na data modificada. Cada server adicional em que hospedamos tem um server que rsync a base de código de produção e então repetimos o procedimento de cópia em todos os sites desse server. Durante este process, nós mudamos os files que não queremos ser substituídos, movendo-os de volta quando a cópia foi concluída. Nosso script de deployment executa uma série de outras funções, como a aplicação de commands SQL paira alterair cada database, adicionando campos / novas tabelas etc.

Ficamos cada vez mais preocupados com o fato de nosso process não ser suficientemente estável, não tolerante a crashs e também é um pouco de um método de força bruta. Também estamos conscientes de que não estamos fazendo o melhor uso da subviewsão, pois temos uma position em que trabalhair em um novo recurso nos impedirá de implementair uma importante correção de erros, pois não estamos fazendo uso de ramos ou tags. Também pairece errado que tenhamos tanta replicação de files em nossos serveres. Também não somos capazes de realizair facilmente uma reviewsão do que acabamos de lançair. Realizamos um diferencial antes de cada lançamento, paira que possamos obter uma list de files que serão alterados paira sabermos o que foi alterado depois, mas o process de reviewsão ainda seria problemático. Em termos de database, comecei a procurair o dbdeploy como uma solução potencial. O que realmente queremos é uma orientação geral sobre como podemos melhorair nosso gerenciamento e deployment de files. Idealmente, queremos que o gerenciamento de files esteja mais intimamente ligado ao nosso repository, de modo que um rollout / rollback seria mais conectado ao svn. Algo como usair o command de exportação paira gairantir que os files do site sejam os mesmos que os files de reimport. Também seria bom se a solução talvez também paire a replicação de files em torno de nossos serveres.

Ignorando nossos methods atuais, seria muito bom ouvir como outras pessoas abordam o mesmo problema.

paira resumir …

  • Qual é a melhor maneira de fazer files em vários serveres ficair em sincronia com svn?
  • Como evitair a replicação de files? links simbólicos / outra coisa?
  • Como devemos estruturair nosso repo paira que possamos desenvolview novos resources e corrigir os antigos?
  • Como devemos desencadeair rollouts / rollbacks?

desde já, obrigado

EDITAR:

Eu li muitas coisas boas recentemente sobre o uso de Phing e Capistrano paira esse tipo de tairefas. Alguém pode dair mais informações sobre eles e quão bom eles seriam paira esse tipo de tairefa?

Meu conselho paira fazer viewsões é ter lançamentos e lançamentos de manutenção. Feature Releases seria os lançamentos que recebem novos resources. Estes são adicionados ao seu tronco de subviewsão. Quando você acha que estas são cairacterísticas completas, você ramificá-las paira um ramo de lançamento. Uma vez que seu process de QA está feliz com esta viewsão, você mairca a viewsão e implanta o código paira seus serveres.

Agora, quando você recebe um relatório de erro, você compromete esta correção no ramo e a porta paira o tronco. Quando você está feliz com a quantidade de erros corrigidos, você pode maircair e implantair uma viewsão de manutenção.

É importante que você tenha um ramo de sua base de código ao vivo (ou tenha a capacidade de criair um, conhecendo a revisão ao vivo) que seja sepairado do seu ramo de desenvolvimento, paira que você tenha a capacidade de implantair correções no seu código ao vivo sem ter que implantair novos resources ou código não testado.

Eu recomendairia usair o sistema de embalagem nativo da sua distribuição paira implementair um novo código. Se você tem um package que contém toda sua base de código, você sabe que todo o seu código foi implantado em uma espécie de operação atômica, você pode view qual viewsão está instalada de relance, pode viewificair sua base de código usando a sum de viewificação de seus packages. Rolling Back é apenas um caso de instalair a viewsão instalada anteriormente do package.

O único roadblock que posso view paira você implementair isso é que você pairece ter várias cópias da base de código paira diferentes clientes que executam em um único server. Eu tentairia organizair seu código paira que todos os clientes saíssem dos mesmos files e não usassem cópias. Eu não sei o quão fácil isso seria paira você, mas reduzir o número de cópias com as quais você precisa lidair reduzirá maciçamente sua dor de cabeça.

Estou assumindo que, como você mencionou LAMP, você está usando o PHP ou outro idioma de script, o que não requer um process de compilation. Isso significa que você provavelmente está perdendo um mairavilhoso process chamado Integração Contínua. O que isso basicamente significa é que seu código está sendo testado continuamente paira gairantir que ele ainda esteja em um estado liberável. Toda vez que alguém viewifica em um novo código, um process o leva e executa o process de compilation e teste. Com um idioma compilado, você costumava usair isso paira gairantir que o código ainda fosse compilado. Com todos os idiomas, você deve aproveitair a oportunidade paira executair testes de unidades (seu código está em unidades testáveis, não é?) E testes de integração. Paira sites, uma boa ferramenta paira testair testes de integração é Selenium. Em nossas compilações Java, também medimos a cobertura do código e as métricas do código paira view como progredimos ao longo do tempo. O melhor server de CI encontrado paira Java é Hudson, mas algo como buildbot pode funcionair melhor paira outros idiomas. Você pode criair packages usando seu server CI.

Começamos a usair o Puppet (produto emblemático da Reductive Labs). É uma estrutura baseada em Ruby paira automatizair tairefas de administração de sistemas. Eu estava no boneco de fazenda há algumas semanas e aqui estão os links de vídeo:

Apresentação de Luke Kanies – Introdução ao Puppet

Além disso, se você quiser view todas as apresentações feitas em puppetcamp em san francisco, este é o link:

Apresentações feitas sobre como os outros usairam Puppet

Apreciair.