SlideShare a Scribd company logo
1 of 167
Download to read offline
Integração
  contínua
        em PHP

   Automating PHP
        Continuous
   Integration with
            Jenkins




          Gilmar Pupo
            @gpupo
Sobre @gpupo
• Desenvolvedor e consultor em TI
• Doctrine ORM, Symfony, Perl, Bash,
  Linux, jQuery e o que mais funcionar
• Membro e co-fundador do #maisagil
• Empreendedor no @hotellinux

       www.gilmar.eti.br   www.gpupo.com




                                    Integração contínua @gpupo
PHPUnit
PHP_CodeSniffer
phpcpd
Jenkins


Ferramentas
Ant
                   <
 Git
   Capistrano
Testes Unitários
Testes
Funcionais
Documentação
PHPUnit
PHP_CodeSniffer
phpcpd
Jenkins


Ferramentas
Ant
                   <
 Git
Testes Unitários
Testes
Funcionais
Documentação
                   www.delicious.com/gpupo/ci
Para que serve
• Reduzir retrabalho

• Reduzir custo de entrega

• Código de manutenção barata

• Identificar erros mais cedo


                             Integração contínua @gpupo
O que faz
• Verifica padrões

• Gera relatórios e alertas

• Gera documentação




                              Integração contínua @gpupo
O que faz
• Verifica duplicidade de código

• Recomenda o encapsulamento

• Identifica a % de código coberto

• Gera pacotes


                            Integração contínua @gpupo
Compatibilidade
• Incompatível com
   Cowboy coding OS




                http://en.wikipedia.org/wiki/Cowboy_coding

                              Integração contínua @gpupo
http://martinfowler.com/articles/continuousIntegration.html
“...em minha cópia de trabalho e faço o
que preciso para completar minha
tarefa. Isso irá consistir em alterar o
código de produção e também
adicionar ou alterar os testes
automatizados.

Integração Contínua assume um alto
nível de testes que são automatizados
no software: uma facilidade que eu
chamo de self-testing code...”


                           Integração contínua @gpupo
“...Uma vez que eu terminei, eu faço uma build
automatizada na minha máquina de
desenvolvimento.

Assim, o código fonte em minha cópia de
trabalho é pego, compilado e transformado em
um executável – e então é executado os testes
automáticos.

Somente se todas as builds e testes não tiverem
erros que tudo será considerado bom...”




                                 Integração contínua @gpupo
“....Com uma boa build, eu posso então pensar em
colocar minhas alterações no repositório...

...Sendo assim, primeiro eu atualizo minha cópia de
trabalho com as mudanças feitas pelos outros e crio
uma nova build. Se as mudanças deles chocarem com
as minhas mudanças, será exibido erros tanto na
compilação quanto nos testes. Neste caso é minha a
responsabilidade de corrigir estes erros e repetir o
processo até que minha cópia local esteja sincronizada
com a versão principal......”




                                     Integração contínua @gpupo
“...Uma vez que tenho as alterações na minha própria
build eu posso finalmente fazer o commit na versão
principal, que atualiza o repositório.

Entretanto meu commit não termina meu trabalho.
Nós fazemos uma build novamente, mas agora em
uma maquina de integração baseada na versão
principal do código. Somente com o sucesso desta
build poderemos dizer que as minhas alterações
foram feitas. ”




                                    Integração contínua @gpupo
“...Sempre existe uma chance de eu ter
esquecido alguma coisa na minha máquina e
o repositório não ser atualizado corretamente.

Somente quando minha build de alterações
for lançada com sucesso na máquina de
integração é que o meu trabalho terminou...”




                                Integração contínua @gpupo
“...Se um choque ocorrer entre as versões de dois
desenvolvedores, isso geralmente é pego quando o
segundo desenvolvedor atualizar sua cópia local com
as builds feitas pelos outros.

Caso não, a build de integração deve falhar.

De qualquer modo o erro é detectado rapidamente.

Nesse momento a tarefa mais importante é
consertar os problemas, e fazer sua build voltar a
funcionar corretamente....”




                                     Integração contínua @gpupo
“...A história anterior é uma apresentação da
Integração Contínua e de como ela funciona
diariamente. Colocar isso tudo pra funcionar sem
problemas envolve obviamente mais coisas do
que foi dito....”



                           Adaptação do artigo escrito por Martin Fowler

              http://martinfowler.com/articles/continuousIntegration.html




                                               Integração contínua @gpupo
“...Em um ambiente de Integração
Contínua você nunca deve ter uma build
de integração com falhas por muito
tempo. Um bom time deve ter muitas
builds corretas por dia.

Más builds podem ocorrer de tempos em
tempos, mas devem ser consertadas
rapidamente...”




                            Integração contínua @gpupo
Sem C.I.
                 Development Phase                              Testing Phase
Number of Bugs




                                                                Integration Phase




                                                                       undetected bugs
                                     Project Timeline




                                       Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008




                                                                   Integração contínua @gpupo
primeiros passos


Checkout / Update         Local testing                   Resolve / Testing
                Develop                   Update WC                                  Commit


                                                                                                       !
                                                                                   Receive
                                                                                  Build Result



                                      Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008




                                                                  Integração contínua @gpupo
Workflow com C.I. Server




           Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008




                                       Integração contínua @gpupo
O que faz
• Mantém Logs

• Reforça as políticas

• Informa status aos desenvolvedores

• Mantém rastreabilidade


                           Integração contínua @gpupo
Workflow com C.I. Server




           Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008




                                       Integração contínua @gpupo
Padrão é
 igual a
Default?
Padrão é
 igual a
Default?
Coding Style

       •   Zend Programmer's
           Reference Guide
           – Coding Style
               • http://goo.gl/z9BWj




               Integração contínua @gpupo
Coding Style

       •   PEARManual
           – Coding Style
               • http://goo.gl/JYKLu




               Integração contínua @gpupo
Por que padrões
diferentes para a
 mesma coisa ?
 E uma crítica à
comunidade PHP
PHP CodeSniffer
•    PHP CodeSniffer é um analizador de
    código PHP que escaneia o seu
    código e mostra erros e alertas
    baseado em um conjunto de padrões
    de código.




                            Integração contínua @gpupo
PHP CodeSniffer
•    PHP CodeSniffer é um analizador de
    código PHP que escaneia o seu
    código e mostra erros e alertas
    baseado em um conjunto de padrões
    de código.


        www.delicious.com/gpupo/codesniffer



                                 Integração contínua @gpupo
PHP CodeSniffer
•    PHP Code Sniffer (PHPCS) is a
    package for syntax checking,
    available from PEAR. It can check
    code against defined rules covering
    anything from whitespace through
    doc comments to variable naming
    conventions and beyond



                             Integração contínua @gpupo
PHP CodeSniffer
•    PHP Code Sniffer (PHPCS) is a
    package for syntax checking,
    available from PEAR. It can check
    code against defined rules covering
    anything from whitespace through
    doc comments to variable naming
    conventions and beyond



                             Integração contínua @gpupo
L
I
N
H
a
Usage: phpcs [-nwlsapvi] [-d key[=value]]
  [--report=<report>] [--report-file=<reportfile>] [--report-<report>=<reportfile>] ...
  [--report-width=<reportWidth>] [--generator=<generator>] [--tab-width=<tabWidth>]
  [--severity=<severity>] [--error-severity=<severity>] [--warning-severity=<severity>]
  [--config-set key value] [--config-delete key] [--config-show]
  [--standard=<standard>] [--sniffs=<sniffs>] [--encoding=<encoding>]
  [--extensions=<extensions>] [--ignore=<patterns>] <file> ...
      -n         Do not print warnings (shortcut for --warning-severity=0)
      -w          Print both warnings and errors (on by default)
      -l        Local directory only, no recursion
      -s         Show sniff codes in all reports
      -a         Run interactively
      -p         Show progress of the run
      -v[v][v]    Print verbose output
      -i        Show a list of installed coding standards
      -d         Set the [key] php.ini value to [value] or [true] if value is omitted
      --help       Print this help message
      --version Print version information
      <file>      One or more files and/or directories to check
      <extensions> A comma separated list of file extensions to check
                (only valid if checking a directory)
      <patterns> A comma separated list of patterns to ignore files and directories
      <encoding> The encoding of the files being checked (default is iso-8859-1)
      <sniffs>     A comma separated list of sniff codes to limit the check to
                (all sniffs must be part of the specified standard)
      <severity> The minimum severity required to display an error or warning
      <standard> The name or path of the coding standard to use
      <tabWidth> The number of spaces each tab represents
      <generator> The name of a doc generator to use
                (forces doc generation instead of checking)
      <report>       Print either the "full", "xml", "checkstyle", "csv", "emacs"
                "source", "summary", "svnblame" or "gitblame" report
                (the "full" report is printed by default)
      <reportfile> Write the report to the specified file path
      <reportWidth> How many columns wide screen reports should be printed
Configure                 (phpcs LIKE A BOSS)




sudo   phpcs --config-set default_standard Zend
sudo   phpcs --config-set zend_ca_path 
 /usr/share/php/phing/tasks/ext/ZendCodeAnalyzerTask.php


