SlideShare a Scribd company logo
1 of 38
Download to read offline
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
Cotidiano de um time de desenvolvimento:




         Dev A                                   Dev C




                                 Repositório
                               (CVS, SVN, etc)



          Dev B                                  Dev D
   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!
Script
                                      Servidor de
          Repositório             Integração Contínua
        (CVS, SVN, etc)




                                      Feedback
Dev B                     Dev C
               Dev D
   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 startup
        podem 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 do
  PHP_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
Criando um projeto de exemplo
   $ /usr/local/php5/bin/phpuc example --project-name
      phpconference2008 /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
Estrutura de diretórios
/opt/cruisecontrol
|-- artifacts
|
|
    |-- phpconference2008
    |   |-- 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
                                       Arquivo de configuração do build do
    |
    |
           |-- build.xml
           `-- source
                                       projeto define as tarefas a serem
    |
    |
               |-- src
               |   `-- Math.php
                                       executadas
    |          `-- tests
    |              `-- MathTest.php
    `-- project-abc
    `-- project-xyz
   Configuração do CruiseControl (config.xml)
<cruisecontrol>
 …                                                      Nome projeto
 <project name=“phpconference2008quot; 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
   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=“phpconference2008quot; default=quot;buildquot; basedir=quot;.quot;>

     <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=“phpconference2008quot; default=quot;buildquot; basedir=quot;.quot;>
  <target name=quot;buildquot; depends=quot;php-documentor,php-codesniffer,phpunitquot;/>
  <target name=quot;php-documentorquot;>
    <exec executable=quot;phpdocquot; dir=quot;${basedir}/sourcequot; logerror=quot;onquot;>
      <arg line=quot;--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:phpucquot;/>
    </exec>
  </target>
  <target name=quot;php-codesnifferquot;>
    <exec executable=quot;phpcsquot; dir=quot;${basedir}/source“
         output=quot;${basedir}/build/logs/checkstyle.xml“
         error=quot;/tmp/checkstyle.error.logquot;>
      <arg line=quot;--report=checkstyle --standard=PEAR srcquot;/>
    </exec>
  </target>

…
    Configuração do Ant (build.xml)
..
  <target name=quot;phpunitquot;>
    <exec executable=quot;phpunitquot; dir=quot;${basedir}/sourcequot; failonerror=quot;onquot;>
      <arg line=quot; --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.phpquot;/>
    </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/

More Related Content

What's hot

XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - Brazil
Stephen Chin
 

What's hot (20)

Curso de Grails
Curso de GrailsCurso de Grails
Curso de Grails
 
Precisamos falar sobre Gradle
Precisamos falar sobre GradlePrecisamos falar sobre Gradle
Precisamos falar sobre Gradle
 
Ionic 2/3 + Firebase
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + Firebase
 
Groovy grails
Groovy grailsGroovy grails
Groovy grails
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - Brazil
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
 
Maven introdução Muito Rápida
Maven introdução Muito RápidaMaven introdução Muito Rápida
Maven introdução Muito Rápida
 
Introdução ao maven
Introdução ao mavenIntrodução ao maven
Introdução ao maven
 
Maven na prática
Maven na práticaMaven na prática
Maven na prática
 
Aula maven
Aula   mavenAula   maven
Aula maven
 
Grails
GrailsGrails
Grails
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN Stack
 
Curso de Groovy
Curso de GroovyCurso de Groovy
Curso de Groovy
 
Introdução a Grails: Um framework veloz e poderoso
Introdução a Grails: Um framework veloz e poderosoIntrodução a Grails: Um framework veloz e poderoso
Introdução a Grails: Um framework veloz e poderoso
 
Maven em 10 minutos
Maven em 10 minutosMaven em 10 minutos
Maven em 10 minutos
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Grails
GrailsGrails
Grails
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 

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

Desenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHPDesenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHP
elliando dias
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04
Carlos Santos
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript
Carlos Santos
 
Desenvolvimento em .Net - Introducao A Framework
Desenvolvimento em .Net - Introducao A FrameworkDesenvolvimento em .Net - Introducao A Framework
Desenvolvimento em .Net - Introducao A Framework
Vitor Silva
 

