Depois de algum tempo sem escrever sobre desenvolvimento web resolvi fazer uma pequena série de artigos para realizar uma experiência com meus alunos. O primeiro é este: Integração contínua (ou integração continuada) em PHP.
Integração contínua é uma daquelas coisas que todo mundo sabe o que é, mas ninguém sabe explicar. Aqui e agora, vamos entender isto como sendo: Uma série de operações automatizadas, a serem realizadas sobre o código, antes da entrega final, de forma contínua e constante. Bonito? Em outras palavras, vamos automatizar o processo de entrega, verificação, padronização, controle de versão e documentação do código para que os pobres programadores possam ficar concentrados em programar. Melhorou?
Começaremos como Xinc (http://code.google.com/p/xinc/) trata-se de um servidor de integração continuada. Ele já é integrado com o Subversion (http://tigris.subversion.org) para controle de versão, com o Phing (http://phing.info/) um sistema de automação de entrega e, graças a este último, com o PHPunit (https://github.com/sebastianbergmann/phpunit/) um framework para testes. O Xinc é o servidor de integração do PHP por excelência, mas, não é a única solução. Podemos, por exemplo, usar o Hudson (http://hudson-ci.org/) que, apesar de ser desenvolvido em Java (arrrrgh!!!) tem uma interface mais amigável e uma curva de aprendizado menor.
Uma vez decidido ou servidor de integração resta-nos escolher as bibliotecas e funções que usaremos para documentar, padronizar e corrigir o código antes de entregar. Neste quesito o PHP impera…
PHPDocumentor, a ferramenta de documentação do PHP. Se você sabe codificar, também sabe comentar. Acho que foi o Knuth que disse: O código é um livro que executa. O PHPDoc é a mais antiga e mais usada ferramenta de documentação de código PHP. Eu tenho usado o PHP DOX simplesmente por que gosto de testar coisas novas.
PHPUnit, citada acima, é a versão PHP do xUnit um dos melhores frameworks de testes disponíveis no mercado, que permite a execução de testes automatizados no código, além de possuir uma “linguagem” específica para a criação destes testes e avaliação de resultados. Além de testar e indicar os erros o PHPUnit pode ser configurado para gerar um relatório de erros. Este relatório será indispensável para o acompanhamento da integração continuada.
PHP Code Sniffer, analisa o código em busca de violações no padrão de codificação. Ou seja, garante que o código guardado no Subversion, atende os padrões pré-estabelecidos de codificação e, consequentemente, é de leitura fácil. Já vem com os padrões usados pela Zend e pelo pessoal do PEAR.
PHP Depend, realiza uma análise estática do código para a geração de métricas de codificação. Use-o para analisar a qualidade, e complexidade, do código. Se seu projeto é grande, esta ferramenta merece sua atenção.
PHPMD (ou detector de bagunça em PHP) usa as mesmas métricas do PHPDepend e, assim como ele, faz uma análise do código e indica o grau de entropia (desordem, bagunça) do seu código.
PHPCPD (detector de copia e cola). Quantas partes do seu código são apenas copiadas e coladas? Será que não seria possível criar uma função ou classe para estas partes. Esta ferramenta vai analisar o código e indicar trechos candidatos para substituição.
PHPDCD (detector de código morto), varre seu código atrás de métodos e funções definidas, mas nunca usadas. Reduzindo o tempo de manutenção do código e de interpretação. Mas de uma vez assisti desenvolvedores perdendo dias de manutenção para corrigir uma função que nunca seria usada. Não é comum em projetos pequenos onde um ou dois desenvolvedores cuidam de todo o código, mas em projetos grandes, isso acontece toda hora.
Coloquei as ferramentas na ordem em que devem ser chamadas. Você terá que estudar cada uma delas, para ver como criar e analisar os relatórios. Além disso, deverá criar um script no servidor de integração escolhido para enviar este código para o cliente. Talvez, dependendo do tamanho do seu projeto e da demanda do seu servidor, seja necessário incluir um ou dois passos para limpar, verificar, mesclar e comprimir javascript e css o Minify pode ajudar aqui.