Integração contínua em PHP com Jenkins

15,079 views

Published on

V.8

Published in: Technology

Integração contínua em PHP com Jenkins

  1. 1. Integração contínua em PHP Automating PHP Continuous Integration with Jenkins Gilmar Pupo @gpupo
  2. 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. 3. PHPUnitPHP_CodeSnifferphpcpdJenkinsFerramentasAnt < Git CapistranoTestes UnitáriosTestesFuncionaisDocumentação
  4. 4. PHPUnitPHP_CodeSnifferphpcpdJenkinsFerramentasAnt < GitTestes UnitáriosTestesFuncionaisDocumentação www.delicious.com/gpupo/ci
  5. 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. 6. O que faz• Verifica padrões• Gera relatórios e alertas• Gera documentação Integração contínua @gpupo
  7. 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. 8. Compatibilidade• Incompatível com Cowboy coding OS http://en.wikipedia.org/wiki/Cowboy_coding Integração contínua @gpupo
  9. 9. http://martinfowler.com/articles/continuousIntegration.html
  10. 10. “...em minha cópia de trabalho e faço oque preciso para completar minhatarefa. Isso irá consistir em alterar ocódigo de produção e tambémadicionar ou alterar os testesautomatizados.Integração Contínua assume um altonível de testes que são automatizadosno software: uma facilidade que euchamo de self-testing code...” Integração contínua @gpupo
  11. 11. “...Uma vez que eu terminei, eu faço uma buildautomatizada na minha máquina dedesenvolvimento.Assim, o código fonte em minha cópia detrabalho é pego, compilado e transformado emum executável – e então é executado os testesautomáticos.Somente se todas as builds e testes não tiveremerros que tudo será considerado bom...” Integração contínua @gpupo
  12. 12. “....Com uma boa build, eu posso então pensar emcolocar minhas alterações no repositório......Sendo assim, primeiro eu atualizo minha cópia detrabalho com as mudanças feitas pelos outros e criouma nova build. Se as mudanças deles chocarem comas minhas mudanças, será exibido erros tanto nacompilação quanto nos testes. Neste caso é minha aresponsabilidade de corrigir estes erros e repetir oprocesso até que minha cópia local esteja sincronizadacom a versão principal......” Integração contínua @gpupo
  13. 13. “...Uma vez que tenho as alterações na minha própriabuild eu posso finalmente fazer o commit na versãoprincipal, que atualiza o repositório.Entretanto meu commit não termina meu trabalho.Nós fazemos uma build novamente, mas agora emuma maquina de integração baseada na versãoprincipal do código. Somente com o sucesso destabuild poderemos dizer que as minhas alteraçõesforam feitas. ” Integração contínua @gpupo
  14. 14. “...Sempre existe uma chance de eu teresquecido alguma coisa na minha máquina eo repositório não ser atualizado corretamente.Somente quando minha build de alteraçõesfor lançada com sucesso na máquina deintegração é que o meu trabalho terminou...” Integração contínua @gpupo
  15. 15. “...Se um choque ocorrer entre as versões de doisdesenvolvedores, isso geralmente é pego quando osegundo desenvolvedor atualizar sua cópia local comas 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 afuncionar corretamente....” Integração contínua @gpupo
  16. 16. “...A história anterior é uma apresentação daIntegração Contínua e de como ela funcionadiariamente. Colocar isso tudo pra funcionar semproblemas envolve obviamente mais coisas doque foi dito....” Adaptação do artigo escrito por Martin Fowler http://martinfowler.com/articles/continuousIntegration.html Integração contínua @gpupo
  17. 17. “...Em um ambiente de IntegraçãoContínua você nunca deve ter uma buildde integração com falhas por muitotempo. Um bom time deve ter muitasbuilds corretas por dia.Más builds podem ocorrer de tempos emtempos, mas devem ser consertadasrapidamente...” Integração contínua @gpupo
  18. 18. Sem C.I. Development Phase Testing PhaseNumber 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. 19. primeiros passosCheckout / 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. 20. Workflow com C.I. Server Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008 Integração contínua @gpupo
  21. 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. 22. Workflow com C.I. Server Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008 Integração contínua @gpupo
  23. 23. Padrão é igual aDefault?
  24. 24. Padrão é igual aDefault?
  25. 25. Coding Style • Zend Programmers Reference Guide – Coding Style • http://goo.gl/z9BWj Integração contínua @gpupo
  26. 26. Coding Style • PEARManual – Coding Style • http://goo.gl/JYKLu Integração contínua @gpupo
  27. 27. Por que padrõesdiferentes para a mesma coisa ? E uma crítica àcomunidade PHP
  28. 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. 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. 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. 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. 32. LINHa
  33. 33. 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
  34. 34. Configure (phpcs LIKE A BOSS)sudo phpcs --config-set default_standard Zendsudo phpcs --config-set zend_ca_path /usr/share/php/phing/tasks/ext/ZendCodeAnalyzerTask.phpphpcs --config-show
  35. 35. phpcs --standard=/path/to/custom_ruleset.xml test.php
  36. 36. phpcs --standard=/path/to/custom_ruleset.xml test.php
  37. 37. phpcs --standard=/path/to/custom_ruleset.xml test.php
  38. 38. Eclipse pluginhttp://www.phpsrc.org/eclipse/pti/
  39. 39. Eclipse pluginhttp://www.phpsrc.org/eclipse/pti/
  40. 40. Eclipse pluginhttp://www.phpsrc.org/eclipse/pti/
  41. 41. Eclipse pluginhttp://www.phpsrc.org/eclipse/pti/
  42. 42. Eclipse pluginhttp://www.phpsrc.org/eclipse/pti/http://www.phpsrc.org/projects/pti/wiki/Installation
  43. 43. Eclipse plugin http://www.phpsrc.org/eclipse/pti/http://www.phpsrc.org/projects/pti/wiki/Installationhttp://www.phpsrc.org/projects/pti-php-codesniffer/wiki/Configuration
  44. 44. $ phpcs --report=source .PHP CODE SNIFFER VIOLATION SOURCE SUMMARY--------------------------------------------------------------------------------STANDARD CATEGORY SNIFF COUNT--------------------------------------------------------------------------------Generic White space Disallow tab indent tabs used 3Generic Files Line length too long 6PEAR Commenting File comment missing 4PEAR Commenting Class comment missing 4PEAR White space Scope indent incorrect 4PEAR Commenting Function comment missing 4PEAR Functions Function call signature close bracket line 4PEAR Functions Function call signature content after open 4PEAR Commenting Function comment wrong style 2PEAR Commenting File comment wrong style 2PEAR 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
  45. 45. $ 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.25Mbfind /usr/share/php/PHP/CodeSniffer/Standards/ -name "*Sniff.php" -and -not -name "Abstract*"
  46. 46. Está correto?
  47. 47. Está correto?phpcs --standard=Zendrecipe.class.php
  48. 48. Está correto?
  49. 49. Está correto?phpcs --standard=Zendrecipe.class.phpphpcs recipe.class.php
  50. 50. Refactory (PEAR) OpeningFunctionBraceBsdAllmanSniff XOpeningFunctionBraceKernighanRitchieSniff
  51. 51. Manual validation Click on the PHP_CodeSniffer toolbar icon to check selected file. Integração contínua @gpupo
  52. 52. Eclipse espaces x tabs Integração contínua @gpupo
  53. 53. Eclipse templates Integração contínua @gpupo
  54. 54. 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
  55. 55. 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
  56. 56. PMDs Copy/Paste Detector (CPD) Integração contínua @gpupo
  57. 57. PMDs 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
  58. 58. PMDs Copy/Paste Detector (CPD)public class Foo { private String baz() { String bar = "howdy"; return bar.toString(); }} Integração contínua @gpupo
  59. 59. 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
  60. 60. PHP Copy/Paste DetectorUsage: 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
  61. 61. PHP Copy/Paste DetectorBy default phpcpd will search for aminimum of 5 identical lines and 70identical tokens.So if there are less than 5 duplicatelines in the code or less than 70identical tokens they will be ignored. Integração contínua @gpupo
  62. 62. 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-4831.37% duplicated lines out of 51 total lines of code.
  63. 63. 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);
  64. 64. average.php (hands on)
  65. 65. cp
  66. 66. phpDocumentorThe complete documentation solutionfor PHP [sic] Integração contínua @gpupo
  67. 67. phpDocumentorPublicos diferentes; - Interno - Externo Integração contínua @gpupo
  68. 68. PHP_DependGerar um conjunto de métricas desoftware a partir de uma base decódigo dado, para medir a qualidadede um projeto de software e ajudam aidentificar as partes de uma aplicaçãoonde uma refatoração pode seraplicada Integração contínua @gpupo
  69. 69. PHP_Depend overview pyramid Integração contínua @gpupo
  70. 70. P phplocHPLinesOfCode Integração contínua @gpupo
  71. 71. phploctool for quickly measuring the size of a PHP project Integração contínua @gpupo
  72. 72. phploctool for quickly measuring the size of a PHP project $ sudo pear install phpunit/phploc https://github.com/sebastianbergmann/phploc Integração contínua @gpupo
  73. 73. 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
  74. 74. 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;
  75. 75. A formiga atômica!The Apache Ant build.xml build script
  76. 76. 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 ../ ;
  77. 77. Estrutura atual
  78. 78. Estrutura atual
  79. 79. Estrutura atual
  80. 80. Bootstrap de testes Refatoradohttps://github.com/gpupo/object-freezer/tree/zend
  81. 81. Rodando testes$ ~/workspace/object-freezer$ phpunitPHPUnit 3.5.14 by Sebastian Bergmann..Time: 0 seconds, Memory: 6.50MbOK (1 test, 4 assertions)
  82. 82. PHPUnitPara 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. Ostestes necessitam estar aptos pararodarem com um simples comando e serem checados automaticamente. Integração contínua @gpupo
  83. 83. Jenkins“In a nutshell Jenkins CI is the leadingopen-source continuous integrationserver. Built with Java, it provides over300 plugins to support building andtesting virtually any project.” Integração contínua @gpupo
  84. 84. Jenkins“In a nutshell Jenkins CI is the leadingopen-source continuous integrationserver. Built with Java, it provides over300 plugins to support building andtesting virtually any project.” www.delicious.com/gpupo/jenkins Integração contínua @gpupo
  85. 85. 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 updatesudo apt-get install jenkins ant Integração contínua @gpupo
  86. 86. 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 byanother programPlease select another port to use for jenkins Integração contínua @gpupo
  87. 87. Jenkins on Ubuntu• Http://localhost:8080• http://localhost:8080/manage• http://localhost:8080/pluginManager/available Integração contínua @gpupo
  88. 88. Jenkins on Ubuntu• $ sudo /etc/init.d/jenkins { start|stop|status|restart|force-reload } Integração contínua @gpupo
  89. 89. Jenkins CLI• java -jar jenkins-cli.jar -s http://localhost:8080/ help Integração contínua @gpupo
  90. 90. 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
  91. 91. 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
  92. 92. Jenkins on Ubuntujava -jar jenkins-cli.jar -s http://localhost:8080 install-pluginplotjava -jar jenkins-cli.jar -s http://localhost:8080 install-pluginpmdjava -jar jenkins-cli.jar -s http://localhost:8080 install-pluginviolationsjava -jar jenkins-cli.jar -s http://localhost:8080 install-pluginxunit Integração contínua @gpupo
  93. 93. 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
  94. 94. Reload• $ sudo /etc/init.d/jenkins restart Integração contínua @gpupo
  95. 95. Seguranca• http://localhost:8080/configure – Enable security • Jenkinss own user database • Save Integração contínua @gpupo
  96. 96. Seguranca• http://localhost:8080/configure – Enable security • Jenkinss own user database • Save • Sign UP • Config >> Logged-in users can do anything Integração contínua @gpupo
  97. 97. Jenkins Alerts• Configurar envio de e-mail autenticado Integração contínua @gpupo
  98. 98. TODO (right now) Instalar: JenkinsPlugins Jenkins (+GIT) PHP Tools
  99. 99. 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
  100. 100. 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
  101. 101. 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
  102. 102. Jenkins + PHP• $ sudo pear install –alldeps phpunit/PHP_CodeBrowser• $ sudo pear install –alldeps phpunit/PHPUnitear install PHPDocumentor Integração contínua @gpupo
  103. 103. 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
  104. 104. 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
  105. 105. O Pulo do Gato
  106. 106. 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
  107. 107. Jenkins + GIT• Adicionar Chave ao Repositório Integração contínua @gpupo
  108. 108. Jenkins + GIT• Adicionar Chave ao Repositório• $ ssh git@github.com Integração contínua @gpupo
  109. 109. Em branco!
  110. 110. 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
  111. 111. Template for JenkinsJobs for PHP Projects • Adivinha de quem éo projeto? Integração contínua @gpupo
  112. 112. Template for JenkinsJobs for PHP Projects • Adivinha de quem éo projeto? Integração contínua @gpupo
  113. 113. 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
  114. 114. Criando um job PHP no Jenkins Integração contínua @gpupo
  115. 115. Criando um job PHP no Jenkins Integração contínua @gpupo
  116. 116. Jenkins alerts Integração contínua @gpupo
  117. 117. Jenkins alerts Integração contínua @gpupo
  118. 118. Jenkins jobs Integração contínua @gpupo
  119. 119. Jenkins job Integração contínua @gpupo
  120. 120. Job/documentação Integração contínua @gpupo
  121. 121. Job/testes Integração contínua @gpupo
  122. 122. Job/testes Integração contínua @gpupo
  123. 123. Job/histórico Integração contínua @gpupo
  124. 124. Job/estilo Integração contínua @gpupo
  125. 125. Job/cobertura Integração contínua @gpupo
  126. 126. Job/violações Integração contínua @gpupo
  127. 127. Job/CodeBrowser Integração contínua @gpupo
  128. 128. Job/CodeBrowser Integração contínua @gpupo
  129. 129. Job/workspace Integração contínua @gpupo
  130. 130. Job/Build Time Trend Integração contínua @gpupo
  131. 131. CustomizandoQuero que meu projeto avalie apenas o Coding style Zend. Como configurar? Integração contínua @gpupo
  132. 132. Customizando Quero que meu projeto avalie apenas o Coding style Zend. Como configurar?build.xml: Integração contínua @gpupo
  133. 133. CustomizandoComo configurar a codificação do meu projeto? Integração contínua @gpupo
  134. 134. Customizando Como configurar a codificação do meu projeto?build.xml:///...<target name="phpcs" description="Generate checkstyle.xml usingPHP_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
  135. 135. Jenkins + capistrano• soon Integração contínua @gpupo
  136. 136. 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

×