SlideShare uma empresa Scribd logo
1 de 38
Baixar para ler offline
Latinoware 2008
   Diego Tremper
   Zend Certified Engineer
   Entusiasta PHP
   Palestrante
   Estudante
   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
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 na 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 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 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
Estatísticas de build
Execução de testes (PHPUnit)
Documentação (phpDocumentor)
Violação de padrões (PHP_CodeSniffer)
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
Code Coverage (PHPUnit + xDebug)
Métricas (PHPUnit + PMD)
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
     colaphp /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
|   |-- colaphp
|   |   |-- 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
|   |-- colaphp                    Arquivo monitorado pelo loop
|   `-- project-abc
|   `-- project-xyz                principal do CruiseControl
|-- projects
    |-- colaphp
    |   |-- build
    |   |   |-- api
    |   |   |-- coverage
    |
    |
        |   `-- logs
        |-- build.xml
                                    Arquivo de configuração do build do
    |
    |
        `-- source
            |-- src
                                    projeto define as tarefas a serem
    |
    |
            |   `-- Math.php
            `-- tests
                                    executadas
    |           `-- MathTest.php
    `-- project-abc
    `-- project-xyz
   Configuração do CruiseControl (config.xml)
<cruisecontrol>
 …                                                      Nome projeto
 <project name=quot;colaphpquot; 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=quot;colaphpquot; 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=quot;colaphpquot; 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_CodeSniffe
  r
 http://www.phpdoc.org/

Mais conteúdo relacionado

Mais procurados

Oficina groovy grails - infoway
Oficina  groovy grails - infowayOficina  groovy grails - infoway
Oficina groovy grails - infowayLucas Aquiles
 
Dockerizando aplicações em uma Fintech
Dockerizando aplicações em uma FintechDockerizando aplicações em uma Fintech
Dockerizando aplicações em uma FintechRafael Gomes
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - BrazilStephen Chin
 
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 poderosoBruno Lopes
 
Maven 3, Sonar e Hudson
Maven 3, Sonar e HudsonMaven 3, Sonar e Hudson
Maven 3, Sonar e HudsonRodrigo Branas
 
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANTAutomação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANTelliando dias
 
Ionic 2/3 + Firebase
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + FirebaseBruno Catão
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeRafael Benevides
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11Cezar Souza
 
Integração Contínua com CVS, CruiseControl, AntHill, Gump
Integração Contínua com CVS, CruiseControl, AntHill, GumpIntegração Contínua com CVS, CruiseControl, AntHill, Gump
Integração Contínua com CVS, CruiseControl, AntHill, GumpDenis L Presciliano
 

Mais procurados (20)

Oficina groovy grails - infoway
Oficina  groovy grails - infowayOficina  groovy grails - infoway
Oficina groovy grails - infoway
 
Web Offline
Web OfflineWeb Offline
Web Offline
 
Maven introdução Muito Rápida
Maven introdução Muito RápidaMaven introdução Muito Rápida
Maven introdução Muito Rápida
 
Dockerizando aplicações em uma Fintech
Dockerizando aplicações em uma FintechDockerizando aplicações em uma Fintech
Dockerizando aplicações em uma Fintech
 
Maven na prática
Maven na práticaMaven na prática
Maven na prática
 
Groovy grails
Groovy grailsGroovy grails
Groovy grails
 
Introdução ao maven
Introdução ao mavenIntrodução ao maven
Introdução ao maven
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - Brazil
 
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
 
Aula maven
Aula   mavenAula   maven
Aula maven
 
Mean Stack
Mean StackMean Stack
Mean Stack
 
Maven em 10 minutos
Maven em 10 minutosMaven em 10 minutos
Maven em 10 minutos
 
Maven 3, Sonar e Hudson
Maven 3, Sonar e HudsonMaven 3, Sonar e Hudson
Maven 3, Sonar e Hudson
 
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANTAutomação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
Automação no ambientAutomação no ambiente de desenvolvimento com Maven e ANT
 
Ionic 2/3 + Firebase
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + Firebase
 
Maven
MavenMaven
Maven
 
Grails
GrailsGrails
Grails
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11
 
Integração Contínua com CVS, CruiseControl, AntHill, Gump
Integração Contínua com CVS, CruiseControl, AntHill, GumpIntegração Contínua com CVS, CruiseControl, AntHill, Gump
Integração Contínua com CVS, CruiseControl, AntHill, Gump
 

Destaque

General content customer presentation amplify teams
General content customer presentation amplify teamsGeneral content customer presentation amplify teams
General content customer presentation amplify teamsXavier Baez Gutierrez
 
Zf Zend Db by aida
Zf Zend Db by aidaZf Zend Db by aida
Zf Zend Db by aidawaraiotoko
 
Learn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionLearn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionIn a Rocket
 
SEO: Getting Personal
SEO: Getting PersonalSEO: Getting Personal
SEO: Getting PersonalKirsty Hulse
 
How to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media PlanHow to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media PlanPost Planner
 

Destaque (6)

Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
General content customer presentation amplify teams
General content customer presentation amplify teamsGeneral content customer presentation amplify teams
General content customer presentation amplify teams
 
Zf Zend Db by aida
Zf Zend Db by aidaZf Zend Db by aida
Zf Zend Db by aida
 
Learn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionLearn BEM: CSS Naming Convention
Learn BEM: CSS Naming Convention
 
SEO: Getting Personal
SEO: Getting PersonalSEO: Getting Personal
SEO: Getting Personal
 
How to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media PlanHow to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media Plan
 

Semelhante a Integração Contínua com CruiseControl e phpUnderControl

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 phpUnderControlManuel Lemos
 
Desenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHPDesenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHPelliando dias
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04Carlos Santos
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo realEvandro Silvestre
 
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 DockerWellington Marinho
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScriptCarlos Santos
 
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorPlay Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorAllyson Barros
 
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 FrameworkPablo Dall'Oglio
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Integração continua sem traumas
Integração continua sem traumasIntegração continua sem traumas
Integração continua sem traumassabrinajn
 
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como CódigoCurso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como CódigoGuilhermeJorgeAragod
 
PHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta PerformancePHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta PerformanceFelipe Ribeiro
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPMarcelo Andrade
 
Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016Felipe Klerk Signorini
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Frameworkelliando dias
 

Semelhante a Integração Contínua com CruiseControl 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
 
Desenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHPDesenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHP
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo real
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
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
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript
 
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorPlay Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
 
Python 08
Python 08Python 08
Python 08
 
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
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Integração continua sem traumas
Integração continua sem traumasIntegração continua sem traumas
Integração continua sem traumas
 
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como CódigoCurso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
 
PHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta PerformancePHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta Performance
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHP
 
Android
AndroidAndroid
Android
 
Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016
 
Palestra parse
Palestra parsePalestra parse
Palestra parse
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Framework
 

Integração Contínua com CruiseControl e phpUnderControl

  • 2. Diego Tremper  Zend Certified Engineer  Entusiasta PHP  Palestrante  Estudante
  • 3. 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
  • 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 na 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 o setup de novos projetos a serem 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
  • 21. Execução de testes (PHPUnit)
  • 23. Violação de padrões (PHP_CodeSniffer)
  • 24. 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
  • 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 colaphp /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 | |-- colaphp | | |-- 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 | |-- colaphp Arquivo monitorado pelo loop | `-- project-abc | `-- project-xyz principal do CruiseControl |-- projects |-- colaphp | |-- build | | |-- api | | |-- coverage | | | `-- logs |-- build.xml Arquivo de configuração do build do | | `-- source |-- src projeto define as tarefas a serem | | | `-- Math.php `-- tests executadas | `-- MathTest.php `-- project-abc `-- project-xyz
  • 31. Configuração do CruiseControl (config.xml) <cruisecontrol> … Nome projeto <project name=quot;colaphpquot; 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=quot;colaphpquot; 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=quot;colaphpquot; 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_CodeSniffe r  http://www.phpdoc.org/