Qual é a sua estratégia de implantação php preferida? [fechadas]

161

Estou iniciando um novo projeto em PHP e gostaria de receber feedback de outros desenvolvedores sobre sua estratégia preferida para implantação em PHP. Adoraria automatizar um pouco as coisas para que, assim que as alterações sejam confirmadas, elas possam ser rapidamente migradas para um servidor de desenvolvimento ou produção.

Tenho experiência com implantações usando Capistrano com Ruby, além de alguns scripts básicos de shell.

Antes de mergulhar de cabeça sozinho, seria ótimo ouvir como os outros abordaram isso em seus projetos.

Outras informações

Atualmente, os desenvolvedores trabalham em instalações locais do site e confirmam alterações em um repositório do subversion. As implementações iniciais são feitas exportando um release marcado do svn e carregando-o no servidor.

Alterações adicionais geralmente são feitas gradualmente, fazendo o upload manual de arquivos alterados.

GloryFish
fonte
Bonito :) Obrigado pela edição splattne.
GloryFish 8/01/2009
1
@ Paul Tomblin: OMG eu não consigo parar de rir !!!!! Não há melhor maneira :) #
Andrei Rînea 02/11/10
Resposta alguém Can isso, por favor - stackoverflow.com/questions/36034277/...
Sandeepan Nath

Respostas:

109

Para PHP, os scripts de construção SVN com Phing são o caminho a percorrer. Phing é semelhante ao ANT, mas é escrito em PHP, o que facilita muito a modificação dos desenvolvedores de PHP de acordo com suas necessidades.

Nossa rotina de implantação é a seguinte:

  • Todo mundo desenvolve no mesmo servidor local no trabalho, todo desenvolvedor também faz check-out em sua máquina em casa.
  • As confirmações acionam um gancho pós-confirmação que atualiza um servidor intermediário.
  • Os testes são executados no servidor intermediário, se eles passarem - continue.
  • O script de compilação Phing é executado:
  • Desativa o servidor de produção, alternando o domínio para uma página "Em construção"
  • Executa a atualização do SVN no checkout de produção
  • Executa o script deltas do esquema
  • Executa testes
  • Se os testes falharem - execute o script de reversão
  • Se os testes forem aprovados, o servidor fará o roteamento de volta para a finalização da produção

Há também o phpUnderControl , que é um servidor de Integração Contínua. Não achei muito útil que projetos na Web fossem honestos.

