Configurando um Ciclo de Implementação / Construção / CI para Projetos PHP

200

Sou desenvolvedor solitário na maior parte do tempo, trabalhando em vários projetos grandes, principalmente baseados em PHP. Quero profissionalizar e automatizar como as alterações na base de código são tratadas e criar um processo de Integração Contínua que possibilite a transição para o trabalho em equipe sem a necessidade de fazer alterações fundamentais.

O que estou fazendo agora é que tenho um ambiente de teste local para cada projeto; Eu uso o SVN para cada projeto; as alterações são testadas localmente e depois transferidas para a versão on-line, geralmente via FTP. A documentação da API é gerada manualmente a partir do código fonte; Os testes de unidade são algo em que estou entrando devagar e ainda não faz parte da minha rotina diária.

O "ciclo de construção" que estou imaginando faria o seguinte:

  • Um changeset é verificado no SVN após ter sido testado localmente.

  • Eu inicio o processo de compilação. A revisão SVN HEAD é retirada, modificada se necessário e preparada para o upload.

  • A documentação da API é gerada automaticamente - se eu ainda não a tiver configurado em detalhes, usando um modelo padrão, verificando toda a base de códigos.

  • A nova revisão é implantada no local remoto via FTP (incluindo renomeação de diretório, chmodding, importação de bancos de dados e afins). Isso é algo que eu já gosto muito de phing , mas estou aberto a alternativas, é claro.

  • Os testes de unidade que residem em um local predefinido são executados. Sou informado sobre seu fracasso ou sucesso usando E-Mail, RSS ou (preferencialmente) saída HTML que posso pegar e colocar em uma página da web.

  • (opcionalmente) um arquivo de texto "changelog" do usuário final em um local predefinido é atualizado com uma parte predefinida da mensagem de confirmação ("Agora é possível filtrar" foo "e" bar "ao mesmo Esta mensagem não é necessariamente idêntica à mensagem de confirmação do SVN, que provavelmente contém muito mais informações internas.

  • Coisas como métricas de código, verificação de estilo de código e assim por diante não são meu foco principal no momento, mas a longo prazo, certamente o farão. As soluções que trazem esse produto pronto para o uso são muito bem vistas.

Estou à procura de

  • Feedback e experiências de pessoas que estão ou estavam em uma situação semelhante e implementaram com sucesso uma solução para isso

  • Especialmente, bons tutoriais passo a passo e orientações sobre como configurar isso

  • Soluções que fornecem o máximo de automação possível , por exemplo, criando uma API de esqueleto, casos de teste e assim por diante para cada novo projeto.

e também

  • Recomendações de produtos . O que eu sei até agora é phing / form para construção, e phpUnderControl ou Hudson para a parte de relatórios. Gosto de todos, até onde posso ver, mas é claro que não tenho experiência detalhada com eles.

Estou inundado de trabalho, por isso tenho uma forte inclinação para soluções simples. Por outro lado, se um recurso estiver faltando, vou chorar por ser muito limitado. :) As soluções de apontar e clicar também são bem-vindas. Também estou com recomendações de produtos comerciais que podem funcionar com projetos PHP.

Minha configuração

Estou trabalhando no Windows localmente (7, para ser exato) e a maioria dos projetos clientes é executada em uma pilha LAMP, geralmente em hospedagem compartilhada (= sem SSH remoto). Estou procurando soluções que possam ser executadas em meu próprio ambiente. Estou pronto para configurar uma VM Linux para isso, não há problema. As soluções hospedadas são interessantes para mim apenas se fornecerem todos os aspectos descritos ou forem suficientemente flexíveis para interagir com as outras partes do processo.

Recompensa Estou aceitando a resposta que sinto que me dará mais quilometragem. Há muitas sugestões excelentes aqui, gostaria de poder aceitar mais de uma resposta. Obrigado a todos!

Pekka 웃
fonte

Respostas:

76

Já passei por buildbot , CruiseControl.net , CruiseControl e Hudson . Embora eu realmente gostasse do CruiseControl *, era muito complicado com casos de dependência realmente complexos. O buildbot não é fácil de configurar, mas possui uma aura agradável (eu apenas gosto de python, só isso). Mas Hudson venceu os três primeiros porque:

  1. É fácil de configurar
  2. É fácil de personalizar
  3. Parece bom e tem uma boa funcionalidade de visão geral
  4. Ele recebeu atualizações de apontar e clicar, para si e para todos os plugins instalados. Este é um recurso muito bom, que eu aprecio cada vez mais

Advertência: Eu só usei o linux como base para os servidores de compilação mencionados acima (o CC.net rodava em mono ), mas todos eles - de acordo com os documentos - rodam em várias plataformas.

