Instalação do Jenkins e Phing para projetos PHP

Salve galera.

Desta vez vamos fazer algumas brincadeiras com uma ferramenta que citei há algum tempo aqui no blog: Jenkins! Este é um servidor de Integração Contínua (ou Continuous Integration para os ingleses de plantão), desenvolvido em Java, mas extremamente robusto e versátil para qualquer linguagem de programação. Vamos falar sobre a Instalação, Plugins, Detalhes em Jobs e Dicas adicionais.

Bom, antes de mais nada gostaria de agradecer ao Sebastian Bergmann pois este post é baseado em seu trabalho Template for Jenkins Jobs for PHP Projects, o qual deu muita simplicidade ao processo como todo – recomendo a leitura!

Só retomando: Jenkins é um servidor de Integração Contínua – uma ferramenta essencial para processos de desenvolvimento ágil[bb] que pode integrar diversas práticas de QA e outras ferramentas – automatizando builds de software… falei um pouco sobre isso em um post no passado.

Lembram da VM que criamos no ultimo post? Vamos usá-la para exemplificar o processo em um ambiente “remoto”. Vou supor que o hostname que criamos era dev, portanto podemos acessar nossa VM por http://dev.local.

Instalação do Jenkins

Vamos instalar o Jenkins diferentemente da maneira como sugeriu o Sebastian – uma maneira mais “ubuntu-way-of-life”. Na wiki do Jenkins encontrei este guia, que deixará o sistema[bb] melhor administrável para este nosso Ubuntu (o pacote por si só já cria usuário de sistema, scripts de (re)inicialização e parada e já coloca no start-up do SO, além da atualização também poder vir via apt). Peço somente que não faça (ainda) a parte “Setting up an Apache Proxy for port 80 -> 8080″. Depois de tudo setado, se quiser, pode fazer à vontade.

Se tudo deu certo você tem agora o Jenkins rodando e você pode aceesá-lo em http://dev.local:8080.

Plugins do Jenkins

Neste ponto você pode seguir o guia do Sebastian a partir de “Required Jenkins Plugins”, ou seja, você deve instalar alguns plugins do Jenkins para que quando nosso código chegar lá, já esteja tudo pronto – os plugins são: Checkstyle, Cloverphp, DRY, HtmlPublisher, jDepend, Plot, PMD, Violations e xUnit. Acrescente a lista o Phing – sim, vamos mudar um pouco a receita[bb] do tio Sebastian (odeio simplesmente copiar o trabalho alheio :D ).

Ferramentas PHP

Antes de instalar, vamos revisar o que vamos verificar em nossos projetos:

  • Testes Unitários – PHPUnit
  • Estilo de código – PHP_CodeSniffer
  • Código Duplicado (o famoso Ctrl+C, Ctrl+V – que pode criar pontos de evolução distintos para a mesma funcionalidade) – PHPCPD
  • Bagunça no código (buscamos aqui pontos de refatoração) – PHPMD
  • Medição e análise estrutural – PHPLoc
  • Diversas Métricas de Software, adicionais ao item anterior – PHP_Depend

Na instalação que fizemos de PHP contemplamos a PEAR/PECL (por isso instalamos o xdebug via pecl ;) ). Caso você não tenha instalado, faça isso – não dá pra continuar sem. Bom, tio Sebastian também deixou as coisas bem adiantadas e na seção “Required PHP Tools” do link de seu Template ele tem uma maneira muito boa de instalar todos de uma vez:

# pear upgrade PEAR;
# pear config-set auto_discover 1;
# pear install pear.phpqatools.org/phpqatools pear.netpirates.net/phpDox

Neste ponto você deve ter todas as ferramentas citadas logo acima. Mãããããss queremos o Phing para ser nosso construtor de Projetos… Para tal execute o seguinte:

# pear channel-discover pear.phing.info
# pear install -a phing/phing

Pronto. Phing também instalado. Não vou entrar em detalhes por enquanto sobre ele. Por hora basta saber que ele executará tarefas de maneira automatizada.

Configurando o Projeto

O Phing, assim como seu primo javeiro Ant, funciona a partir de um arquivo[bb] de descrição de build. Tio Sebastian preparou um para Ant, e aqui está um para Phing. Crie um arquivo build.xml na raiz de seu projeto com o conteúdo deste gist.

Vale atentar para as linhas de 6 a 8 – nelas configuramos os diretórios principais para nosso build.
Também para o target na linha 72, onde configuramos o codesniffer para o padrão de código do Symfony2 … mas este não está na lista default de padrões do phpcs que tem entre outros os padrões PEAR E Zend). O que não nos impede de adicionar padrões – e instalei o padrão do Symfony2 usando este projeto.
Por ultimo, mas não menos importante, estou supondo que sua suíte[bb] de testes se utilize de um bootstrap(.php) E um (phpunit.)xml de configuração. Adicionalmente ao template do Sebastian eu coloquei uma verificação: se o xdebug estiver instalado (no caso de nossa VM está) vamos executar o teste completo com relatórios de cobertura[bb], senão somente a execução dos testes unitários.