Eran Galperin
fonte
Eu estava prestes a publicar uma lista do que faço na minha loja Windows / .NET, mas é mais ou menos o que você tem aqui. +1
Daniel Schaffer (
você encontrou alguma desvantagem por ter um svn co como ambiente de produção? Eu realmente não consigo pensar em nenhuma desvantagem, mas não parece "limpo" ter um svn co como produção? Por que não uma exportação svn ou rsync?
ChrisR
Devido à diferença básica entre uma empresa e uma exportação - você não pode enviar alterações específicas, é necessário exportar todo o aplicativo novamente. É uma diferença muito importante que torna a vida muito mais fácil
Eran Galperin
36
Por que colocar o site na tela? Se você executar um diretório de releases /, e apontar liveSite / por meio de um link simbólico para sua pasta em releases /, poderá fazer check-out completo do site em uma nova pasta / releases e alternar o link simbólico instantaneamente assim que o processo estiver concluído? Não há necessidade de tempo de inatividade (a menos que você seja o pobre soluço que faz uma solicitação durante a troca de link simbólico).
Joseph Lust
2
Quem é responsável por executar todas essas tarefas, como atualizar o SVN na produção e vincular o novo lançamento? É phing? São Jenkins?
Daniel Ribeiro
24

Atualmente, estou implantando o PHP usando o Git . Uma produção simples do Git Push é tudo o que é necessário para atualizar meu servidor de produção com a cópia mais recente do Git. É fácil e rápido, porque o Git é inteligente o suficiente para enviar apenas as diferenças e não todo o projeto novamente. Também ajuda a manter uma cópia redundante do repositório no servidor da Web em caso de falha de hardware do meu lado (embora eu também use o GitHub para garantir a segurança).

Kyle Cronin
fonte
Eu venho fazendo a mesma coisa há anos também em projetos de pequeno e médio porte. Eu tenho que dizer, está funcionando muito bem para mim. Você precisa amar a simplicidade dessa abordagem.
Chris Allen Lane,
3
Como você lida com o banco de dados com essa abordagem?
precisa saber é o seguinte
1
@neilc À mão, infelizmente. Quaisquer alterações no banco de dados precisam ser executadas manualmente antes do envio.
Kyle Cronin
Geralmente incluo () um arquivo PHP que contém a configuração do banco de dados e coloco manualmente o arquivo no servidor ou na máquina de teste. Dessa forma, você não está armazenando senhas no git e também não operando acidentalmente em um banco de dados de produção.
Matt
Como você configura o git para fazer isso por você? Existe algum guia / tutorial? Agradeço antecipadamente.
Miguel Stevens
14

Usamos o Webistrano , uma interface web do Capistrano, e estamos muito felizes com isso.

O Webistrano permite implementações em vários estágios e em vários ambientes do SVN, GIT e outros. Possui suporte de reversão interno, suporte para funções de servidor separadas, como web, banco de dados, aplicativo etc., e é implementado em paralelo. Ele permite que você substitua os parâmetros de configuração em vários níveis, como por estágio, e registre os resultados de cada implantação, opcionalmente enviando-os por correio.

Embora o Capistrano e o Webistrano sejam aplicativos Ruby, a sintaxe das 'receitas' da implantação é fácil e poderosa o suficiente para ser entendida por qualquer programador PHP. Originalmente, o Capistrano foi criado para projetos Ruby on Rails, mas acomoda facilmente projetos PHP.

Uma vez configurado, é fácil o suficiente para ser usado por não programadores, como testadores que implantam uma versão intermediária.

Para fornecer a implementação mais rápida possível, instalamos o método fast_remote_cache , que atualiza um cache de cópia de trabalho svn no servidor remoto e, em seguida, vincula o resultado.

Martijn Heemels
fonte
7

Eu uso o Apache Ant para implantar em diferentes destinos (dev, QA e live). O Ant foi projetado para funcionar na implantação de Java, mas fornece uma solução geral útil para a implantação de arquivos arbitrários.

A sintaxe do arquivo build.xml é bastante fácil de aprender - você define diferentes destinos e suas dependências que são executados quando você chama o programa ant na linha de comandos.

Por exemplo, eu tenho destinos para dev, QA e live, cada um dos quais depende do destino cvsbuild que faz check-out da última revisão principal do nosso servidor CVS, copia os arquivos apropriados no diretório build (usando a tag do conjunto de arquivos) e, em seguida, rsyncs o diretório de compilação no servidor apropriado. Existem algumas peculiaridades a aprender, e a curva de aprendizado não é totalmente plana, mas eu faço dessa maneira há anos sem problemas, então eu a recomendaria para sua situação, embora eu esteja curioso para saber outras respostas. verá neste tópico.

notneilcasey
fonte
6

Eu faço coisas manualmente usando o Git. Um repositório para desenvolvimento, que é git push --mirrorenviado para um repositório público, e o servidor ativo é um terceiro repositório extraído desse repositório . Suponho que esta parte seja igual à sua própria configuração.

A grande diferença é que eu uso ramificações para quase todas as alterações nas quais estou trabalhando (tenho cerca de cinco no momento) e tende a alternar entre elas. O ramo mestre não é alterado diretamente, exceto para mesclar outros ramos.

Eu executo o servidor ativo diretamente da ramificação mestre e, quando terminar com outra ramificação e pronto para mesclá-la, vire o servidor para essa ramificação por um tempo. Se quebrar, colocá-lo de volta ao mestre leva segundos. Se funcionar, ele será mesclado no mestre e o código ativo será atualizado. Suponho que uma analogia disso no SVN seria ter duas cópias de trabalho e apontar para a ao vivo por meio de um link simbólico.


fonte
3

Eu sei que Phing já foi mencionado algumas vezes agora, mas tive muita sorte com o phpUnderControl . Para nós nós

  1. Confira cópias individuais de filiais em máquinas locais
  2. As ramificações são testadas e depois mescladas no tronco
  3. As confirmações no tronco são criadas automaticamente pelo phpUnderControl, executam testes e constroem toda a documentação, aplicam deltas ao banco de dados
  4. O tronco é executado através de testes de qualidade e depois incorporado à nossa filial Stable
  5. Novamente, o phpUnderControl cria automaticamente o Stable, executa testes e gera documentação e atualizações do banco de dados
  6. Quando estamos prontos para avançar para a produção, executamos um script rsync que faz backup da produção, atualiza o banco de dados e empurra os arquivos para cima. O comando rsync é chamado manualmente, para garantir que alguém esteja assistindo a promoção.
dragonmantank
fonte
5
phpUnderControl está morto: |
M02ph3u5
3

uma alternativa aos scripts de implantação caseiros é implantar em uma plataforma como serviço que abstraia muito desse trabalho para você. Um PaaS normalmente oferece sua própria ferramenta de implantação de código, além de escala, tolerância a falhas (por exemplo, não diminui quando o hardware falha) e, geralmente, um ótimo kit de ferramentas para monitoramento, verificação de log etc. Há também o benefício de implantar em um boa configuração conhecida que será mantida atualizada ao longo do tempo (menos uma dor de cabeça para você).

O PaaS que eu recomendaria é o dotCloud , além do PHP ( consulte o início rápido do PHP ), ele também pode implantar o MySQL, o MongoDB e um monte de serviços adicionais. Ele também possui ótimas vantagens, como implantação com tempo de inatividade zero, reversão instantânea, suporte completo para SSL e websocket, etc. E há um nível gratuito que é sempre bom :)

