integração contínua com cruisecontrol e phpundercontrol
DESCRIPTION
Palestra apresentada no Latinoware 2008TRANSCRIPT
Integração Contínua Cenário Vantagens
CruiseControl Instalação Arquitetura
phpUnderControl Instalação Funcionamento Ambiente
▪ Estatísticas▪ Execução de Testes▪ Documentação▪ Violação de Padrões▪ Code Coverage▪ Métricas
Prática
“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
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!
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)
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
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)
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
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
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
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 startuppodem ser configuradas neste arquivo(JAVA_HOME, porta, etc)
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 doPHP_CodeSniffer, PHPUnit, phpDocumentor no PATH!!!Todos disponíveis no diretório de binários do PHP (phpcs, phpunit, phpdoc)
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
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
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
$ /usr/local/php5/bin/phpuc example --project-name colaphp /opt/cruisecontrol
Criando um projeto de exemplo
Opção para criação de um projeto de exemplo e uma sub-opção para o nome do projeto
Diretório de instação doCruiseControl
Nome do novo projeto
/opt/cruisecontrol|-- artifacts| |-- colaphp| | |-- 20081008002858| | | |-- api| | | |-- coverage| | | `-- graph| `-- project-abc| `-- project-xyz|-- config.xml|-- cruisecontrol.sh|-- logs| |-- colaphp| `-- project-abc| `-- project-xyz|-- projects
|-- colaphp| |-- build| | |-- api| | |-- coverage| | `-- logs| |-- build.xml| `-- source| |-- src| | `-- Math.php| `-- tests| `-- MathTest.php`-- project-abc`-- project-xyz
Arquivo monitorado pelo loop principal do CruiseControl
Arquivo de configuração do build do projeto define as tarefas a serem executadas
Os artefatos gerados em cada build ficam arquivados para visualização futura
Estrutura de diretórios
Configuração do CruiseControl (config.xml)<cruisecontrol>…<project name="colaphp" buildafterfailed="false">
<schedule interval="300"><ant anthome="apache-ant-1.7.0“
buildfile="projects/${project.name}/build.xml"/></schedule>…<publishers>
<currentbuildstatuspublisher file="logs/${project.name}/buildstatus.txt"/><artifactspublisher dir="projects/${project.name}/build/api”
dest="artifacts/${project.name}" subdirectory="api"/><artifactspublisher dir="projects/${project.name}/build/coverage“
dest="artifacts/${project.name}" subdirectory="coverage"/><execute command="/usr/local/php5/bin/phpuc \
graph logs/${project.name} artifacts/${project.name}"/></publishers>
</project>…</cruisecontrol> Gera os gráficos
Agendamento
Nome projeto
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.
Configuração do Ant (build.xml)<project name="colaphp" default="build" basedir=".">
<property name=“src” value=“${basedir}/src” /><property /><property />
<target name=“build” depends=“checkout”><task /><task />
</target>
<target name=“checkout” ><echo>Baixando código do repositório…</echo><task />
</target>
</project>
Configuração do Ant (build.xml)<project name="colaphp" default="build" basedir=".">
<target name="build" depends="php-documentor,php-codesniffer,phpunit"/><target name="php-documentor">
<exec executable="phpdoc" dir="${basedir}/source" logerror="on"><arg line="--title '${ant.project.name}' -ue on -t ${basedir}/build/api \
-d src -tb '/usr/local/php5/lib/php/data/phpUnderControl/data/phpdoc' \-o HTML:Phpuc:phpuc"/>
</exec></target><target name="php-codesniffer">
<exec executable="phpcs" dir="${basedir}/source“output="${basedir}/build/logs/checkstyle.xml“error="/tmp/checkstyle.error.log">
<arg line="--report=checkstyle --standard=PEAR src"/></exec>
</target>
…
Configuração do Ant (build.xml)..
<target name="phpunit"><exec executable="phpunit" dir="${basedir}/source" failonerror="on">
<arg line=" --log-xml ${basedir}/build/logs/phpunit.xml \--log-pmd ${basedir}/build/logs/phpunit.pmd.xml \--log-metrics ${basedir}/build/logs/phpunit.metrics.xml \--coverage-xml ${basedir}/build/logs/phpunit.coverage.xml \--coverage-html ${basedir}/build/coverage \PhpUnderControl_Example_MathTest tests/MathTest.php"/>
</exec></target>
</project>
Obrigado!!!
Contato: [email protected]: http://www.linkedin.com/in/diegotremper
Blog: http://www.diegotremper.com
http://www.diegotremper.com http://cruisecontrol.sourceforge.net/ http://ant.apache.org/ http://www.phpundercontrol.org/ http://www.phpunit.de/ http://pear.php.net/package/PHP_CodeSniffe
r http://www.phpdoc.org/