Configurando um servidor Hudson

Pré-requisitos:

  • Java (1.5 servirá muito bem)
  • Acesso de leitura ao servidor subversion (eu tenho uma conta separada para o usuário hudson)

A partir daqui, é apenas:

java -jar hudson.war

Isso executará uma pequena instância do servidor no seu console e você poderá procurar a instalação no seu http://localhost:8080computador se não tiver mais nada em execução nessa porta com antecedência (você pode especificar outra porta passando a --httpPort=ANOTHER_HTTP_PORTopção para o comando acima) e tudo correu bem no processo de 'instalação'.

Se você for para o diretório de plugins disponível ( http://localhost:8080/pluginManager/available), encontrará plugins para dar suporte às tarefas mencionadas acima (o suporte ao subversion é instalado por padrão).

Se isso lhe apetecer, instale um servidor de aplicativos java, como tomcat ou jetty . As instruções de instalação estão disponíveis para todos os principais servidores de aplicativos

Atualização : Kohsuke Kawaguchi construiu um instalador de serviço do Windows para Hudson

Configurando um projeto no Hudson

Os links na explicação a seguir assumem uma instância em execução do hudson localizada em http://localhost:8080

  1. Selecione novo trabalho ( http://localhost:8080/view/All/newJob) no menu à esquerda
  2. Dê um nome ao trabalho e marque Build a free-style software projectna lista
  3. Pressionar 'ok' levará à página de configuração do trabalho. Todas as opções têm um pequeno ponto de interrogação além delas. Pressionar isso exibirá um texto de ajuda sobre a opção.
  4. Sob o grupo de opções 'Source Code Management' você usaria o Subversion. O Hudson aceita tanto o acesso à URL quanto o acesso ao módulo local
  5. No grupo de opções 'Build Triggers', você usaria 'Poll SCM'. A sintaxe usada aqui é a do cron, portanto, pesquisar o repositório do subversion a cada 5 minutos seria*/5 * * * *
  6. O processo de construção do projeto é especificado no grupo de opções 'Build'. Se você já possui um arquivo de construção de formigas com todos os alvos de que precisa, está com sorte. Basta escolher 'Invocar formiga' e escrever o nome do alvo. O grupo de opções também suporta comandos maven e shell, mas também há um plug - in disponível para phing .
  7. Marque ações adicionais de compilação em 'Postar ações de compilação', como notificações por email ou arquivamento de artefatos de compilação.

Para configurar processos para os quais o hudson não possui plug-ins, você pode chamá-los diretamente por meio de um script de shell na configuração da compilação ou escrever seu próprio plugin

Armadilhas:

  • Se você produzir artefatos de construção, lembre-se de fazer com que Hudson se limpe regularmente.
  • Se você tiver mais de 20 projetos configurados, considere não exibir o status de construção como a página principal padrão no hudson

Boa sorte!

Steen
fonte
2
Eu acho que há um erro com sua sintaxe cron. Isso acontecia no quinto minuto de cada hora. Se você deseja pesquisar o repositório a cada 5 minutos, precisará usar * / 5
Brian Wigginton
2
@BrianWigginton: você está completamente certo. E até tentei corrigir a postagem, mas não posso salvá-la porque tenho "uma referência a um nome de host inválido", ou seja, 'localhost'. Espero que as pessoas olhem aqui para a correção.
Steen
22

O termo que você procura é "integração contínua".

Aqui está um exemplo de alguém que usa o GIT + phpundercontrol: http://maff.ailoo.net/2009/09/continuous-integration-phpundercontrol-git/

O CruiseControl (que é um servidor de IC) pode usar o Hosted SVN / GIT como fonte. Então você pode até usá-lo com GitHub ou Beanstalk ou qualquer outra coisa.

Em seguida, você pode integrar isso ao seguinte tipo de software:

  • PHPUnit
  • php-codesniffer
  • phpdocumentor
  • PHP Gcov
  • PHPXref
  • Yasca
  • etc.

Você também pode tentar este IC hospedado: http://www.php-ci.net/hosting/create-project

Porém, lembre-se de que essas ferramentas precisam de suporte personalizado se você as integrar.

Você também pensou em gerenciamento de projetos e gerenciamento de patches?

Você pode usar o Redmine para gerenciamento de projetos. Ele integrou o suporte à integração contínua, mas apenas como cliente (não como servidor de CI).

Tente usar um SVN / GIT / etc hospedado. solução, porque eles cobrirão seus backups e manterão os servidores em execução, para que você possa se concentrar no desenvolvimento.

Para um tutorial sobre como configurar o Hudson, consulte: http://toptopic.wordpress.com/2009/02/26/php-and-hudson/

Michiel
fonte
2
Obrigado pelo link. Os produtos com os quais estou familiarizado, o que espero são mais orientações em estilo de tutorial, como o que você forneceu.
Pekka
Olá, a partir de outubro de 2012, o php-ci.net está desativado ou desativado? Não consigo me conectar a esse endereço, nem encontro novas informações do ano passado.
21712 Ryan
@ Ryan, não sei o que aconteceu. Eu sei que você pode tentar outros. Talvez você possa tentar: CircleCI ou verificar este tópico: Integração Contínua Hospedada para PHP?
13139 Michiel
@ Ryan, não, não é baixo, eu tenho usado isso por um tempo agora. Eles se mudaram para phptesting.org
omrakhur
6

Uso o servidor de integração contínua Bamboo da Atlassian para o meu principal projeto PHP (junto com outros produtos, como olho de peixe (navegação no repositório), jira (rastreador de problemas) e trevo (cobertura de código)).

Ele suporta SVN e agora suporta Git e possui uma ótima interface de usuário. Está disponível para linux, windows e mac e pode ser executado de forma independente em seu próprio servidor tomcat, o que é ótimo para pessoas (como eu) que não gostam de levar dias para configurar suas ferramentas). Embora possa parecer caro, sendo um desenvolvedor solitário, comprei a licença do kit inicial por 10 $ (10 $ por software). Isso é ótimo para equipes pequenas e vale a pena dar uma olhada.

Steven Rosato
fonte
Como você pode configurar o bambu para suportar phing? Atualmente, estou usando formiga, mas parece que o phing é mais apropriado para o depósito de php. Obrigado
Vincent
5

PHPTesting PHPCI Este é um bom servidor de integração contínua, construído em php.

Além disso, é de código aberto e gratuito. :)