Similar to Integração Contínua com Cruise Control e phpUnderControl (20)

Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControl
 
Construindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e DockerConstruindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e Docker
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo real
 
Desenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHPDesenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHP
 
Python 08
Python 08Python 08
Python 08
 
Performance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkPerformance de verdade com Phalcon Framework
Performance de verdade com Phalcon Framework
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04
 
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
 
Palestra parse
Palestra parsePalestra parse
Palestra parse
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript
 
Desenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIDesenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLI
 
Integração continua sem traumas
Integração continua sem traumasIntegração continua sem traumas
Integração continua sem traumas
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHP
 
Dockerizando aplicações em uma fintech o bom, o mau e o feio as surpresas
Dockerizando aplicações em uma fintech  o bom, o mau e o feio as surpresasDockerizando aplicações em uma fintech  o bom, o mau e o feio as surpresas
Dockerizando aplicações em uma fintech o bom, o mau e o feio as surpresas
 
Android
AndroidAndroid
Android
 
Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
Construção e provisionamento de ambientes de desenvolvimento virtualizados
Construção e provisionamento de ambientes  de desenvolvimento virtualizadosConstrução e provisionamento de ambientes  de desenvolvimento virtualizados
Construção e provisionamento de ambientes de desenvolvimento virtualizados
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Debug de cabo a rabo
Debug de cabo a raboDebug de cabo a rabo
Debug de cabo a rabo
 
Desenvolvimento em .Net - Introducao A Framework
Desenvolvimento em .Net - Introducao A FrameworkDesenvolvimento em .Net - Introducao A Framework
Desenvolvimento em .Net - Introducao A Framework
 

Recently uploaded

Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
Natalia Granato
 

Recently uploaded (6)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 

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

  • 2. Diego Tremper  Zend Certified Engineer  Entusiasta PHP  Estudante
  • 3. Integração Contínua  CruiseControl  phpUnderControl  PHPUnit  phpDocumentor  PHP_CodeSniffer  Métricas  Prática
  • 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 de 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)
  • 11. Arquitetura
  • 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 manutenção de projetos 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)
  • 18. Instalação phpUnderControl $ /usr/local/php5/bin/phpuc install /opt/cruisecontrol
  • 19. Lista de projetos monitorados
  • 20.
  • 24. 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
  • 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 phpconference2008 /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 | | |-- phpconference2008 | |-- 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 Arquivo de configuração do build do | | |-- build.xml `-- source projeto define as tarefas a serem | | |-- src | `-- Math.php executadas | `-- tests | `-- MathTest.php `-- project-abc `-- project-xyz
  • 31. Configuração do CruiseControl (config.xml) <cruisecontrol> … Nome projeto <project name=“phpconference2008quot; 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.
  • 33. Configuração do Ant (build.xml) <project name=“phpconference2008quot; default=quot;buildquot; basedir=quot;.quot;> <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>
  • 34. Configuração do Ant (build.xml) <project name=“phpconference2008quot; default=quot;buildquot; basedir=quot;.quot;> <target name=quot;buildquot; depends=quot;php-documentor,php-codesniffer,phpunitquot;/> <target name=quot;php-documentorquot;> <exec executable=quot;phpdocquot; dir=quot;${basedir}/sourcequot; logerror=quot;onquot;> <arg line=quot;--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:phpucquot;/> </exec> </target> <target name=quot;php-codesnifferquot;> <exec executable=quot;phpcsquot; dir=quot;${basedir}/source“ output=quot;${basedir}/build/logs/checkstyle.xml“ error=quot;/tmp/checkstyle.error.logquot;> <arg line=quot;--report=checkstyle --standard=PEAR srcquot;/> </exec> </target> …
  • 35. Configuração do Ant (build.xml) .. <target name=quot;phpunitquot;> <exec executable=quot;phpunitquot; dir=quot;${basedir}/sourcequot; failonerror=quot;onquot;> <arg line=quot; --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.phpquot;/> </exec> </target> </project>
  • 37. Obrigado!!! Contato: diegotremper@gmail.com LinkedIn: http://www.linkedin.com/in/diegotremper Blog: http://www.diegotremper.com
  • 38. 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/