phpcs --config-show
phpcs --standard=/path/to/custom_ruleset.xml test.php
phpcs --standard=/path/to/custom_ruleset.xml test.php
phpcs --standard=/path/to/custom_ruleset.xml test.php
Eclipse      plugin


http://www.phpsrc.org/eclipse/pti/
Eclipse      plugin


http://www.phpsrc.org/eclipse/pti/
Eclipse      plugin


http://www.phpsrc.org/eclipse/pti/
Eclipse      plugin


http://www.phpsrc.org/eclipse/pti/
Eclipse      plugin


http://www.phpsrc.org/eclipse/pti/




http://www.phpsrc.org/projects/pti/wiki/Installation
Eclipse               plugin


 http://www.phpsrc.org/eclipse/pti/




http://www.phpsrc.org/projects/pti/wiki/Installation
http://www.phpsrc.org/projects/pti-php-codesniffer/wiki/Configuration
$   phpcs --report=source .
PHP CODE SNIFFER VIOLATION SOURCE SUMMARY
--------------------------------------------------------------------------------
STANDARD CATEGORY                          SNIFF                                 COUNT
--------------------------------------------------------------------------------
Generic White space                    Disallow tab indent tabs used                     3
Generic Files                         Line length too long                               6
PEAR         Commenting               File comment missing                               4
PEAR         Commenting               Class comment missing                              4
PEAR         White space               Scope indent incorrect                            4
PEAR         Commenting               Function comment missing                           4
PEAR         Functions                Function call signature close bracket line         4
PEAR         Functions                Function call signature content after open         4
PEAR         Commenting               Function comment wrong style                       2
PEAR         Commenting               File comment wrong style                           2
PEAR         White space               Object operator indent incorrect                  1
--------------------------------------------------------------------------------
A TOTAL OF 48 SNIFF VIOLATION(S) WERE FOUND IN 11 SOURCE(S)
--------------------------------------------------------------------------------

Time: 1 second, Memory: 9.25Mb
$   phpcs --report=source .
  PHP CODE SNIFFER VIOLATION SOURCE SUMMARY
  --------------------------------------------------------------------------------
  STANDARD CATEGORY                          SNIFF                                 COUNT
  --------------------------------------------------------------------------------
  Generic White space                    Disallow tab indent tabs used                     3
  Generic Files                         Line length too long                               6
  PEAR         Commenting               File comment missing                               4
  PEAR         Commenting               Class comment missing                              4
  PEAR         White space               Scope indent incorrect                            4
  PEAR         Commenting               Function comment missing                           4
  PEAR         Functions                Function call signature close bracket line         4
  PEAR         Functions                Function call signature content after open         4
  PEAR         Commenting               Function comment wrong style                       2
  PEAR         Commenting               File comment wrong style                           2
  PEAR         White space               Object operator indent incorrect                  1
  --------------------------------------------------------------------------------
  A TOTAL OF 48 SNIFF VIOLATION(S) WERE FOUND IN 11 SOURCE(S)
  --------------------------------------------------------------------------------

  Time: 1 second, Memory: 9.25Mb
find /usr/share/php/PHP/CodeSniffer/Standards/ -name "*Sniff.php" -and -not -name "Abstract*"
Está correto?
Está correto?

phpcs --standard=Zend
recipe.class.php
Está correto?
Está correto?

phpcs --standard=Zend
recipe.class.php

phpcs recipe.class.php
Refactory     (PEAR)




  OpeningFunctionBraceBsdAllmanSniff
                   X
OpeningFunctionBraceKernighanRitchieSniff
Manual validation

                      Click on the
                   PHP_CodeSniffer
                 toolbar icon to check
                     selected file.




             Integração contínua @gpupo
Eclipse espaces x tabs




               Integração contínua @gpupo
Eclipse templates




             Integração contínua @gpupo
Duplicate code
• Duplicate code is a computer
  programming term for a sequence of
  source code that occurs more than
  once, either within a program or across
  different programs owned or
  maintained by the same entity.
• Duplicate code is generally considered
  undesirable for a number of reasons.

                             Integração contínua @gpupo
Duplicate code
• A minimum requirement is usually
  applied to the quantity of code that
  must appear in a sequence for it to be
  considered duplicate rather than
  coincidentally similar.
• Sequences of duplicate code are
  sometimes known as clones.


                             Integração contínua @gpupo
PMD's Copy/Paste
 Detector (CPD)




            Integração contínua @gpupo
PMD's Copy/Paste
        Detector (CPD)

public class Something {
  private static int FOO = 2; // Unused
  private int i = 5; // Unused
  private int j = 6;
  public int addOne() {
    return j++;
  }
}


                                    Integração contínua @gpupo
PMD's Copy/Paste
        Detector (CPD)

public class Foo {
  private String baz() {
     String bar = "howdy";
    return bar.toString();
  }
}




                             Integração contínua @gpupo
PHP Copy/Paste Detector
• O objetivo do phpcpd é oferecer uma
  visão geral do código duplicado em
  um projeto.


     $ sudo pear channel-discover pear.phpunit.de

     $ sudo pear channel-discover components.ez.no

     $ sudo pear install phpunit/phpcpd




                                            Integração contínua @gpupo
PHP Copy/Paste Detector
Usage: phpcpd [switches] <directory|file> ...

 --log-pmd <file>       Write report in PMD-CPD XML format to file.

 --min-lines <N>        Minimum number of identical lines (default: 5).
 --min-tokens <N>        Minimum number of identical tokens (default: 70).

 --exclude <directory> Exclude <directory> from code analysis.
 --suffixes <suffix,...> A comma-separated list of file suffixes to check.

 --help             Prints this usage information.
 --version           Prints the version and exits.

 --verbose           Print progress bar.




                                                      Integração contínua @gpupo
PHP Copy/Paste Detector
By default phpcpd will search for a
minimum of 5 identical lines and 70
identical tokens.
So if there are less than 5 duplicate
lines in the code or less than 70
identical tokens they will be ignored.




                            Integração contínua @gpupo
Localizando duplicações                            (hands on)




$ phpcpd --min-lines 1 
--min-tokens 4 src/
phpcpd 1.3.2 by Sebastian Bergmann.

Found 1 exact clones with 16 duplicated lines in 1 files:

 - average.php:6-22
   average.php:32-48

31.37% duplicated lines out of 51 total lines of code.
average.php                          (hands on)




                                             //continuando....
<?php
                                             $array1 = array(3,3,6,7,8);
$array1 = array(4,8,5,6);                    $array2 = array(9,9,8,78,4,6,5);
$array2 = array(7,78,8,9);
                                             $sum1 = 0;
$sum1 = 0;                                   $sum2 = 0;
$sum2 = 0;                                   $average1 = 0;
$average1 = 0;                               $average2 = 0;
$average2 = 0;
                                             for ($i = 0; $i < 4; $i++)
for ($i = 0; $i < 4; $i++)                   {
{                                              $sum1 += $array1[$i];
                                             }
  $sum1 += $array1[$i];
                                             $average1 = $sum1/4;
}
$average1 = $sum1/4;                         for ($i = 0; $i < 4; $i++)
                                             {
for ($i = 0; $i < 4; $i++)                     $sum2 += $array2[$i];
{                                            }
  $sum2 += $array2[$i];                      $average2 = $sum2/4;
}
$average2 = $sum2/4;
                                             printf("nSoma 2:%dnMédia 2: %d",$average1,$average2);


printf("Soma 1:%dnMédia 1: %d",$average1,$average2);
average.php   (hands on)
cp
phpDocumentor

The complete documentation solution
for PHP [sic]




                         Integração contínua @gpupo
phpDocumentor

Publicos diferentes;
 - Interno
 - Externo




                       Integração contínua @gpupo
PHP_Depend

Gerar um conjunto de métricas de
software a partir de uma base de
código dado, para medir a qualidade
de um projeto de software e ajudam a
identificar as partes de uma aplicação
onde uma refatoração pode ser
aplicada


                           Integração contínua @gpupo
PHP_Depend
 overview
  pyramid




     Integração contínua @gpupo
P       phploc
H
P
Lines
Of
Code
                 Integração contínua @gpupo
phploc
tool for quickly measuring the size of
             a PHP project




                             Integração contínua @gpupo
phploc
tool for quickly measuring the size of
             a PHP project




    $ sudo pear install phpunit/phploc




                               https://github.com/sebastianbergmann/phploc



                                   Integração contínua @gpupo
PHP Project Wizard
      (PPW)
 commandline tool that can be used
      to generate the scripts and
 configuration files necessary for the
  build automation of a PHP project




                    https://github.com/sebastianbergmann/php-project-wizard



                                      Integração contínua @gpupo
Criando um novo projeto                  (hands on)




$ppw --source src 
--tests tests --name object-freezer 
--bootstrap tests/bootstrap.php .

$ echo "build" > .gitignore;
$ echo "source=${basedir}/src" > build.properties;
A formiga atômica!

The Apache Ant build.xml build script
Zend Framework...
$ sudo apt-get install -y zend-framework-bin
$ sudo pear channel-discover zend.googlecode.com/svn
$ sudo pear install zend/zend




$cd src;

$ zf create project 
. Object-freezer;

$ mv tests ../ ;
Estrutura atual
Estrutura atual
Estrutura atual
Bootstrap
                     de testes
                     Refatorado




