O documento descreve o processo de integração contínua para projetos PHP utilizando as ferramentas CruiseControl, phpUnderControl, PHPUnit, PHP_CodeSniffer e phpDocumentor. O resumo apresenta os principais pontos sobre como configurar e utilizar essas ferramentas para automatizar builds, execução de testes, análise de código e geração de relatórios e métricas.
4. “Integração Contínua é uma prática de desenvolvimento de
software em que membros de um time integram seu trabalho
frequentemente, normalmente cada membro faz integrações
diariamente, conduzindo a multiplas integrações diárias. Cada
integração é verificada por um build automático (incluindo
testes) para detectar erros o mais rápido possível.”
Martin Fowler
5. Cotidiano de um time de desenvolvimento:
Dev A Dev C
Repositório
(CVS, SVN, etc)
Dev B Dev D
6. Como detectar problemas de integração de maneira mais rápida?
Como descobrir se a alteração na tela X não causou problemas na
telaY?
Quanto maior o projeto…
Maior a complexidade…
Maior o reaproveitamento…
Maior a probabilidade de ocorrerem problemas na integração!
7. Script
Servidor de
Repositório Integração Contínua
(CVS, SVN, etc)
Feedback
Dev B Dev C
Dev D
8. Desenvolvedor publica suas modificações em qualquer sistema de
controle de versão (SVN, CVS, etc)
A partir de uma definição, o CruiseControl periodicamente procura
por modificações no código (config.xml)
Dispara um novo build (build.xml)
Captura e armazena os logs e artefatos gerados a partir do build
Publica o resultado do build e os artefatos gerados (web, email, etc)
9. Acelera a detecção de bugs
Reduz os riscos
Reduz o tempo de integração
Aumenta a confiança do time
Agiliza o feedback
Facilita o refactoring
10. O CruiseControl é um framework para a automatização
do processo de build
Inclue plugins de integração com diversas
ferramentas de controle de código
Prove interface web para visualização de relatórios
sobre os builds realizados
É gratuíto e de código aberto (BSD license)
12. O phpUnderControl é uma customização do CruiseControl
que permite a fácil integração de ferramentas de controle de
códigos PHP
phpDocumentor
PHPUnit
xDebug
PMD
PHP_CodeSniffer
13. Modifica mecanismos de publicação do
CruiseControl para que sejam mais focados a
projetos PHP
A partir dos logs gerados no build, gera os gráficos
para visualização das métricas
Provê interface (linha de comando) para o setup de
novos projetos a serem monitorados
14. Provê feedback
Documentação do código
Execução de testes
Cobertura dos testes (code coverage)
Métricas
▪ Complexidade
▪ Risco
▪ ...
Violação de padrões
15. Instalação CruiseControl
$ unzip cruisecontrol-bin-2.7.3.zip -d /opt
$ ln -s /opt/cruisecontrol-bin-2.7.3
/opt/cruisecontrol
$ /opt/cruisecontrol/cruisecontrol.sh
Algumas configurações de startup
podem ser configuradas neste arquivo
(JAVA_HOME, porta, etc)
16.
17. Instalação phpUnderControl
$ pear config-set preferred_stable beta
$ pear channel-discover components.ez.co
$ pear channel-discover pear.phpunit.de
$ pear install –alldeps phpunit/phpUnderControl
Aplica o patch na instalação do Cruise Control.
Não esquecer de adicionar os executáveis do
PHP_CodeSniffer, PHPUnit, phpDocumentor no PATH!!!
Todos disponíveis no diretório de binários do PHP (phpcs, phpunit, phpdoc)
24. Violação de padrões (PHP_CodeSniffer)
Possibilita ao desenvolvedor visualizar possíveis
violações no padrão de código adotado para a escrita
do projeto (PHP e JavaScript).
Suporta alguns padrões de escrita conhecidos (PEAR,
Zend, etc), mas existe a possibilidade de extensão
Integra com Zend Code Analyzer
27. Complexidade Ciclomática
Mede o número de caminhos independentes de
um método
Considera contruções if, for, &&, case, while, etc.
Interpretação
Maior complexidade leva a mais erros
Maior complexidade faz o teste mais difícil
28. CRAP (Change Risk Analysis and Predictions )
Estima o esforço/tempo para a alteração de uma
unidade de código
Considera a cobertura dos testes e a complexidade
▪ Menor cobertura => Maior risco
▪ Maior cobertura => Risco similar à complexidade
29. Criando um projeto de exemplo
$ /usr/local/php5/bin/phpuc example --project-name
conaphp /opt/cruisecontrol
Opção para criação de um projeto de
Nome do novo projeto exemplo e uma sub-opção para o
nome do projeto
Diretório de instação do
CruiseControl
30. Estrutura de diretórios
/opt/cruisecontrol
|-- artifacts
| |-- conaphp
| | |-- 20081008002858 Os artefatos gerados em cada build
| | | |-- api
| | | |-- coverage ficam arquivados para visualização
| | | `-- graph
| `-- project-abc futura
| `-- project-xyz
|-- config.xml
|-- cruisecontrol.sh
|-- logs
| |-- conaphp Arquivo monitorado pelo loop
| `-- project-abc
| `-- project-xyz principal do CruiseControl
|-- projects
|-- conaphp
| |-- build
| | |-- api
| | |-- coverage
|
|
| `-- logs
|-- build.xml
Arquivo de configuração do build do
|
|
`-- source
|-- src
projeto define as tarefas a serem
|
|
| `-- Math.php
`-- tests
executadas
| `-- MathTest.php
`-- project-abc
`-- project-xyz
31. Configuração do CruiseControl (config.xml)
<cruisecontrol>
… Nome projeto
<project name=quot;conaphpquot; buildafterfailed=quot;falsequot;>
<schedule interval=quot;300quot;> Agendamento
<ant anthome=quot;apache-ant-1.7.0“
buildfile=quot;projects/${project.name}/build.xmlquot;/>
</schedule>
…
<publishers>
<currentbuildstatuspublisher file=quot;logs/${project.name}/buildstatus.txtquot;/>
<artifactspublisher dir=quot;projects/${project.name}/build/api”
dest=quot;artifacts/${project.name}quot; subdirectory=quot;apiquot;/>
<artifactspublisher dir=quot;projects/${project.name}/build/coverage“
dest=quot;artifacts/${project.name}quot; subdirectory=quot;coveragequot;/>
<execute command=quot;/usr/local/php5/bin/phpuc
graph logs/${project.name} artifacts/${project.name}quot;/>
</publishers>
</project>
…
</cruisecontrol> Gera os gráficos
32. Configuração do Ant (build.xml)
Organização
▪ Project: é a tag raiz do build.xml, ele representa todo o projeto e só pode existir
um por buildfile.
▪ Target: é uma coleção de tarefas que desejamos aplicar em determinado
momento e encadeando junto com outras tarefas.
▪ Task: é uma tarefa que desejamos que seja feita dentro do target, o Ant já
disponibiliza tarefas prontas, porém é possível criar novas.
▪ Property: é um parâmetro em forma de nome-valor necessário para configurar
nossa aplicação.