Usando o Template de Job (adaptação)

  1. Realize o checkout do template no diretório de jobs do Jenkins
    # cd /var/lib/jenkins/jobs
    # git clone git://github.com/sebastianbergmann/php-jenkins-template.git php-template
    # chown -R jenkins:nogroup php-template/
  2. Reinicie o Jenkins
    # /etc/init.d/jenkins restart
  3. Vá para a interface web do Jenkins (se você ainda não mudou nada deve estar em http://<hostname>.local:8080) e clique em “New Job”
  4. Insira um nome de Job (Job Name)
  5. Selecione “Copy Existing Job” e insira no input que aparece “php-template”
  6. Clique em OK
  7. Entre no projeto (se já não estiver nele) e acesse a opção “configure”
  8. Desabilite a opção “Disable Job”
  9. Configure o Job para seu controle de versão (Source Code Management) (há plugins dos mais variados, inclusive um plugin que utiliza um filesystem sem controle de versão -  para o GIT eu precisei instalar adicionalmente os plugins Jenkins Git e Git Parameter)
  10. Configure o Build Trigger – por hora use o Poll SCM (agendamento do “fetch” do SCM)
  11. Em Build, exclua o item “ant” e em “Add Build Step” selecione “Invoke Phing Targets” e depois selecione a Versão default do Phing
  12. Clique em Save

Para não dizer que sou egoísta ou algo do genero, eu peguei um projeto do qual nem participo, mas conheço muito bem o mentor, para testar isso tudo. Conhecem o Respect? Pois bem, ele foi minha cobaia… e como era de se esperar … tudo deu muito certo! Seguem algumas capturas:

Onde pode ocorrer problemas? Permissionamento – verifique se o Jenkins tem acesso ao projeto.

O Jenkins tem também muitos truques na manga. o Jogo de Integração Contínua (onde quem melhora mais o software ganha mais pontos – brincadeira que pode motivar uma equipe a melhorar o próprio trabalho), Ferramentas mil no tocante a distribuição do software, entre tantas outras coisas… você vai perder um tempo só analisando os plugins disponíveis.

Lógico que este post não se direciona somente a quem utiliza VMs ou quem configurou uma pelo artigo anterior. Com poucos ajustes você pode levantar um Jenkins em qualquer lugar.

O Phing será meu próximo assunto – uma poderosíssima ferramenta sem sombra de dúvida.

Dúvidas? Comentários? a ultima seção desta página serve para isso!

Até o próximo post

Sobre Duodraco

Atuo como Team Leader e Scrum Master no PHP Team na área de Desenvolvimento da Arizona - realizando produtos robustos e ágeis para o mercado de premídia e marketing. Sou também co-fundador e ativista do PHPSP (Grupo de Desenvolvedores PHP de São Paulo), Anfitrião do PHPUBSP, além de contribuidor/entusiasta de muitos projetos opensource em PHP, além de participar palestrando em eventos relacionados à linguagem. Ainda falando de opensource, sou usuário Opensuse e KDE, colaborando com bug/crash reports para estes dois. Óbvio que também uso outras linguagens como Javascript, Java, C++/Qt entre outras...
Esta entrada foi publicada em agile, desenvolvimento, php, QA e marcada com a tag , . Adicione o link permanente aos seus favoritos.
  • http://www.facebook.com/adlermedrado Adler Brediks Medrado

    Cara, seu post está excelente. Parabéns.
    Eu estou usando o Jenkins praticamente da mesma maneira que você com excessão do Phing, pois eu uso o ant.

    Me diga uma coisa, o uso do Phing melhorou alguma coisa ou somente elevou o grau de pureza do processo aí?

    Abração.

    • duodraco

      Grande Adler!
      Bom, num primeiro momento o aumento de PHPureza é evidente! Outro ponto favorável é que podemos utilizar o mesmo build.xml, com novos targets para realizar o deploy de fato – e neste caso não precisamos de coisas não-php no servidor de homologação/produção, deixando a máquina enxuta sempre. Com relação a performance não fui muito a fundo, mas imagino que o consumo de memória deva ser maior com o ant.

      Abração 

  • Daniel Jesus

    Ow muito bacana o post, e gostei do novo tema do blog.
    A propósito bem que vc podia levar os assuntos sobre jenkins e etc para o PUB.

    Abraço

  • http://twitter.com/tiagobutzke Tiago

    Muito bom. Obrigado. 
    Foi de grande ajuda.

    Tive dificuldades apenas por atualizar do Hudson pro Jenkins. E tava dando pau na hora do build, mas depois descobri que era incompatibilidade com alguns plugins.
    Então removi tudo, reinstalei o Jenkins e tudo correu tranquilo.

    Abrs,

  • http://twitter.com/fernandomantoan Fernando Mantoan

    Muito bom seu post, parabéns.

    Anos atrás eu tentava utilizar o Phing com o Jenkins, na época Hudson. Uma das coisas que eu mais sentia falta era a gestão de dependências. Hoje o Composer supre essa lacuna que na época era bem difícil de se resolver, principalmente com soluções como o PEAR. O que tentei fazer foi integrar Jenkins, Phing e Maven, o que resultou em uma solução um tanto quanto sem performance e deselegante. 
    Acredito que agora Jenkins + Phing + Composer se torna uma solução perfeita para integração contínua e gerenciamento de dependências.

  • http://twitter.com/fernandomantoan Fernando Mantoan

    Ops, postei duas vezes sem querer, pode remover esse comentário. Att.

  • http://www.facebook.com/cirobsb.br Ciro Vargas

    po muito bom, vários outros tutoriais ‘supõe’ que voce já sabe tudo e não diz nada pra quem ta aprendendo, voce recomenda alguns tutoriais bem básicos mesmo para testes em php? (não sei nada)

  • Walker de Alencar Oliveira

    Excelente post!

    Parabéns pelo conteúdo :)

    Estou usando como apoio para finalizar um ambiente, Assim que publicá-lo reporto.

    Abraços.

  • Flávio Ferreira

    Achei interessante, consegui criar a VM ubuntu.
    Instalar todo o ambiente, consegui instalar o Jenkins, instalei o Phing, mas em alguns pontos eu empaco. Na criação de um novo job (Não me aparece “Invoke Phing Targets”)

    Se possível, organiza um screencast só para esclarecer os passos.

  • Esmeralda Torcida

    Sera que algem pode me ajudar antender como instalar plagin da ferramenta de cobertura Jacoco no Jenkins?