integração contínua em php com jenkins
DESCRIPTION
V.8TRANSCRIPT
![Page 1: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/1.jpg)
IntegraçãoIntegraçãocontínuacontínua
em PHPem PHP
Gilmar PupoGilmar Pupo@gpupo@gpupo
Automating PHP Automating PHP Continuous Continuous
Integration with Integration with JenkinsJenkins
![Page 2: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/2.jpg)
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 @gpupoIntegração contínua @gpupo
![Page 3: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/3.jpg)
PHPUnitPHP_CodeSniffer
phpcpdJenkins
Ant Git CapistranoTestes UnitáriosTestes FuncionaisDocumentação
Ferramentas <
![Page 4: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/4.jpg)
PHPUnitPHP_CodeSniffer
phpcpdJenkins
Ant GitTestes UnitáriosTestes FuncionaisDocumentação
Ferramentas <
www.delicious.com/gpupo/ci
![Page 5: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/5.jpg)
Para que serve
Integração contínua @gpupoIntegração contínua @gpupo
• Reduzir retrabalho
• Reduzir custo de entrega
• Código de manutenção barata
• Identificar erros mais cedo
![Page 6: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/6.jpg)
O que faz
Integração contínua @gpupoIntegração contínua @gpupo
• Verifica padrões
• Gera relatórios e alertas
• Gera documentação
![Page 7: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/7.jpg)
O que faz
Integração contínua @gpupoIntegração contínua @gpupo
• Verifica duplicidade de código
• Recomenda o encapsulamento
• Identifica a % de código coberto
• Gera pacotes
![Page 8: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/8.jpg)
Compatibilidade
Integração contínua @gpupoIntegração contínua @gpupo
• Incompatível com Cowboy coding OS
http://en.wikipedia.org/wiki/Cowboy_coding
![Page 9: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/9.jpg)
http://martinfowler.com/articles/continuousIntegration.html
![Page 10: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/10.jpg)
Integração contínua @gpupoIntegração contínua @gpupo
“...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...”
![Page 11: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/11.jpg)
Integração contínua @gpupoIntegraçã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...”
![Page 12: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/12.jpg)
Integração contínua @gpupoIntegraçã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......”
![Page 13: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/13.jpg)
Integração contínua @gpupoIntegraçã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. ”
![Page 14: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/14.jpg)
Integração contínua @gpupoIntegraçã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...”
![Page 15: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/15.jpg)
Integração contínua @gpupoIntegraçã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....”
![Page 16: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/16.jpg)
Integração contínua @gpupoIntegraçã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
![Page 17: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/17.jpg)
Integração contínua @gpupoIntegraçã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...”
![Page 18: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/18.jpg)
Sem C.I.
Integração contínua @gpupoIntegração contínua @gpupo
Nu
mb
er o
f B
ug
s
undetected bugs
Project Timeline
Development Phase Testing PhaseIntegration Phase
Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008
![Page 19: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/19.jpg)
primeiros passos
Integração contínua @gpupoIntegração contínua @gpupo
Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008
Checkout / Update
Develop
Local testing
Update WC
Resolve / Testing
Commit
ReceiveBuild Result
!
![Page 20: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/20.jpg)
Workflow com C.I. Server
Integração contínua @gpupoIntegração contínua @gpupo
Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008
![Page 21: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/21.jpg)
O que faz
Integração contínua @gpupoIntegração contínua @gpupo
• Mantém Logs
• Reforça as políticas
• Informa status aos desenvolvedores
• Mantém rastreabilidade
![Page 22: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/22.jpg)
Workflow com C.I. Server
Integração contínua @gpupoIntegração contínua @gpupo
Gráfico de Arno Schneider @Barcelona PHP Conference, Feb. 23rd 2008
![Page 23: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/23.jpg)
Padrão é Padrão é igual a igual a
Default?Default?
![Page 24: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/24.jpg)
Padrão é Padrão é igual a igual a
Default?Default?
![Page 25: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/25.jpg)
Coding Style
• Zend Programmer's Reference Guide
– Coding Style
• http://goo.gl/z9BWj
Integração contínua @gpupoIntegração contínua @gpupo
![Page 26: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/26.jpg)
Coding Style
• PEAR\\Manual– Coding Style
• http://goo.gl/JYKLu
Integração contínua @gpupoIntegração contínua @gpupo
![Page 27: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/27.jpg)
Por que padrões Por que padrões diferentes para a diferentes para a
mesma coisa ?mesma coisa ?E uma crítica à E uma crítica à
comunidade PHPcomunidade PHP
![Page 28: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/28.jpg)
PHP CodeSniffer
Integração contínua @gpupoIntegração contínua @gpupo
• 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.
![Page 29: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/29.jpg)
PHP CodeSniffer
Integração contínua @gpupoIntegração contínua @gpupo
• 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
![Page 30: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/30.jpg)
PHP CodeSniffer
Integração contínua @gpupoIntegração contínua @gpupo
• 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
![Page 31: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/31.jpg)
PHP CodeSniffer
Integração contínua @gpupoIntegração contínua @gpupo
• 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
![Page 32: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/32.jpg)
![Page 33: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/33.jpg)
![Page 34: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/34.jpg)
LINHa
![Page 35: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/35.jpg)
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
![Page 36: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/36.jpg)
![Page 37: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/37.jpg)
![Page 38: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/38.jpg)
![Page 39: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/39.jpg)
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.php
phpcs --config-show
![Page 40: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/40.jpg)
![Page 41: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/41.jpg)
phpcs --standard=/path/to/custom_ruleset.xml test.phpphpcs --standard=/path/to/custom_ruleset.xml test.php
![Page 42: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/42.jpg)
phpcs --standard=/path/to/custom_ruleset.xml test.phpphpcs --standard=/path/to/custom_ruleset.xml test.php
![Page 43: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/43.jpg)
phpcs --standard=/path/to/custom_ruleset.xml test.phpphpcs --standard=/path/to/custom_ruleset.xml test.php
![Page 44: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/44.jpg)
Eclipse plugin
http://www.phpsrc.org/eclipse/pti/
![Page 45: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/45.jpg)
Eclipse plugin
http://www.phpsrc.org/eclipse/pti/
![Page 46: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/46.jpg)
Eclipse plugin
http://www.phpsrc.org/eclipse/pti/
![Page 47: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/47.jpg)
Eclipse plugin
http://www.phpsrc.org/eclipse/pti/
![Page 48: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/48.jpg)
Eclipse plugin
http://www.phpsrc.org/eclipse/pti/
http://www.phpsrc.org/projects/pti/wiki/Installation
![Page 49: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/49.jpg)
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
![Page 50: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/50.jpg)
![Page 51: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/51.jpg)
![Page 52: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/52.jpg)
$ 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
![Page 53: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/53.jpg)
$ 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
find /usr/share/php/PHP/CodeSniffer/Standards/ -name "*Sniff.php" -and -not -name "Abstract*"
![Page 54: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/54.jpg)
Está correto?
![Page 55: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/55.jpg)
Está correto?
phpcs --standard=Zend recipe.class.php
![Page 56: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/56.jpg)
Está correto?
![Page 57: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/57.jpg)
Está correto?
phpcs --standard=Zend recipe.class.php
phpcs recipe.class.php
![Page 58: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/58.jpg)
![Page 59: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/59.jpg)
Refactory (PEAR)
OpeningFunctionBraceBsdAllmanSniff
XOpeningFunctionBraceKernighanRitchieSniff
![Page 60: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/60.jpg)
![Page 61: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/61.jpg)
![Page 62: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/62.jpg)
Manual validation
Integração contínua @gpupoIntegração contínua @gpupo
Click on the PHP_CodeSniffer
toolbar icon to check selected file.
![Page 63: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/63.jpg)
Eclipse espaces x tabs
Integração contínua @gpupoIntegração contínua @gpupo
![Page 64: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/64.jpg)
Eclipse templates
Integração contínua @gpupoIntegração contínua @gpupo
![Page 65: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/65.jpg)
Duplicate code
Integração contínua @gpupoIntegração contínua @gpupo
• 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.
![Page 66: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/66.jpg)
Duplicate code
Integração contínua @gpupoIntegração contínua @gpupo
• 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.
![Page 67: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/67.jpg)
PMD's Copy/Paste Detector (CPD)
Integração contínua @gpupoIntegração contínua @gpupo
![Page 68: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/68.jpg)
PMD's Copy/Paste Detector (CPD)
Integração contínua @gpupoIntegração contínua @gpupo
public class Something { private static int FOO = 2; // Unused private int i = 5; // Unused private int j = 6; public int addOne() { return j++; }}
![Page 69: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/69.jpg)
PMD's Copy/Paste Detector (CPD)
Integração contínua @gpupoIntegração contínua @gpupo
public class Foo { private String baz() { String bar = "howdy"; return bar.toString(); }}
![Page 70: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/70.jpg)
PHP Copy/Paste Detector
Integração contínua @gpupoIntegração contínua @gpupo
• 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
![Page 71: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/71.jpg)
PHP Copy/Paste Detector
Integração contínua @gpupoIntegração contínua @gpupo
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.
![Page 72: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/72.jpg)
PHP Copy/Paste Detector
Integração contínua @gpupoIntegração contínua @gpupo
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.
![Page 73: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/73.jpg)
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.
![Page 74: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/74.jpg)
average.php (hands on)
<?php
$array1 = array(4,8,5,6);$array2 = array(7,78,8,9); $sum1 = 0;$sum2 = 0;$average1 = 0;$average2 = 0; for ($i = 0; $i < 4; $i++){ $sum1 += $array1[$i];}$average1 = $sum1/4; for ($i = 0; $i < 4; $i++){ $sum2 += $array2[$i];}$average2 = $sum2/4;
printf("Soma 1:%d\nMédia 1: %d",$average1,$average2);
//continuando....
$array1 = array(3,3,6,7,8);$array2 = array(9,9,8,78,4,6,5); $sum1 = 0;$sum2 = 0;$average1 = 0;$average2 = 0; for ($i = 0; $i < 4; $i++){ $sum1 += $array1[$i];}$average1 = $sum1/4; for ($i = 0; $i < 4; $i++){ $sum2 += $array2[$i];}$average2 = $sum2/4;
printf("\nSoma 2:%d\nMédia 2: %d",$average1,$average2);
![Page 75: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/75.jpg)
average.php (hands on)
![Page 76: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/76.jpg)
cp
![Page 77: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/77.jpg)
phpDocumentor
Integração contínua @gpupoIntegração contínua @gpupo
The complete documentation solution for PHP [sic]
![Page 78: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/78.jpg)
phpDocumentor
Integração contínua @gpupoIntegração contínua @gpupo
Publicos diferentes; - Interno - Externo
![Page 79: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/79.jpg)
PHP_Depend
Integração contínua @gpupoIntegração contínua @gpupo
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
![Page 80: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/80.jpg)
PHP_Dependoverview pyramid
Integração contínua @gpupoIntegração contínua @gpupo
![Page 81: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/81.jpg)
phploc
Integração contínua @gpupoIntegração contínua @gpupo
PHPLinesOfCode
![Page 82: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/82.jpg)
phploc
Integração contínua @gpupoIntegração contínua @gpupo
tool for quickly measuring the size of a PHP project
![Page 83: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/83.jpg)
phploc
Integração contínua @gpupoIntegração contínua @gpupo
tool for quickly measuring the size of a PHP project
$ sudo pear install phpunit/phploc
https://github.com/sebastianbergmann/phploc
![Page 84: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/84.jpg)
![Page 85: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/85.jpg)
PHP Project Wizard (PPW)
Integração contínua @gpupoIntegração contínua @gpupo
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
![Page 86: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/86.jpg)
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;
![Page 87: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/87.jpg)
A formiga atômica!
The Apache Ant build.xml build script
![Page 88: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/88.jpg)
![Page 89: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/89.jpg)
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 ../ ;
![Page 90: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/90.jpg)
Estrutura atual
![Page 91: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/91.jpg)
Estrutura atual
![Page 92: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/92.jpg)
Estrutura atual
![Page 93: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/93.jpg)
Bootstrapde testesRefatorado
https://github.com/gpupo/object-freezer/tree/zend
![Page 94: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/94.jpg)
Rodando testes$ ~/workspace/object-freezer$ phpunit PHPUnit 3.5.14 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 6.50Mb
OK (1 test, 4 assertions)
![Page 95: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/95.jpg)
PHPUnit
Integração contínua @gpupoIntegração contínua @gpupo
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.
![Page 96: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/96.jpg)
Jenkins
Integração contínua @gpupoIntegração contínua @gpupo
“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.”
![Page 97: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/97.jpg)
Jenkins
Integração contínua @gpupoIntegração contínua @gpupo
“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
![Page 98: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/98.jpg)
Jenkins on Ubuntu
Integração contínua @gpupoIntegração contínua @gpupo
$ 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
![Page 99: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/99.jpg)
Jenkins on Ubuntu
Integração contínua @gpupoIntegração contínua @gpupo
…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
![Page 100: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/100.jpg)
Jenkins on Ubuntu
Integração contínua @gpupoIntegração contínua @gpupo
• Http://localhost:8080
• http://localhost:8080/manage
• http://localhost:8080/pluginManager/available
![Page 101: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/101.jpg)
Jenkins on Ubuntu
Integração contínua @gpupoIntegração contínua @gpupo
• $ sudo /etc/init.d/jenkins { start|stop|status|restart|force-reload}
![Page 102: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/102.jpg)
Jenkins CLI
Integração contínua @gpupoIntegração contínua @gpupo
• java -jar jenkins-cli.jar -s \ http://localhost:8080/ help
![Page 103: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/103.jpg)
Jenkins CLI
Integração contínua @gpupoIntegração contínua @gpupo
•
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.
![Page 104: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/104.jpg)
Instalando plugins
Integração contínua @gpupoIntegração contínua @gpupo
• 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
![Page 105: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/105.jpg)
Jenkins on Ubuntu
Integração contínua @gpupoIntegração contínua @gpupo
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
![Page 106: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/106.jpg)
Instalando plugins
Integração contínua @gpupoIntegração contínua @gpupo
$ 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;
ou
Script disponivel em https://gist.github.com/1078415
![Page 107: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/107.jpg)
Reload
Integração contínua @gpupoIntegração contínua @gpupo
• $ sudo /etc/init.d/jenkins restart
![Page 108: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/108.jpg)
Seguranca
Integração contínua @gpupoIntegração contínua @gpupo
• http://localhost:8080/configure– Enable security
• Jenkins's own user database• Save
![Page 109: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/109.jpg)
Seguranca
Integração contínua @gpupoIntegração contínua @gpupo
• http://localhost:8080/configure– Enable security
• Jenkins's own user database• Save• Sign UP• Config >> Logged-in users can do anything
![Page 110: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/110.jpg)
Jenkins Alerts
Integração contínua @gpupoIntegração contínua @gpupo
• Configurar envio de e-mail autenticado
![Page 111: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/111.jpg)
![Page 112: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/112.jpg)
![Page 113: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/113.jpg)
![Page 114: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/114.jpg)
![Page 115: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/115.jpg)
![Page 116: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/116.jpg)
![Page 117: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/117.jpg)
![Page 118: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/118.jpg)
![Page 119: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/119.jpg)
TODO (right now)
Instalar:
JenkinsPlugins Jenkins (+GIT)
PHP Tools
![Page 120: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/120.jpg)
Jenkins + PHP
Integração contínua @gpupoIntegração contínua @gpupo
• $ 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
![Page 121: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/121.jpg)
Jenkins + PHP
Integração contínua @gpupoIntegração contínua @gpupo
• $ sudo pear install pdepend/PHP_Depend
• $ sudo pear install phpmd/PHP_PMD
• $ sudo pear install phpunit/phpcpd
• $ sudo pear install phpunit/phploc
![Page 122: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/122.jpg)
Jenkins + PHP
Integração contínua @gpupoIntegração contínua @gpupo
• $ 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
![Page 123: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/123.jpg)
Jenkins + PHP
Integração contínua @gpupoIntegração contínua @gpupo
• $ sudo pear install –alldeps \ phpunit/PHP_CodeBrowser
• $ sudo pear install –alldeps \ phpunit/PHPUnitear install PHPDocumentor
![Page 124: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/124.jpg)
Jenkins template
Integração contínua @gpupoIntegração contínua @gpupo
• $ 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/
![Page 125: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/125.jpg)
Jenkins + PHP
Integração contínua @gpupoIntegração contínua @gpupo
• $ cd /var/lib/jenkins/jobs/
• $ git clone \git://github.com/sebastianbergmann/php-jenkins-template.git php-template
• $sudo chown -R jenkins:nogroup \php-template/
RELOAD!
![Page 126: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/126.jpg)
O Pulo do GatoO Pulo do Gato
![Page 127: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/127.jpg)
Jenkins + GIT
Integração contínua @gpupoIntegração contínua @gpupo
• $ sudo su - jenkins
• $ ssh-keygen -t rsa -C "[email protected]"
• $ git config --global user.email \ "[email protected]"
• $ git config --global user.name "Jenkins Robot"
![Page 128: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/128.jpg)
Jenkins + GIT
Integração contínua @gpupoIntegração contínua @gpupo
• Adicionar Chave ao Repositório
![Page 129: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/129.jpg)
Jenkins + GIT
Integração contínua @gpupoIntegração contínua @gpupo
• Adicionar Chave ao Repositório
• $ ssh [email protected]
![Page 130: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/130.jpg)
![Page 131: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/131.jpg)
Em branco!
![Page 132: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/132.jpg)
Jenkins + GIT
Integração contínua @gpupoIntegração contínua @gpupo
• $ sudo su - jenkins
• $ ssh-keygen -t rsa -C "[email protected]"
• $ git config --global user.email \ "[email protected]"
• $ git config --global user.name "Jenkins Robot"
![Page 133: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/133.jpg)
Template for Jenkins Jobs for PHP Projects
Integração contínua @gpupoIntegração contínua @gpupo
• Adivinha de quem é o projeto?
![Page 134: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/134.jpg)
Template for Jenkins Jobs for PHP Projects
Integração contínua @gpupoIntegração contínua @gpupo
• Adivinha de quem é o projeto?
![Page 135: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/135.jpg)
Criando um job PHP no Jenkins
Integração contínua @gpupoIntegração contínua @gpupo
• 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".
![Page 136: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/136.jpg)
Criando um job PHP no Jenkins
Integração contínua @gpupoIntegração contínua @gpupo
![Page 137: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/137.jpg)
Criando um job PHP no Jenkins
Integração contínua @gpupoIntegração contínua @gpupo
![Page 138: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/138.jpg)
Jenkins alerts
Integração contínua @gpupoIntegração contínua @gpupo
![Page 139: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/139.jpg)
![Page 140: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/140.jpg)
![Page 141: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/141.jpg)
![Page 142: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/142.jpg)
![Page 143: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/143.jpg)
![Page 144: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/144.jpg)
Jenkins alerts
Integração contínua @gpupoIntegração contínua @gpupo
![Page 145: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/145.jpg)
Jenkins jobs
Integração contínua @gpupoIntegração contínua @gpupo
![Page 146: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/146.jpg)
Jenkins job
Integração contínua @gpupoIntegração contínua @gpupo
![Page 147: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/147.jpg)
Job/documentação
Integração contínua @gpupoIntegração contínua @gpupo
![Page 148: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/148.jpg)
Job/testes
Integração contínua @gpupoIntegração contínua @gpupo
![Page 149: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/149.jpg)
Job/testes
Integração contínua @gpupoIntegração contínua @gpupo
![Page 150: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/150.jpg)
Job/histórico
Integração contínua @gpupoIntegração contínua @gpupo
![Page 151: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/151.jpg)
Job/estilo
Integração contínua @gpupoIntegração contínua @gpupo
![Page 152: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/152.jpg)
Job/cobertura
Integração contínua @gpupoIntegração contínua @gpupo
![Page 153: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/153.jpg)
Job/violações
Integração contínua @gpupoIntegração contínua @gpupo
![Page 154: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/154.jpg)
Job/CodeBrowser
Integração contínua @gpupoIntegração contínua @gpupo
![Page 155: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/155.jpg)
Job/CodeBrowser
Integração contínua @gpupoIntegração contínua @gpupo
![Page 156: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/156.jpg)
Job/workspace
Integração contínua @gpupoIntegração contínua @gpupo
![Page 157: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/157.jpg)
Job/Build Time Trend
Integração contínua @gpupoIntegração contínua @gpupo
![Page 158: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/158.jpg)
Customizando
Integração contínua @gpupoIntegração contínua @gpupo
Quero que meu projeto avalie apenas o Coding style Zend. Como configurar?
![Page 159: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/159.jpg)
Customizando
Integração contínua @gpupoIntegração contínua @gpupo
build.xml:
Quero que meu projeto avalie apenas o Coding style Zend. Como configurar?
![Page 160: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/160.jpg)
Customizando
Integração contínua @gpupoIntegração contínua @gpupo
Como configurar a codificação do meu projeto?
![Page 161: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/161.jpg)
Customizando
Integração contínua @gpupoIntegração contínua @gpupo
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>//...
![Page 162: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/162.jpg)
Jenkins + capistrano
Integração contínua @gpupoIntegração contínua @gpupo
• soon
![Page 163: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/163.jpg)
![Page 164: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/164.jpg)
![Page 165: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/165.jpg)
![Page 166: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/166.jpg)
![Page 167: Integração contínua em PHP com Jenkins](https://reader030.vdocuments.mx/reader030/viewer/2022012403/55621857d8b42a7d028b56a0/html5/thumbnails/167.jpg)
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