tem número de plugins ..

O PHPCI inclui plugins de integração para:

  • Atoum
  • Behat
  • Fogueira
  • Codecepção
  • Compositor
  • O email
  • Grunhido
  • IRC
  • PHP
  • Lint
  • MySQL
  • PDepend
  • PostgreSQL
  • Sniffer de código PHP
  • Detector de Copiar / Colar PHP
  • Especificações do PHP
  • Unidade PHP
  • Comandos do Shell
  • Tar / Zip
MarmiK
fonte
Embora eu goste do PHPCI, não o recomendo. É incrivelmente buggy e não confiável. É triste que a funcionalidade básica comum não esteja sendo testada adequadamente, portanto, coisas básicas como adicionar um URL do projeto são difíceis sem atrapalhar.
Tek
@Tek, qual é a sua estratégia de CI para PHP?
Omrakhur 25/05
1
@omrakhur Infelizmente, estou preso ao PHPCI. Todo o outro software é muito mais volumoso e leva muito a configurar. Tudo tem seus prós e contras. Você apenas tem que ir com o que funciona melhor para você.
Tek
3

Eu sou principalmente um administrador de sistemas, mas às vezes eu codigo PHP também. Como um projeto paralelo, criei alguns scripts que tornarão simples e indolor a configuração de um ambiente completo de CI de PHP usando Jenkins. Ele também executa um projeto de amostra para que você possa ver como cada etapa da construção está configurada.

Se você quiser experimentar, tudo o que precisa é de uma caixa Debian / Ubuntu e acesso ao shell.

http://yauh.de/articles/379/setting-up-a-ci-environment-for-php-projects-using-jenkins-ci

Atualizar Para adicionar algum conteúdo à minha resposta:

Você pode simplesmente configurar um CI Jenkins para PHP usando o Ansible. Desde a v1.4, ele suporta funções que você pode baixar do site da comunidade galaxy.ansibleworks.com e fará o trabalho pesado para você. É chamado jenkins-php .

Stephan
fonte
3

Eu sugeriria o uso de Jenkins http://jenkins-ci.org/ seja gratuito e de código aberto.

É bastante simples de configurar, funciona em várias plataformas e se integra bem a outras ferramentas de integração contínua como o SonarQube (+ SQUALE) para medir dívidas técnicas e Tucídides para automação de testes.

Eu sugiro usar o GIT ou o GIT Hub para controle de versão em vez do SVN. Do meu ponto de vista, é apenas um sistema de controle de versão melhor que o ajudará a escalar seus esforços de desenvolvimento posteriormente.

Como você trabalha principalmente com o projeto PHP, existem outras ferramentas que você pode usar.

PHPUnit - Para teste de unidade

PHP CodeSniffer - Verifique os padrões de codificação

Dependência do PHP - Mostra suas dependências de código PHP

XDEBUG - Para teste de desempenho