https://github.com/gpupo/object-freezer/tree/zend
Rodando testes
$ ~/workspace/object-freezer$ phpunit
PHPUnit 3.5.14 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 6.50Mb

OK (1 test, 4 assertions)
PHPUnit
Para ter o código auto-testável você
necessitará de uma suite de testes
 automatizados que possa checar
   uma grande parte da base do
 código para achar problemas. Os
testes necessitam estar aptos para
rodarem com um simples comando
         e serem checados
         automaticamente.




                            Integração contínua @gpupo
Jenkins

“In a nutshell Jenkins CI is the leading
open-source continuous integration
server. Built with Java, it provides over
300 plugins to support building and
testing virtually any project.”




                             Integração contínua @gpupo
Jenkins

“In a nutshell Jenkins CI is the leading
open-source continuous integration
server. Built with Java, it provides over
300 plugins to support building and
testing virtually any project.”

       www.delicious.com/gpupo/jenkins


                              Integração contínua @gpupo
Jenkins on Ubuntu

$ wget -q -O - 
http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key 
 | sudo apt-key add - ;

$ sudo sh -c 
 'echo deb http://pkg.jenkins-ci.org/debian binary/ > 
 /etc/apt/sources.list.d/jenkins.list';

sudo apt-get update
sudo apt-get install jenkins ant

                                          Integração contínua @gpupo
Jenkins on Ubuntu

