Integração Contínua com Cruise Control e phpUnderControl

Post on 07-Dec-2014

3.632 views 3 download

description

Palestra feita no PHPConference 2008

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: diegotremper@gmail.com

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/