Integração Contínua com Cruise Control e phpUnderControl
-
Upload
diegotremper -
Category
Technology
-
view
3.632 -
download
3
description
Transcript of Integração Contínua com Cruise Control e phpUnderControl
PHP Conference 2008
Diego Tremper
Zend Certified Engineer
Entusiasta PHP
Estudante
Integração Contínua
CruiseControl
phpUnderControl
PHPUnit
phpDocumentor
PHP_CodeSniffer
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
Repositório(CVS, SVN, etc)
Dev A
Dev B
Dev C
Dev D
Cotidiano de um time de desenvolvimento:
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 de integração!
Repositório(CVS, SVN, etc)
Dev B Dev CDev D
Feedback
ScriptServidor de
Integração Contínua
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)
Arquitetura
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
manutenção de projetos 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)
Instalação phpUnderControl$ /usr/local/php5/bin/phpuc install /opt/cruisecontrol
Lista de projetos monitorados
Execução de testes
Documentação do Código
Violação de padrões
Violação de padrões
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
Cobertura dos testes
Métricas
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
phpconference2008 /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
| |-- phpconference2008
| | |-- 20081008002858
| | | |-- api
| | | |-- coverage
| | | `-- graph
| `-- project-abc
| `-- project-xyz
|-- config.xml
|-- cruisecontrol.sh
|-- logs
| |-- conaphp
| `-- project-abc
| `-- project-xyz
|-- projects
|-- conaphp
| |-- 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=“phpconference2008" 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=“phpconference2008" 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=“phpconference2008" 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>
Perguntas?
Obrigado!!!
Contato: [email protected]
LinkedIn: 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_CodeSniffer
http://www.phpdoc.org/