…
Setting up daemon (0.6.4-1) ...
Setting up jenkins (1.420) ...
Adding system user `jenkins' (UID 125) ...
Adding new user `jenkins' (UID 125) with group `nogroup' ...
Not creating home directory `/var/lib/jenkins'.
 * Starting Jenkins Continuous Integration Server jenkins
       The selected http port (8080) seems to be in use by
another program
Please select another port to use for jenkins



                                            Integração contínua @gpupo
Jenkins on Ubuntu

• Http://localhost:8080

• http://localhost:8080/manage

• http://localhost:8080/pluginManager/available




                                 Integração contínua @gpupo
Jenkins on Ubuntu

• $ sudo /etc/init.d/jenkins
  {
   start|stop|status|restart|force-reload
  }




                             Integração contínua @gpupo
Jenkins CLI

• java -jar jenkins-cli.jar -s 
  http://localhost:8080/ help




                               Integração contínua @gpupo
Jenkins CLI

    build: Builds a job, and optionally waits until its completion.
    copy-job: Copies a job
•
   create-job: Creates a new job by reading stdin as a configuration
•XML file
• enable-job: Enables a job

    help: Lists all the available commands
•
   install-plugin: Installs a plugin either from a file, an URL, or from
•update center
• login: Saves the current credential to allow future commands to
 run without explicit credential information
• mail: Reads stdin and sends that out as an e-mail.

•
                                                   Integração contínua @gpupo
Instalando plugins

    wget http://localhost:8080/jnlpJars/jenkins-cli.jar
•

    java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin checkstyle
•

    java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin cloverphp
•

    java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin dry
•

    java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin htmlpublisher
•

    java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin jdepend
•

    java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin git
•

    java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin github
•



                                                                            Integração contínua @gpupo
Jenkins on Ubuntu

java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin
plot


java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin
pmd

java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin
violations


java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin
xunit


                                                Integração contínua @gpupo
Instalando plugins
                         ou

$ plugins=( cloverphp dry htmlpublisher jdepend plot 

pmd violations xunit git github);

$ for name in "${plugins[@]}"; 

do java -jar jenkins-cli.jar -s 

http://localhost:8080 install-plugin $name;

done;                                                  Script disponivel em
                                          https://gist.github.com/1078415

                                                  Integração contínua @gpupo
Reload

• $ sudo /etc/init.d/jenkins restart




                             Integração contínua @gpupo
Seguranca

• http://localhost:8080/configure
  – Enable security
    • Jenkins's own user database
    • Save




                                    Integração contínua @gpupo
Seguranca

• http://localhost:8080/configure
  – Enable security
    •   Jenkins's own user database
    •   Save
    •   Sign UP
    •   Config >> Logged-in users can do anything




                                   Integração contínua @gpupo
Jenkins Alerts

• Configurar envio de e-mail autenticado




                                 Integração contínua @gpupo
TODO       (right now)




        Instalar:

      Jenkins
Plugins Jenkins (+GIT)
    PHP Tools
Jenkins + PHP

• $ sudo pear channel-discover pear.pdepend.org

• $ sudo pear channel-discover pear.phpmd.org

• $ sudo pear channel-discover pear.phpunit.de

• $ sudo pear channel-discover components.ez.no


• $ sudo pear channel-discover pear.symfony-project.com


                                        Integração contínua @gpupo
Jenkins + PHP

• $ sudo pear install pdepend/PHP_Depend


• $ sudo pear install phpmd/PHP_PMD

• $ sudo pear install phpunit/phpcpd

• $ sudo pear install phpunit/phploc


                                  Integração contínua @gpupo
Jenkins + PHP

• $ sudo pear install PHPDocumentor

• $ sudo pear install PHP_CodeSniffer


• $ sudo pear install pear/Text_Highlighter-beta

• $ sudo pear install pear/HTTP_Request2-beta


• $ sudo pear install phpunit/ppw

                                        Integração contínua @gpupo
Jenkins + PHP

• $ sudo pear install –alldeps 
  phpunit/PHP_CodeBrowser

• $ sudo pear install –alldeps 
  phpunit/PHPUnitear install PHPDocumentor




                                   Integração contínua @gpupo
Jenkins template

• $ cd /var/lib/jenkins/jobs/


• $ sudo git clone 
  git://github.com/sebastianbergmann/php-jenkins-template.git php-template



• $ sudo chown -R jenkins:nogroup 
  php-template/



                                                   Integração contínua @gpupo
Jenkins + PHP

• $ cd /var/lib/jenkins/jobs/


• $ git clone 

                             RELOAD!
  git://github.com/sebastianbergmann/php-jenkins-template.git php-template



• $sudo chown -R jenkins:nogroup 
  php-template/



                                                   Integração contínua @gpupo
O Pulo do Gato
Jenkins + GIT

• $ sudo su - jenkins

• $ ssh-keygen -t rsa -C "jenkins@hotellinux.com"


• $ git config --global user.email 
  "jenkins@hotellinux.com"


• $ git config --global user.name "Jenkins Robot"


                                       Integração contínua @gpupo
Jenkins + GIT

• Adicionar Chave ao Repositório




                             Integração contínua @gpupo
Jenkins + GIT

• Adicionar Chave ao Repositório


• $ ssh git@github.com




                             Integração contínua @gpupo
Em branco!
Jenkins + GIT

• $ sudo su - jenkins

• $ ssh-keygen -t rsa -C "jenkins@hotellinux.com"


• $ git config --global user.email 
  "jenkins@hotellinux.com"


• $ git config --global user.name "Jenkins Robot"


                                       Integração contínua @gpupo
Template for Jenkins
Jobs for PHP Projects
                • Adivinha
                  de quem
                  éo
                  projeto?




             Integração contínua @gpupo
Template for Jenkins
Jobs for PHP Projects
                • Adivinha
                  de quem
                  éo
                  projeto?




             Integração contínua @gpupo
Criando um job PHP no
                   Jenkins
• Nome do projeto exemplo: "Object-Freezer".


• Selecione "Copy existing job" e escreva "php-template" no campo "Copy
  from".


• Substitua as duas ocorrencias de "job-name" pelo nome do projeto, no
  campo "Description".


• Desabilite a opcao "Disable Build".


• Preencha as informacoes do repositorio GIT.


• Configure o "Build Trigger" como "Poll SCM".


                                                     Integração contínua @gpupo
Criando um job PHP no
       Jenkins




            Integração contínua @gpupo
Criando um job PHP no
       Jenkins




            Integração contínua @gpupo
Jenkins alerts




            Integração contínua @gpupo
Jenkins alerts




            Integração contínua @gpupo
Jenkins jobs




          Integração contínua @gpupo
Jenkins job




          Integração contínua @gpupo
Job/documentação




           Integração contínua @gpupo
Job/testes




        Integração contínua @gpupo
Job/testes




        Integração contínua @gpupo
Job/histórico




          Integração contínua @gpupo
Job/estilo




         Integração contínua @gpupo
Job/cobertura




          Integração contínua @gpupo
Job/violações




          Integração contínua @gpupo
Job/CodeBrowser




          Integração contínua @gpupo
Job/CodeBrowser




          Integração contínua @gpupo
Job/workspace




         Integração contínua @gpupo
Job/Build Time Trend




             Integração contínua @gpupo
Customizando
Quero que meu projeto avalie apenas o Coding style
            Zend. Como configurar?




                                 Integração contínua @gpupo
Customizando
             Quero que meu projeto avalie apenas o Coding style
                         Zend. Como configurar?
build.xml:




                                              Integração contínua @gpupo
Customizando
Como configurar a codificação do meu projeto?




                              Integração contínua @gpupo
Customizando
                         Como configurar a codificação do meu projeto?

build.xml:
///...
<target name="phpcs" description="Generate checkstyle.xml using
PHP_CodeSniffer">
 <exec executable="phpcs" output="/dev/null">
  <arg line="--report=checkstyle
          --report-file=${basedir}/build/logs/checkstyle.xml
          --standard=PEAR
        --encoding=iso-8859-1
         ${source}" />
  </exec>
 </target>
//...

                                                       Integração contínua @gpupo
Jenkins + capistrano

• soon




                  Integração contínua @gpupo
Referências
-   https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu
-   https://github.com/sebastianbergmann/php-project-wizard
-   https://github.com/sebastianbergmann/phpcpd
-   https://gist.github.com/1078415




    http://www.delicious.com/gpupo/ci

More Related Content

What's hot

Why Aren't You Using Git Flow?
Why Aren't You Using Git Flow?Why Aren't You Using Git Flow?
Why Aren't You Using Git Flow?John Congdon
 
Git Branching for Agile Teams
Git Branching for Agile Teams Git Branching for Agile Teams
Git Branching for Agile Teams Atlassian
 
.NET 6: O que há de novo e o que está por vir?
.NET 6: O que há de novo e o que está por vir?.NET 6: O que há de novo e o que está por vir?
.NET 6: O que há de novo e o que está por vir?Letticia Nicoli
 
Azure DevOps - Um case de sucesso
Azure DevOps - Um case de sucessoAzure DevOps - Um case de sucesso
Azure DevOps - Um case de sucessoArmando Junior
 
Screaming fast json parsing on Android
Screaming fast json parsing on AndroidScreaming fast json parsing on Android
Screaming fast json parsing on AndroidKarthik Ramgopal
 
Git flow for daily use
Git flow for daily useGit flow for daily use
Git flow for daily useMediacurrent
 
Agile for project managers - a sailing analogy
Agile for project managers  - a sailing analogyAgile for project managers  - a sailing analogy
Agile for project managers - a sailing analogyJohn Goodpasture
 
マイコンでマルチタスク
マイコンでマルチタスクマイコンでマルチタスク
マイコンでマルチタスクKatsuhiko Terawaki
 
UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動uchan_nos
 
Introduction to Gitea with Drone
Introduction to Gitea with DroneIntroduction to Gitea with Drone
Introduction to Gitea with DroneBo-Yi Wu
 
Go swagger tutorial how to create golang api documentation using go swagger (1)
Go swagger tutorial how to create golang api documentation using go swagger (1)Go swagger tutorial how to create golang api documentation using go swagger (1)
Go swagger tutorial how to create golang api documentation using go swagger (1)Katy Slemon
 
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | Edureka
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | EdurekaAzure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | Edureka
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | EdurekaEdureka!
 
Cisco's journey from Verbs to Libfabric
Cisco's journey from Verbs to LibfabricCisco's journey from Verbs to Libfabric
Cisco's journey from Verbs to LibfabricJeff Squyres
 
Gestion de projets
Gestion de projetsGestion de projets
Gestion de projetsAli Polat
 
Git Series. Episode 3. Git Flow and Github-Flow
Git Series. Episode 3. Git Flow and Github-FlowGit Series. Episode 3. Git Flow and Github-Flow
Git Series. Episode 3. Git Flow and Github-FlowMikhail Melnik
 
Introduction to DevOps. Continuous Integration by Myroslav Dmytrus
Introduction to DevOps. Continuous Integration by Myroslav Dmytrus Introduction to DevOps. Continuous Integration by Myroslav Dmytrus
Introduction to DevOps. Continuous Integration by Myroslav Dmytrus Binary Studio
 
Gitはじめの一歩
Gitはじめの一歩Gitはじめの一歩
Gitはじめの一歩Ayana Yokota
 
Introduction to Git(BitBucket) , Continuous Integration (Bamboo) & Confluence
Introduction to Git(BitBucket) , Continuous Integration (Bamboo) & Confluence Introduction to Git(BitBucket) , Continuous Integration (Bamboo) & Confluence
Introduction to Git(BitBucket) , Continuous Integration (Bamboo) & Confluence Parag Gajbhiye
 
Introduction to Azure DevOps
Introduction to Azure DevOpsIntroduction to Azure DevOps
Introduction to Azure DevOpsLorenzo Barbieri
 

What's hot (20)

Why Aren't You Using Git Flow?
Why Aren't You Using Git Flow?Why Aren't You Using Git Flow?
Why Aren't You Using Git Flow?
 
Git Branching for Agile Teams
Git Branching for Agile Teams Git Branching for Agile Teams
Git Branching for Agile Teams
 
.NET 6: O que há de novo e o que está por vir?
.NET 6: O que há de novo e o que está por vir?.NET 6: O que há de novo e o que está por vir?
.NET 6: O que há de novo e o que está por vir?
 
目grepのはなし
目grepのはなし目grepのはなし
目grepのはなし
 
Azure DevOps - Um case de sucesso
Azure DevOps - Um case de sucessoAzure DevOps - Um case de sucesso
Azure DevOps - Um case de sucesso
 
Screaming fast json parsing on Android
Screaming fast json parsing on AndroidScreaming fast json parsing on Android
Screaming fast json parsing on Android
 
Git flow for daily use
Git flow for daily useGit flow for daily use
Git flow for daily use
 
Agile for project managers - a sailing analogy
Agile for project managers  - a sailing analogyAgile for project managers  - a sailing analogy
Agile for project managers - a sailing analogy
 
マイコンでマルチタスク
マイコンでマルチタスクマイコンでマルチタスク
マイコンでマルチタスク
 
UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動UEFIによるELFバイナリの起動
UEFIによるELFバイナリの起動
 
Introduction to Gitea with Drone
Introduction to Gitea with DroneIntroduction to Gitea with Drone
Introduction to Gitea with Drone
 
Go swagger tutorial how to create golang api documentation using go swagger (1)
Go swagger tutorial how to create golang api documentation using go swagger (1)Go swagger tutorial how to create golang api documentation using go swagger (1)
Go swagger tutorial how to create golang api documentation using go swagger (1)
 
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | Edureka
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | EdurekaAzure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | Edureka
Azure DevOps Tutorial | Developing CI/ CD Pipelines On Azure | Edureka
 
Cisco's journey from Verbs to Libfabric
Cisco's journey from Verbs to LibfabricCisco's journey from Verbs to Libfabric
Cisco's journey from Verbs to Libfabric
 
Gestion de projets
Gestion de projetsGestion de projets
Gestion de projets
 
Git Series. Episode 3. Git Flow and Github-Flow
Git Series. Episode 3. Git Flow and Github-FlowGit Series. Episode 3. Git Flow and Github-Flow
Git Series. Episode 3. Git Flow and Github-Flow
 
Introduction to DevOps. Continuous Integration by Myroslav Dmytrus
Introduction to DevOps. Continuous Integration by Myroslav Dmytrus Introduction to DevOps. Continuous Integration by Myroslav Dmytrus
Introduction to DevOps. Continuous Integration by Myroslav Dmytrus
 
Gitはじめの一歩
Gitはじめの一歩Gitはじめの一歩
Gitはじめの一歩
 
Introduction to Git(BitBucket) , Continuous Integration (Bamboo) & Confluence
Introduction to Git(BitBucket) , Continuous Integration (Bamboo) & Confluence Introduction to Git(BitBucket) , Continuous Integration (Bamboo) & Confluence
Introduction to Git(BitBucket) , Continuous Integration (Bamboo) & Confluence
 
Introduction to Azure DevOps
Introduction to Azure DevOpsIntroduction to Azure DevOps
Introduction to Azure DevOps
 

Viewers also liked

Comprendre la crise financière (2009)
Comprendre la crise financière (2009) Comprendre la crise financière (2009)
Comprendre la crise financière (2009) Philippe Watrelot
 
Les Barbares Attaquent l'immobilier
Les Barbares Attaquent l'immobilierLes Barbares Attaquent l'immobilier
Les Barbares Attaquent l'immobilierTheFamily
 
Matinée marketplace HiPay, Mirakl
Matinée marketplace HiPay, MiraklMatinée marketplace HiPay, Mirakl
Matinée marketplace HiPay, MiraklHiPay Group
 
The New Multiscreen World By Google
The New Multiscreen World By GoogleThe New Multiscreen World By Google
The New Multiscreen World By Googleservicesmobiles.fr
 
Sistema Urinário
Sistema  UrinárioSistema  Urinário
Sistema Urináriovictorpre
 
Passos bíblicos para o fim
Passos bíblicos para o fimPassos bíblicos para o fim
Passos bíblicos para o fimabimaelfilho
 
Vitaminas lipossoluveis
Vitaminas lipossoluveisVitaminas lipossoluveis
Vitaminas lipossoluveisPaula Oliveira
 
Controle biológico
Controle biológicoControle biológico
Controle biológicounesp
 
Gestão do planejamento estratégico
Gestão do planejamento estratégicoGestão do planejamento estratégico
Gestão do planejamento estratégicoDenis Carlos Sodré
 
Call for Tenders - Château de Versailles
Call for Tenders - Château de VersaillesCall for Tenders - Château de Versailles
Call for Tenders - Château de VersaillesClara Rua
 
Belgique : enquête d'opinion sur le tourisme responsable
Belgique : enquête d'opinion sur le tourisme responsableBelgique : enquête d'opinion sur le tourisme responsable
Belgique : enquête d'opinion sur le tourisme responsableSamuel Poos
 
Exemple d'appareillage de la main atteinte de polyarthrite rhumatoïde
Exemple d'appareillage de la main atteinte de polyarthrite rhumatoïdeExemple d'appareillage de la main atteinte de polyarthrite rhumatoïde
Exemple d'appareillage de la main atteinte de polyarthrite rhumatoïdewanttologin
 

Viewers also liked (20)

Comprendre la crise financière (2009)
Comprendre la crise financière (2009) Comprendre la crise financière (2009)
Comprendre la crise financière (2009)
 
Les Barbares Attaquent l'immobilier
Les Barbares Attaquent l'immobilierLes Barbares Attaquent l'immobilier
Les Barbares Attaquent l'immobilier
 
Matinée marketplace HiPay, Mirakl
Matinée marketplace HiPay, MiraklMatinée marketplace HiPay, Mirakl
Matinée marketplace HiPay, Mirakl
 
The New Multiscreen World By Google
The New Multiscreen World By GoogleThe New Multiscreen World By Google
The New Multiscreen World By Google
 
Rizal's grand tour of europe with viola
Rizal's grand tour of europe with violaRizal's grand tour of europe with viola
Rizal's grand tour of europe with viola
 
Android Aula 1
Android Aula 1Android Aula 1
Android Aula 1
 
Sistema Urinário
Sistema  UrinárioSistema  Urinário
Sistema Urinário
 
Proposta De Valor
Proposta De ValorProposta De Valor
Proposta De Valor
 
Passos bíblicos para o fim
Passos bíblicos para o fimPassos bíblicos para o fim
Passos bíblicos para o fim
 
O plano de deus (2)
O plano de deus (2)O plano de deus (2)
O plano de deus (2)
 
Vitaminas lipossoluveis
Vitaminas lipossoluveisVitaminas lipossoluveis
Vitaminas lipossoluveis
 
Controle biológico
Controle biológicoControle biológico
Controle biológico
 
Hackeando o Facebook com Python
Hackeando o Facebook com PythonHackeando o Facebook com Python
Hackeando o Facebook com Python
 
Saude da mulher
Saude da mulherSaude da mulher
Saude da mulher
 
Gestão do planejamento estratégico
Gestão do planejamento estratégicoGestão do planejamento estratégico
Gestão do planejamento estratégico
 
Call for Tenders - Château de Versailles
Call for Tenders - Château de VersaillesCall for Tenders - Château de Versailles
Call for Tenders - Château de Versailles
 
El Impresionismo
El Impresionismo El Impresionismo
El Impresionismo
 
Belgique : enquête d'opinion sur le tourisme responsable
Belgique : enquête d'opinion sur le tourisme responsableBelgique : enquête d'opinion sur le tourisme responsable
Belgique : enquête d'opinion sur le tourisme responsable
 
Bora Bora
Bora BoraBora Bora
Bora Bora
 
Exemple d'appareillage de la main atteinte de polyarthrite rhumatoïde
Exemple d'appareillage de la main atteinte de polyarthrite rhumatoïdeExemple d'appareillage de la main atteinte de polyarthrite rhumatoïde
Exemple d'appareillage de la main atteinte de polyarthrite rhumatoïde
 

Similar to Integração contínua em PHP com Jenkins

Entrega contínua com arquitetura distribuida
Entrega contínua com arquitetura distribuidaEntrega contínua com arquitetura distribuida
Entrega contínua com arquitetura distribuidaLeonardo Kobus
 
Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011Luís Cobucci
 
Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011Luís Cobucci
 
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...Bruno Tanoue
 
Automação de Testes: Ferramentas e Aplicação com Integração Contínua
Automação de Testes: Ferramentas e Aplicação com Integração ContínuaAutomação de Testes: Ferramentas e Aplicação com Integração Contínua
Automação de Testes: Ferramentas e Aplicação com Integração ContínuaGabriela Patuci
 
Quebrando barreiras entre desenvolvimento e operação de software com DevOps
Quebrando barreiras entre desenvolvimento e operação de software com DevOpsQuebrando barreiras entre desenvolvimento e operação de software com DevOps
Quebrando barreiras entre desenvolvimento e operação de software com DevOpsJosé Alexandre Macedo
 
Ágil na Prática
Ágil na PráticaÁgil na Prática
Ágil na PráticaIgo Coelho
 
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...minastestingconference
 
Importância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOpsImportância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOpsSamanta Cicilia
 
Integracao Continua em projetos .NET
Integracao Continua em projetos .NETIntegracao Continua em projetos .NET
Integracao Continua em projetos .NETLuthiano Vasconcelos
 
Engenharia de software
Engenharia de softwareEngenharia de software
Engenharia de softwareLaura_ifpe
 
[DevOps Carioca] Continuous Delivery
[DevOps Carioca]  Continuous Delivery[DevOps Carioca]  Continuous Delivery
[DevOps Carioca] Continuous DeliverySamanta Cicilia
 
[Lady talks]Continuous Delivery
[Lady talks]Continuous Delivery[Lady talks]Continuous Delivery
[Lady talks]Continuous DeliverySamanta Cicilia
 
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
 
Qualidade de software com Visual Studio ALM
Qualidade de software com Visual Studio ALMQualidade de software com Visual Studio ALM
Qualidade de software com Visual Studio ALMAdriano Bertucci
 
[Uff] Continuous Delivery: Entrega Contínua de Software de Valor
[Uff] Continuous Delivery: Entrega Contínua de Software de Valor[Uff] Continuous Delivery: Entrega Contínua de Software de Valor
[Uff] Continuous Delivery: Entrega Contínua de Software de ValorSamanta Cicilia
 
Integração contínua - Prática de desenvolvimento
Integração contínua - Prática de desenvolvimentoIntegração contínua - Prática de desenvolvimento
Integração contínua - Prática de desenvolvimentoMario Mendonça
 
ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...
ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...
ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...Antonio Lobato
 

Similar to Integração contínua em PHP com Jenkins (20)

Entrega contínua com arquitetura distribuida
Entrega contínua com arquitetura distribuidaEntrega contínua com arquitetura distribuida
Entrega contínua com arquitetura distribuida
 
Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011Qualidade em projetos PHP - SoLiSC 2011
Qualidade em projetos PHP - SoLiSC 2011
 
Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011Qualidade em projetos PHP - PHPSC Conf 2011
Qualidade em projetos PHP - PHPSC Conf 2011
 
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
TDC 2015 - Trilha PHP - Testes e Ambiente de Integração Contínua PHP para o D...
 
Automação de Testes: Ferramentas e Aplicação com Integração Contínua
Automação de Testes: Ferramentas e Aplicação com Integração ContínuaAutomação de Testes: Ferramentas e Aplicação com Integração Contínua
Automação de Testes: Ferramentas e Aplicação com Integração Contínua
 
Quebrando barreiras entre desenvolvimento e operação de software com DevOps
Quebrando barreiras entre desenvolvimento e operação de software com DevOpsQuebrando barreiras entre desenvolvimento e operação de software com DevOps
Quebrando barreiras entre desenvolvimento e operação de software com DevOps
 
Ágil na Prática
Ágil na PráticaÁgil na Prática
Ágil na Prática
 
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
 
Importância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOpsImportância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOps
 
Integracao Continua em projetos .NET
Integracao Continua em projetos .NETIntegracao Continua em projetos .NET
Integracao Continua em projetos .NET
 
Engenharia de software
Engenharia de softwareEngenharia de software
Engenharia de software
 
[DevOps Carioca] Continuous Delivery
[DevOps Carioca]  Continuous Delivery[DevOps Carioca]  Continuous Delivery
[DevOps Carioca] Continuous Delivery
 
[Lady talks]Continuous Delivery
[Lady talks]Continuous Delivery[Lady talks]Continuous Delivery
[Lady talks]Continuous Delivery
 
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
 
DevOps
DevOpsDevOps
DevOps
 
Integracao continua-e-php
Integracao continua-e-phpIntegracao continua-e-php
Integracao continua-e-php
 
Qualidade de software com Visual Studio ALM
Qualidade de software com Visual Studio ALMQualidade de software com Visual Studio ALM
Qualidade de software com Visual Studio ALM
 
[Uff] Continuous Delivery: Entrega Contínua de Software de Valor
[Uff] Continuous Delivery: Entrega Contínua de Software de Valor[Uff] Continuous Delivery: Entrega Contínua de Software de Valor
[Uff] Continuous Delivery: Entrega Contínua de Software de Valor
 
Integração contínua - Prática de desenvolvimento
Integração contínua - Prática de desenvolvimentoIntegração contínua - Prática de desenvolvimento
Integração contínua - Prática de desenvolvimento
 
ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...
ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...
ld0mg1hrlhzbyvgfiyyq-signature-d9919623d100cd87ad7553e4c50163aa9329a439464540...
 

More from Gilmar Pupo

Gerência de Configuração de Software: Benefícios Do Controle de Versões Distr...
Gerência de Configuração de Software: Benefícios Do Controle de Versões Distr...Gerência de Configuração de Software: Benefícios Do Controle de Versões Distr...
Gerência de Configuração de Software: Benefícios Do Controle de Versões Distr...Gilmar Pupo
 
12 passos para um código melhor
12 passos para um código melhor12 passos para um código melhor
12 passos para um código melhorGilmar Pupo
 
Big design up front (BDUF)
Big design up front (BDUF)Big design up front (BDUF)
Big design up front (BDUF)Gilmar Pupo
 
Controle de versões distribuído para projetos de software
Controle de versões distribuído para projetos de softwareControle de versões distribuído para projetos de software
Controle de versões distribuído para projetos de softwareGilmar Pupo
 
P2p - Valorizando o compartilhamento do conhecimento
P2p - Valorizando o compartilhamento do conhecimento P2p - Valorizando o compartilhamento do conhecimento
P2p - Valorizando o compartilhamento do conhecimento Gilmar Pupo
 

More from Gilmar Pupo (6)

Gerência de Configuração de Software: Benefícios Do Controle de Versões Distr...
Gerência de Configuração de Software: Benefícios Do Controle de Versões Distr...Gerência de Configuração de Software: Benefícios Do Controle de Versões Distr...
Gerência de Configuração de Software: Benefícios Do Controle de Versões Distr...
 
Unix te da asas
Unix te da asasUnix te da asas
Unix te da asas
 
12 passos para um código melhor
12 passos para um código melhor12 passos para um código melhor
12 passos para um código melhor
 
Big design up front (BDUF)
Big design up front (BDUF)Big design up front (BDUF)
Big design up front (BDUF)
 
Controle de versões distribuído para projetos de software
Controle de versões distribuído para projetos de softwareControle de versões distribuído para projetos de software
Controle de versões distribuído para projetos de software
 
P2p - Valorizando o compartilhamento do conhecimento
P2p - Valorizando o compartilhamento do conhecimento P2p - Valorizando o compartilhamento do conhecimento
P2p - Valorizando o compartilhamento do conhecimento
 

Integração contínua em PHP com Jenkins

  • 1. Integração contínua em PHP Automating PHP Continuous Integration with Jenkins Gilmar Pupo @gpupo
  • 2. Sobre @gpupo • Desenvolvedor e consultor em TI • Doctrine ORM, Symfony, Perl, Bash, Linux, jQuery e o que mais funcionar • Membro e co-fundador do #maisagil • Empreendedor no @hotellinux www.gilmar.eti.br www.gpupo.com Integração contínua @gpupo
  • 3. PHPUnit PHP_CodeSniffer phpcpd Jenkins Ferramentas Ant < Git Capistrano Testes Unitários Testes Funcionais Documentação
  • 4. PHPUnit PHP_CodeSniffer phpcpd Jenkins Ferramentas Ant < Git Testes Unitários Testes Funcionais Documentação www.delicious.com/gpupo/ci
  • 5. Para que serve • Reduzir retrabalho • Reduzir custo de entrega • Código de manutenção barata • Identificar erros mais cedo Integração contínua @gpupo
  • 6. O que faz • Verifica padrões • Gera relatórios e alertas • Gera documentação Integração contínua @gpupo
  • 7. O que faz • Verifica duplicidade de código • Recomenda o encapsulamento • Identifica a % de código coberto • Gera pacotes Integração contínua @gpupo
  • 8. Compatibilidade • Incompatível com Cowboy coding OS http://en.wikipedia.org/wiki/Cowboy_coding Integração contínua @gpupo
  • 10. “...em minha cópia de trabalho e faço o que preciso para completar minha tarefa. Isso irá consistir em alterar o código de produção e também adicionar ou alterar os testes automatizados. Integração Contínua assume um alto nível de testes que são automatizados no software: uma facilidade que eu chamo de self-testing code...” Integração contínua @gpupo
  • 11. “...Uma vez que eu terminei, eu faço uma build automatizada na minha máquina de desenvolvimento. Assim, o código fonte em minha cópia de trabalho é pego, compilado e transformado em um executável – e então é executado os testes automáticos. Somente se todas as builds e testes não tiverem erros que tudo será considerado bom...” Integração contínua @gpupo
  • 12. “....Com uma boa build, eu posso então pensar em colocar minhas alterações no repositório... ...Sendo assim, primeiro eu atualizo minha cópia de trabalho com as mudanças feitas pelos outros e crio uma nova build. Se as mudanças deles chocarem com as minhas mudanças, será exibido erros tanto na compilação quanto nos testes. Neste caso é minha a responsabilidade de corrigir estes erros e repetir o processo até que minha cópia local esteja sincronizada com a versão principal......” Integração contínua @gpupo
  • 13. “...Uma vez que tenho as alterações na minha própria build eu posso finalmente fazer o commit na versão principal, que atualiza o repositório. Entretanto meu commit não termina meu trabalho. Nós fazemos uma build novamente, mas agora em uma maquina de integração baseada na versão principal do código. Somente com o sucesso desta build poderemos dizer que as minhas alterações foram feitas. ” Integração contínua @gpupo
  • 14. “...Sempre existe uma chance de eu ter esquecido alguma coisa na minha máquina e o repositório não ser atualizado corretamente. Somente quando minha build de alterações for lançada com sucesso na máquina de integração é que o meu trabalho terminou...” Integração contínua @gpupo
  • 15. “...Se um choque ocorrer entre as versões de dois desenvolvedores, isso geralmente é pego quando o segundo desenvolvedor atualizar sua cópia local com as builds feitas pelos outros. Caso não, a build de integração deve falhar. De qualquer modo o erro é detectado rapidamente. Nesse momento a tarefa mais importante é consertar os problemas, e fazer sua build voltar a funcionar corretamente....” Integração contínua @gpupo
  • 16. “...A história anterior é uma apresentação da Integração Contínua e de como ela funciona diariamente. Colocar isso tudo pra funcionar sem problemas envolve obviamente mais coisas do que foi dito....” Adaptação do artigo escrito por Martin Fowler http://martinfowler.com/articles/continuousIntegration.html Integração contínua @gpupo
  • 17. “...Em um ambiente de Integração Contínua você nunca deve ter uma build de integração com falhas por muito tempo. Um bom time deve ter muitas builds corretas por dia. Más builds podem ocorrer de tempos em tempos, mas devem ser consertadas rapidamente...” Integração contínua @gpupo
  • 18. Sem C.I. Development Phase Testing Phase Number of Bugs Integration Phase undetected bugs Project Timeline Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008 Integração contínua @gpupo
  • 19. primeiros passos Checkout / Update Local testing Resolve / Testing Develop Update WC Commit ! Receive Build Result Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008 Integração contínua @gpupo
  • 20. Workflow com C.I. Server Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008 Integração contínua @gpupo
  • 21. O que faz • Mantém Logs • Reforça as políticas • Informa status aos desenvolvedores • Mantém rastreabilidade Integração contínua @gpupo
  • 22. Workflow com C.I. Server Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008 Integração contínua @gpupo
  • 23. Padrão é igual a Default?
  • 24. Padrão é igual a Default?
  • 25. Coding Style • Zend Programmer's Reference Guide – Coding Style • http://goo.gl/z9BWj Integração contínua @gpupo
  • 26. Coding Style • PEARManual – Coding Style • http://goo.gl/JYKLu Integração contínua @gpupo
  • 27. Por que padrões diferentes para a mesma coisa ? E uma crítica à comunidade PHP
  • 28. PHP CodeSniffer • PHP CodeSniffer é um analizador de código PHP que escaneia o seu código e mostra erros e alertas baseado em um conjunto de padrões de código. Integração contínua @gpupo
  • 29. PHP CodeSniffer • PHP CodeSniffer é um analizador de código PHP que escaneia o seu código e mostra erros e alertas baseado em um conjunto de padrões de código. www.delicious.com/gpupo/codesniffer Integração contínua @gpupo
  • 30. PHP CodeSniffer • PHP Code Sniffer (PHPCS) is a package for syntax checking, available from PEAR. It can check code against defined rules covering anything from whitespace through doc comments to variable naming conventions and beyond Integração contínua @gpupo
  • 31. PHP CodeSniffer • PHP Code Sniffer (PHPCS) is a package for syntax checking, available from PEAR. It can check code against defined rules covering anything from whitespace through doc comments to variable naming conventions and beyond Integração contínua @gpupo
  • 32.
  • 33.
  • 35. Usage: phpcs [-nwlsapvi] [-d key[=value]] [--report=<report>] [--report-file=<reportfile>] [--report-<report>=<reportfile>] ... [--report-width=<reportWidth>] [--generator=<generator>] [--tab-width=<tabWidth>] [--severity=<severity>] [--error-severity=<severity>] [--warning-severity=<severity>] [--config-set key value] [--config-delete key] [--config-show] [--standard=<standard>] [--sniffs=<sniffs>] [--encoding=<encoding>] [--extensions=<extensions>] [--ignore=<patterns>] <file> ... -n Do not print warnings (shortcut for --warning-severity=0) -w Print both warnings and errors (on by default) -l Local directory only, no recursion -s Show sniff codes in all reports -a Run interactively -p Show progress of the run -v[v][v] Print verbose output -i Show a list of installed coding standards -d Set the [key] php.ini value to [value] or [true] if value is omitted --help Print this help message --version Print version information <file> One or more files and/or directories to check <extensions> A comma separated list of file extensions to check (only valid if checking a directory) <patterns> A comma separated list of patterns to ignore files and directories <encoding> The encoding of the files being checked (default is iso-8859-1) <sniffs> A comma separated list of sniff codes to limit the check to (all sniffs must be part of the specified standard) <severity> The minimum severity required to display an error or warning <standard> The name or path of the coding standard to use <tabWidth> The number of spaces each tab represents <generator> The name of a doc generator to use (forces doc generation instead of checking) <report> Print either the "full", "xml", "checkstyle", "csv", "emacs" "source", "summary", "svnblame" or "gitblame" report (the "full" report is printed by default) <reportfile> Write the report to the specified file path <reportWidth> How many columns wide screen reports should be printed
  • 36.
  • 37.
  • 38.
  • 39. Configure (phpcs LIKE A BOSS) sudo phpcs --config-set default_standard Zend sudo phpcs --config-set zend_ca_path /usr/share/php/phing/tasks/ext/ZendCodeAnalyzerTask.php phpcs --config-show
  • 40.
  • 44. Eclipse plugin http://www.phpsrc.org/eclipse/pti/
  • 45. Eclipse plugin http://www.phpsrc.org/eclipse/pti/
  • 46. Eclipse plugin http://www.phpsrc.org/eclipse/pti/
  • 47. Eclipse plugin http://www.phpsrc.org/eclipse/pti/
  • 48. Eclipse plugin http://www.phpsrc.org/eclipse/pti/ http://www.phpsrc.org/projects/pti/wiki/Installation
  • 49. Eclipse plugin http://www.phpsrc.org/eclipse/pti/ http://www.phpsrc.org/projects/pti/wiki/Installation http://www.phpsrc.org/projects/pti-php-codesniffer/wiki/Configuration
  • 50.
  • 51.
  • 52. $ phpcs --report=source . PHP CODE SNIFFER VIOLATION SOURCE SUMMARY -------------------------------------------------------------------------------- STANDARD CATEGORY SNIFF COUNT -------------------------------------------------------------------------------- Generic White space Disallow tab indent tabs used 3 Generic Files Line length too long 6 PEAR Commenting File comment missing 4 PEAR Commenting Class comment missing 4 PEAR White space Scope indent incorrect 4 PEAR Commenting Function comment missing 4 PEAR Functions Function call signature close bracket line 4 PEAR Functions Function call signature content after open 4 PEAR Commenting Function comment wrong style 2 PEAR Commenting File comment wrong style 2 PEAR White space Object operator indent incorrect 1 -------------------------------------------------------------------------------- A TOTAL OF 48 SNIFF VIOLATION(S) WERE FOUND IN 11 SOURCE(S) -------------------------------------------------------------------------------- Time: 1 second, Memory: 9.25Mb
  • 53. $ phpcs --report=source . PHP CODE SNIFFER VIOLATION SOURCE SUMMARY -------------------------------------------------------------------------------- STANDARD CATEGORY SNIFF COUNT -------------------------------------------------------------------------------- Generic White space Disallow tab indent tabs used 3 Generic Files Line length too long 6 PEAR Commenting File comment missing 4 PEAR Commenting Class comment missing 4 PEAR White space Scope indent incorrect 4 PEAR Commenting Function comment missing 4 PEAR Functions Function call signature close bracket line 4 PEAR Functions Function call signature content after open 4 PEAR Commenting Function comment wrong style 2 PEAR Commenting File comment wrong style 2 PEAR White space Object operator indent incorrect 1 -------------------------------------------------------------------------------- A TOTAL OF 48 SNIFF VIOLATION(S) WERE FOUND IN 11 SOURCE(S) -------------------------------------------------------------------------------- Time: 1 second, Memory: 9.25Mb find /usr/share/php/PHP/CodeSniffer/Standards/ -name "*Sniff.php" -and -not -name "Abstract*"
  • 58.
  • 59. Refactory (PEAR) OpeningFunctionBraceBsdAllmanSniff X OpeningFunctionBraceKernighanRitchieSniff
  • 60.
  • 61.
  • 62. Manual validation Click on the PHP_CodeSniffer toolbar icon to check selected file. Integração contínua @gpupo
  • 63. Eclipse espaces x tabs Integração contínua @gpupo
  • 64. Eclipse templates Integração contínua @gpupo
  • 65. Duplicate code • Duplicate code is a computer programming term for a sequence of source code that occurs more than once, either within a program or across different programs owned or maintained by the same entity. • Duplicate code is generally considered undesirable for a number of reasons. Integração contínua @gpupo
  • 66. Duplicate code • A minimum requirement is usually applied to the quantity of code that must appear in a sequence for it to be considered duplicate rather than coincidentally similar. • Sequences of duplicate code are sometimes known as clones. Integração contínua @gpupo
  • 67. PMD's Copy/Paste Detector (CPD) Integração contínua @gpupo
  • 68. PMD's Copy/Paste Detector (CPD) public class Something { private static int FOO = 2; // Unused private int i = 5; // Unused private int j = 6; public int addOne() { return j++; } } Integração contínua @gpupo
  • 69. PMD's Copy/Paste Detector (CPD) public class Foo { private String baz() { String bar = "howdy"; return bar.toString(); } } Integração contínua @gpupo
  • 70. PHP Copy/Paste Detector • O objetivo do phpcpd é oferecer uma visão geral do código duplicado em um projeto. $ sudo pear channel-discover pear.phpunit.de $ sudo pear channel-discover components.ez.no $ sudo pear install phpunit/phpcpd Integração contínua @gpupo
  • 71. PHP Copy/Paste Detector Usage: phpcpd [switches] <directory|file> ... --log-pmd <file> Write report in PMD-CPD XML format to file. --min-lines <N> Minimum number of identical lines (default: 5). --min-tokens <N> Minimum number of identical tokens (default: 70). --exclude <directory> Exclude <directory> from code analysis. --suffixes <suffix,...> A comma-separated list of file suffixes to check. --help Prints this usage information. --version Prints the version and exits. --verbose Print progress bar. Integração contínua @gpupo
  • 72. PHP Copy/Paste Detector By default phpcpd will search for a minimum of 5 identical lines and 70 identical tokens. So if there are less than 5 duplicate lines in the code or less than 70 identical tokens they will be ignored. Integração contínua @gpupo
  • 73. Localizando duplicações (hands on) $ phpcpd --min-lines 1 --min-tokens 4 src/ phpcpd 1.3.2 by Sebastian Bergmann. Found 1 exact clones with 16 duplicated lines in 1 files: - average.php:6-22 average.php:32-48 31.37% duplicated lines out of 51 total lines of code.
  • 74. average.php (hands on) //continuando.... <?php $array1 = array(3,3,6,7,8); $array1 = array(4,8,5,6); $array2 = array(9,9,8,78,4,6,5); $array2 = array(7,78,8,9); $sum1 = 0; $sum1 = 0; $sum2 = 0; $sum2 = 0; $average1 = 0; $average1 = 0; $average2 = 0; $average2 = 0; for ($i = 0; $i < 4; $i++) for ($i = 0; $i < 4; $i++) { { $sum1 += $array1[$i]; } $sum1 += $array1[$i]; $average1 = $sum1/4; } $average1 = $sum1/4; for ($i = 0; $i < 4; $i++) { for ($i = 0; $i < 4; $i++) $sum2 += $array2[$i]; { } $sum2 += $array2[$i]; $average2 = $sum2/4; } $average2 = $sum2/4; printf("nSoma 2:%dnMédia 2: %d",$average1,$average2); printf("Soma 1:%dnMédia 1: %d",$average1,$average2);
  • 75. average.php (hands on)
  • 76. cp
  • 77. phpDocumentor The complete documentation solution for PHP [sic] Integração contínua @gpupo
  • 78. phpDocumentor Publicos diferentes; - Interno - Externo Integração contínua @gpupo
  • 79. PHP_Depend Gerar um conjunto de métricas de software a partir de uma base de código dado, para medir a qualidade de um projeto de software e ajudam a identificar as partes de uma aplicação onde uma refatoração pode ser aplicada Integração contínua @gpupo
  • 80. PHP_Depend overview pyramid Integração contínua @gpupo
  • 81. P phploc H P Lines Of Code Integração contínua @gpupo
  • 82. phploc tool for quickly measuring the size of a PHP project Integração contínua @gpupo
  • 83. phploc tool for quickly measuring the size of a PHP project $ sudo pear install phpunit/phploc https://github.com/sebastianbergmann/phploc Integração contínua @gpupo
  • 84.
  • 85. PHP Project Wizard (PPW) commandline tool that can be used to generate the scripts and configuration files necessary for the build automation of a PHP project https://github.com/sebastianbergmann/php-project-wizard Integração contínua @gpupo
  • 86. Criando um novo projeto (hands on) $ppw --source src --tests tests --name object-freezer --bootstrap tests/bootstrap.php . $ echo "build" > .gitignore; $ echo "source=${basedir}/src" > build.properties;
  • 87. A formiga atômica! The Apache Ant build.xml build script
  • 88.
  • 89. Zend Framework... $ sudo apt-get install -y zend-framework-bin $ sudo pear channel-discover zend.googlecode.com/svn $ sudo pear install zend/zend $cd src; $ zf create project . Object-freezer; $ mv tests ../ ;
  • 93. Bootstrap de testes Refatorado https://github.com/gpupo/object-freezer/tree/zend
  • 94. Rodando testes $ ~/workspace/object-freezer$ phpunit PHPUnit 3.5.14 by Sebastian Bergmann. . Time: 0 seconds, Memory: 6.50Mb OK (1 test, 4 assertions)
  • 95. PHPUnit Para ter o código auto-testável você necessitará de uma suite de testes automatizados que possa checar uma grande parte da base do código para achar problemas. Os testes necessitam estar aptos para rodarem com um simples comando e serem checados automaticamente. Integração contínua @gpupo
  • 96. Jenkins “In a nutshell Jenkins CI is the leading open-source continuous integration server. Built with Java, it provides over 300 plugins to support building and testing virtually any project.” Integração contínua @gpupo
  • 97. Jenkins “In a nutshell Jenkins CI is the leading open-source continuous integration server. Built with Java, it provides over 300 plugins to support building and testing virtually any project.” www.delicious.com/gpupo/jenkins Integração contínua @gpupo
  • 98. Jenkins on Ubuntu $ wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - ; $ sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'; sudo apt-get update sudo apt-get install jenkins ant Integração contínua @gpupo
  • 99. Jenkins on Ubuntu … Setting up daemon (0.6.4-1) ... Setting up jenkins (1.420) ... Adding system user `jenkins' (UID 125) ... Adding new user `jenkins' (UID 125) with group `nogroup' ... Not creating home directory `/var/lib/jenkins'. * Starting Jenkins Continuous Integration Server jenkins The selected http port (8080) seems to be in use by another program Please select another port to use for jenkins Integração contínua @gpupo
  • 100. Jenkins on Ubuntu • Http://localhost:8080 • http://localhost:8080/manage • http://localhost:8080/pluginManager/available Integração contínua @gpupo
  • 101. Jenkins on Ubuntu • $ sudo /etc/init.d/jenkins { start|stop|status|restart|force-reload } Integração contínua @gpupo
  • 102. Jenkins CLI • java -jar jenkins-cli.jar -s http://localhost:8080/ help Integração contínua @gpupo
  • 103. Jenkins CLI build: Builds a job, and optionally waits until its completion. copy-job: Copies a job • create-job: Creates a new job by reading stdin as a configuration •XML file • enable-job: Enables a job help: Lists all the available commands • install-plugin: Installs a plugin either from a file, an URL, or from •update center • login: Saves the current credential to allow future commands to run without explicit credential information • mail: Reads stdin and sends that out as an e-mail. • Integração contínua @gpupo
  • 104. Instalando plugins wget http://localhost:8080/jnlpJars/jenkins-cli.jar • java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin checkstyle • java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin cloverphp • java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin dry • java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin htmlpublisher • java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin jdepend • java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin git • java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin github • Integração contínua @gpupo
  • 105. Jenkins on Ubuntu java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin plot java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin pmd java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin violations java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin xunit Integração contínua @gpupo
  • 106. Instalando plugins ou $ plugins=( cloverphp dry htmlpublisher jdepend plot pmd violations xunit git github); $ for name in "${plugins[@]}"; do java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin $name; done; Script disponivel em https://gist.github.com/1078415 Integração contínua @gpupo
  • 107. Reload • $ sudo /etc/init.d/jenkins restart Integração contínua @gpupo
  • 108. Seguranca • http://localhost:8080/configure – Enable security • Jenkins's own user database • Save Integração contínua @gpupo
  • 109. Seguranca • http://localhost:8080/configure – Enable security • Jenkins's own user database • Save • Sign UP • Config >> Logged-in users can do anything Integração contínua @gpupo
  • 110. Jenkins Alerts • Configurar envio de e-mail autenticado Integração contínua @gpupo
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119. TODO (right now) Instalar: Jenkins Plugins Jenkins (+GIT) PHP Tools
  • 120. Jenkins + PHP • $ sudo pear channel-discover pear.pdepend.org • $ sudo pear channel-discover pear.phpmd.org • $ sudo pear channel-discover pear.phpunit.de • $ sudo pear channel-discover components.ez.no • $ sudo pear channel-discover pear.symfony-project.com Integração contínua @gpupo
  • 121. Jenkins + PHP • $ sudo pear install pdepend/PHP_Depend • $ sudo pear install phpmd/PHP_PMD • $ sudo pear install phpunit/phpcpd • $ sudo pear install phpunit/phploc Integração contínua @gpupo
  • 122. Jenkins + PHP • $ sudo pear install PHPDocumentor • $ sudo pear install PHP_CodeSniffer • $ sudo pear install pear/Text_Highlighter-beta • $ sudo pear install pear/HTTP_Request2-beta • $ sudo pear install phpunit/ppw Integração contínua @gpupo
  • 123. Jenkins + PHP • $ sudo pear install –alldeps phpunit/PHP_CodeBrowser • $ sudo pear install –alldeps phpunit/PHPUnitear install PHPDocumentor Integração contínua @gpupo
  • 124. Jenkins template • $ cd /var/lib/jenkins/jobs/ • $ sudo git clone git://github.com/sebastianbergmann/php-jenkins-template.git php-template • $ sudo chown -R jenkins:nogroup php-template/ Integração contínua @gpupo
  • 125. Jenkins + PHP • $ cd /var/lib/jenkins/jobs/ • $ git clone RELOAD! git://github.com/sebastianbergmann/php-jenkins-template.git php-template • $sudo chown -R jenkins:nogroup php-template/ Integração contínua @gpupo
  • 126. O Pulo do Gato
  • 127. Jenkins + GIT • $ sudo su - jenkins • $ ssh-keygen -t rsa -C "jenkins@hotellinux.com" • $ git config --global user.email "jenkins@hotellinux.com" • $ git config --global user.name "Jenkins Robot" Integração contínua @gpupo
  • 128. Jenkins + GIT • Adicionar Chave ao Repositório Integração contínua @gpupo
  • 129. Jenkins + GIT • Adicionar Chave ao Repositório • $ ssh git@github.com Integração contínua @gpupo
  • 130.
  • 132. Jenkins + GIT • $ sudo su - jenkins • $ ssh-keygen -t rsa -C "jenkins@hotellinux.com" • $ git config --global user.email "jenkins@hotellinux.com" • $ git config --global user.name "Jenkins Robot" Integração contínua @gpupo
  • 133. Template for Jenkins Jobs for PHP Projects • Adivinha de quem éo projeto? Integração contínua @gpupo
  • 134. Template for Jenkins Jobs for PHP Projects • Adivinha de quem éo projeto? Integração contínua @gpupo
  • 135. Criando um job PHP no Jenkins • Nome do projeto exemplo: "Object-Freezer". • Selecione "Copy existing job" e escreva "php-template" no campo "Copy from". • Substitua as duas ocorrencias de "job-name" pelo nome do projeto, no campo "Description". • Desabilite a opcao "Disable Build". • Preencha as informacoes do repositorio GIT. • Configure o "Build Trigger" como "Poll SCM". Integração contínua @gpupo
  • 136. Criando um job PHP no Jenkins Integração contínua @gpupo
  • 137. Criando um job PHP no Jenkins Integração contínua @gpupo
  • 138. Jenkins alerts Integração contínua @gpupo
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144. Jenkins alerts Integração contínua @gpupo
  • 145. Jenkins jobs Integração contínua @gpupo
  • 146. Jenkins job Integração contínua @gpupo
  • 147. Job/documentação Integração contínua @gpupo
  • 148. Job/testes Integração contínua @gpupo
  • 149. Job/testes Integração contínua @gpupo
  • 150. Job/histórico Integração contínua @gpupo
  • 151. Job/estilo Integração contínua @gpupo
  • 152. Job/cobertura Integração contínua @gpupo
  • 153. Job/violações Integração contínua @gpupo
  • 154. Job/CodeBrowser Integração contínua @gpupo
  • 155. Job/CodeBrowser Integração contínua @gpupo
  • 156. Job/workspace Integração contínua @gpupo
  • 157. Job/Build Time Trend Integração contínua @gpupo
  • 158. Customizando Quero que meu projeto avalie apenas o Coding style Zend. Como configurar? Integração contínua @gpupo
  • 159. Customizando Quero que meu projeto avalie apenas o Coding style Zend. Como configurar? build.xml: Integração contínua @gpupo
  • 160. Customizando Como configurar a codificação do meu projeto? Integração contínua @gpupo
  • 161. Customizando Como configurar a codificação do meu projeto? build.xml: ///... <target name="phpcs" description="Generate checkstyle.xml using PHP_CodeSniffer"> <exec executable="phpcs" output="/dev/null"> <arg line="--report=checkstyle --report-file=${basedir}/build/logs/checkstyle.xml --standard=PEAR --encoding=iso-8859-1 ${source}" /> </exec> </target> //... Integração contínua @gpupo
  • 162. Jenkins + capistrano • soon Integração contínua @gpupo
  • 163.
  • 164.
  • 165.
  • 166.
  • 167. Referências - https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu - https://github.com/sebastianbergmann/php-project-wizard - https://github.com/sebastianbergmann/phpcpd - https://gist.github.com/1078415 http://www.delicious.com/gpupo/ci