Claro que sou um pouco tendenciosa, pois trabalho lá! Outras opções que valem a pena conferir além do dotCloud são o Pagodabox e o Orchestra (agora parte do Engine Yard).

Espero que isto ajude!

Salomão

Solomon Hykes
fonte
2

O fato de você fazer alterações automáticas e cegas de um repositório para servidores de produção parece perigoso. E se o seu código confirmado contiver um erro de regressão, para que seu aplicativo de produção fique com problemas?

Mas, se você deseja um sistema de Integração Contínua para PHP, acho que Phing é a melhor opção para PHP. Eu mesmo não testei, pois faço coisas da maneira manual, como por exemplo, scp.

Henrik Paul
fonte
2

Estou muito atrasado para a festa, mas pensei em compartilhar nossos métodos. Usamos o Phing com o Phingistrano , que fornece ao Phing funcionalidades semelhantes ao Capistrano por meio de arquivos de compilação pré-criados. É muito legal, mas só funciona se você usar o Git no momento.

Clint
fonte
1

Eu tenho uma cópia de trabalho de uma ramificação de versão SVN no servidor. A atualização do site (quando não há alterações no esquema) é tão fácil quanto emitir um comando de atualização do SVN. Nem preciso colocar o site offline.


fonte
1
então você tem diretórios .svn espalhados por todo o site? meu cérebro purista vai contra este :)
Stann
Isso cuida apenas do código fonte. Implementações muitas vezes precisam de outras ações tomadas - alterações de banco de dados aplicada, caches apuradas, etc.
Leonid Mamchenkov
1

Phing é provavelmente a sua melhor aposta, se você aguenta a dor dos arquivos de configuração xml. A estrutura do Symfony tem seu próprio porto de rake (pake), que funciona muito bem, mas está bastante acoplado ao restante do Symfony (embora você provavelmente possa separá-los).

Outra opção é usar o Capistrano. Obviamente, ele não se integra tão bem ao PHP, como ao Ruby, mas você ainda pode usá-lo para muitas coisas.

Por fim, você sempre pode escrever scripts de shell. Até agora, foi o que eu fiz.

Troelskn
fonte
1

Um ano atrasado, mas ... No meu caso, a implantação não é automática. Acho perigoso implantar código e executar scripts de migração de banco de dados automaticamente.

Em vez disso, os ganchos do subversion são usados ​​para implantar apenas no servidor de teste / armazenamento temporário. O código é implantado na produção no final de uma iteração, depois de executar os testes e garantir que tudo funcione. Para a implantação em si, eu uso um Makefile personalizado que usa o rsync para transferir arquivos. O Makefile também pode executar os scripts de migração no servidor remoto, pausar / retomar servidores da Web e de banco de dados.

Rafa
fonte
1

No meu trabalho, eu e minha equipe desenvolvemos um substituto orientado ao Phing para a implantação do capistrano e também incorporamos algumas das vantagens disponíveis no phing, como testes do PHPUnit, phpcs e PHPDocumentor. Criamos um repositório git que pode ser adicionado a um projeto como um submódulo do git e funciona muito bem. Eu o anexei a vários projetos e é modular o suficiente para que seja fácil fazê-lo funcionar com qualquer projeto em qualquer um de nossos diversos ambientes (preparação, teste, produção, etc ...).

Com os scripts de construção de phing, você pode executá-los manualmente a partir da linha de comando, e também tive sucesso ao automatizar as rotinas de construção / implantação com Hudson e agora Jenkins ci.

Não posso postar nenhum link agora porque o repo ainda não é público, mas me disseram que vamos abrir o código algumas vezes em breve. Portanto, não hesite em entrar em contato comigo se tiver interesse ou se tiver qualquer dúvida sobre como automatizar sua implantação com phing e git.

Jesse Greathouse
fonte
0

Eu acho que a maneira de implantar SVN não é muito boa. Porque:

Você precisa abrir o acesso SVN para o mundo inteiro

tem muitos .svn nos servidores Web de produção

Eu acho que Phing para produzir uma filial + combinar todos os js / css + substituir a configuração do palco + o upload de ssh para todos os servidores www é a melhor maneira.

ssh para 10 www server e svn up também é problema.

Eric Fong
fonte
Abrindo meu servidor svn para o mundo inteiro, de jeito nenhum! Basta usar seu firewall e autenticação sobre SSL para limitar quem pode ver seu código.
Shadok 26/09/12