Todas essas ferramentas são acionadas com um trabalho Jenkins e ajudam na qualidade e no desempenho do seu código.

Boa sorte e divirta-se!

AgileDeveloper
fonte
3

Não uso muitos dos produtos, nem mesmo tipos de produtos que você usa, mas darei a você a minha experiência.

Eu executo um ambiente TEST em paralelo ao meu ambiente PROD. Não tenho testes locais em si. Se for muito difícil colocar tudo em um ambiente de teste real, corrijo meu processo de compilação. Não vejo sentido em testar localmente, pois os ambientes são diferentes. ATUALIZAÇÃO: A única coisa que faço localmente é executar "php -l" antes de carregar qualquer coisa. Pára os erros estúpidos.

O processo de construção funciona com o que estiver no espaço de trabalho atual, que inclui código não confirmado. Esta não é a xícara de chá de todo mundo, mas vou fazer o teste com muita frequência. Tudo é comprometido antes de ir para o PROD.

Parte do meu processo de criação (semelhante ao seu) cria dois arquivos META. Um contém as últimas (normalmente) 100 alterações e também fornece o número da lista de alterações atual. O mostra-me quais alterações estão instaladas. O outro contém o CLIENTSPEC (em termos do Perforce), que me mostra exatamente quais ramificações foram usadas nesta compilação. Juntos, eles me dão construções reproduzíveis.

Eu não construo diretamente no ambiente de destino, mas em uma área de preparação no servidor. Eu uso SSH, então isso faz sentido. Isso me dá algumas vantagens. Mais importante, evita a morte no meio de um grande upload. Também me fornece um local para armazenar arquivos META, e todos os arquivos de compilação são arquivados automaticamente (para que eu possa voltar diretamente para qualquer compilação). O script também registra a atualização (para que haja uma entrada no fluxo de logs e eu possa ver antes e depois) e chuta todos os daemons (eu uso daemontools para "svc -t"). Tudo isso é melhor na máquina de destino.

Uma outra questão são as alterações no banco de dados. Eu mantenho um script mestre do esquema do banco de dados, que eu atualizo toda vez que o esquema é alterado. Cada uma das alterações também entra em um script changes.sql, carregado com a construção na área de preparação. O script é executado como parte do script de instalação.

Phil Wallach
fonte
Obrigado pela sua contribuição Phil, esta é uma configuração muito, muito interessante e acho que posso usar partes disso. No entanto, no meu caso, muitas vezes não terei acesso SSH à extremidade remota, por isso preciso de muita "inteligência" localmente, e é por isso que acho que vou precisar de um produto de CI como Hudson.
Pekka
2

Recentemente, iniciei o mesmo tipo de processo e estou usando o Beanstalk para hospedagem svn.

Existem duas características bacanas nas contas pagas (a partir das 15h, acho):

  • A implantação permite que o usuário crie destinos FTP para servidores de armazenamento temporário e de produção, que podem ser implantados com o clique de um botão (incluindo a especificação de uma revisão e ramificação)
  • os webhooks permitem que o usuário configure um URL que é chamado em cada confirmação / implantação, passando por itens como número de revisão, descrição e usuário. Isso pode ser usado para atualizar documentos, executar testes de unidade e atualizar registros de alterações.

Tenho certeza de que existem outros servidores svn hospedados ou auto-hospedados com esses dois recursos, mas o beanstalk é o que eu tenho experiência e está funcionando muito, muito bem

Há também uma API, que imagino que poderia ser usada para integrar a implantação ainda mais ao seu processo.

Adam Hopkinson
fonte
Cheers @adam. Não estou procurando muito por serviços hospedados para isso, pois temo que eles sempre sejam limitados demais para o que eu preciso. Mas o que você diz parece interessante, e a API pode ser um ponto de conexão para o resto. Vou dar uma olhada nisso.
Pekka
Não se preocupe, pensei que você poderia dizer isso. Por favor, me convém por enquanto, já que não entendi muito bem o svn (e sou uma equipe individual), além disso, eles oferecem uma exportação de repo completa, se você quiser mudar.
Adam Hopkinson
2

Considere o fazend.com , uma plataforma de CI hospedada gratuita, que automatiza os procedimentos de configuração e instalação. Você não precisa configurar o controle de versão, o rastreamento de bugs, o servidor de CI, o ambiente de teste etc. Tudo é feito sob demanda.

yegor256
fonte
Mmm, isso parece muito interessante! Mas como eles sobrevivem? Vendo como tudo é grátis? Como eles pagam pelo servidor e pelas taxas do E3?
Pekka
@Pekka Este projeto é patrocinado por uma empresa de desenvolvimento de software, é por isso que o serviço é gratuito
yegor256