integração contínua com cruise control e phpundercontrol

38
PHP Conference 2008

Upload: diegotremper

Post on 07-Dec-2014

3.632 views

Category:

Technology


3 download

DESCRIPTION

Palestra feita no PHPConference 2008

TRANSCRIPT

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

PHP Conference 2008

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

Diego Tremper

Zend Certified Engineer

Entusiasta PHP

Estudante

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

Integração Contínua

CruiseControl

phpUnderControl

PHPUnit

phpDocumentor

PHP_CodeSniffer

Métricas

Prática

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

“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

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

Repositório(CVS, SVN, etc)

Dev A

Dev B

Dev C

Dev D

Cotidiano de um time de desenvolvimento:

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

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!

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

Repositório(CVS, SVN, etc)

Dev B Dev CDev D

Feedback

ScriptServidor de

Integração Contínua

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

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)

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

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

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

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)

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

Arquitetura

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

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

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

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

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

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

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

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)

Page 16: Integração Contínua com Cruise Control e phpUnderControl
Page 17: Integração Contínua com Cruise Control e phpUnderControl

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)

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

Instalação phpUnderControl$ /usr/local/php5/bin/phpuc install /opt/cruisecontrol

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

Lista de projetos monitorados

Page 20: Integração Contínua com Cruise Control e phpUnderControl
Page 21: Integração Contínua com Cruise Control e phpUnderControl

Execução de testes

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

Documentação do Código

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

Violação de padrões

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

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

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

Cobertura dos testes

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

Métricas

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

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

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

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

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

$ /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

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

/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

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

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

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

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.

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

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>

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

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>

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

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>

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

Perguntas?

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

Obrigado!!!

Contato: [email protected]

LinkedIn: http://www.linkedin.com/in/diegotremper

Blog: http://www.diegotremper.com

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

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/