{"id":2001,"date":"2018-03-21T13:00:24","date_gmt":"2018-03-21T12:00:24","guid":{"rendered":"http:\/\/miroslaw.borodziuk.eu\/?p=2001"},"modified":"2018-04-11T20:24:46","modified_gmt":"2018-04-11T18:24:46","slug":"jenkins-i-projekty-php-build-automation","status":"publish","type":"post","link":"http:\/\/miro.borodziuk.eu\/index.php\/2018\/03\/21\/jenkins-i-projekty-php-build-automation\/","title":{"rendered":"CI\/CD projekt\u00f3w PHP na Jenkinsie &#8211; Instalacja"},"content":{"rendered":"<p>Praktyka ci\u0105g\u0142ej integracji (CI) wymaga pe\u0142nej automatyzacji tworzenia build\u00f3w oraz efektywnego systemu kontroli wersji. Automatyzacja tworzenia build\u00f3w to praktyka oskryptowania r\u00f3\u017cnych zada\u0144, kt\u00f3re musz\u0105 wykonywa\u0107 developerzy w czasie ich codziennej pracy. Do zada\u0144 tych nale\u017cy z regu\u0142y kompilacja kodu \u017ar\u00f3d\u0142owego, testy automatyczne, pakietyzacja binarek a finalnie deployment aplikacji na serwerach.<\/p>\n<p><!--more--><\/p>\n<p>Do przeprowadzania CI\/CD dla projekt\u00f3w PHP przydatne s\u0105 nast\u0119puj\u0105ce wtyczki w Jenkinsie:<\/p>\n<ul>\n<li><a href=\"http:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Checkstyle+Plugin\">Checkstyle<\/a> (do przetwarzania log\u00f3w przez <a href=\"https:\/\/github.com\/squizlabs\/PHP_CodeSniffer\">PHP_CodeSniffer<\/a> w formacie Checkstyle)<\/li>\n<li><a href=\"http:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Clover+PHP+Plugin\">Clover PHP<\/a> (do przetwarzania log\u00f3w XML przez <a href=\"https:\/\/phpunit.de\/\">PHPUnit<\/a>&#8216;s Clover)<\/li>\n<li><a href=\"http:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Crap4J+Plugin\">Crap4J<\/a> (do przetwarzania log\u00f3w XML przez <a href=\"https:\/\/phpunit.de\/\">PHPUnit<\/a>&#8216;s Crap4J)<\/li>\n<li><a href=\"http:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/DRY+Plugin\">DRY<\/a> (do przetwarzania log\u00f3w <a href=\"https:\/\/github.com\/sebastianbergmann\/phpcpd\">phpcpd<\/a>\u00a0 w formacie PMD-CPD)<\/li>\n<li><a href=\"http:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/HTML+Publisher+Plugin\">HTML Publisher<\/a> (do publikowania dokumentacji wygenerowanej np. przez <a href=\"http:\/\/phpdox.de\/\">phpDox<\/a>)<\/li>\n<li><a href=\"http:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/JDepend+Plugin\">JDepend<\/a> (do przetwarzania log\u00f3w w formacie JDepend przez <a href=\"http:\/\/pdepend.org\/\">PHP_Depend<\/a>)<\/li>\n<li><a href=\"http:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Plot+Plugin\">Plot<\/a> (do przetwarzania plik\u00f3w CSV przez <a href=\"https:\/\/github.com\/sebastianbergmann\/phploc\">phploc<\/a>)<\/li>\n<li><a href=\"http:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/PMD+Plugin\">PMD<\/a> (do przetwarzania log\u00f3w w formacie PMD przez <a href=\"http:\/\/phpmd.org\/\">PHPMD<\/a>)<\/li>\n<li><a href=\"http:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Violations\">Violations<\/a> (do przetwarzania log\u00f3w w r\u00f3\u017cnych formatach)<\/li>\n<li><a href=\"https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Warnings+Plugin\">Warnings<\/a> (do przetwarzania warning\u00f3w kompilatora)<\/li>\n<li><a href=\"http:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/xUnit+Plugin\">xUnit<\/a> (do przetwarzania log\u00f3w XML JUnit przez <a href=\"https:\/\/phpunit.de\/\">PHPUnit<\/a>&#8216;s)<\/li>\n<\/ul>\n<p>Powy\u017csze pluginy mo\u017cna zainstalowa\u0107 w sekcji <em>Manage Jenkins -&gt; Manage Plugins -&gt; Available<\/em> lub pod linkiem:<\/p>\n<p><code>http:\/\/localhost:8080\/pluginManager\/available<\/code><\/p>\n<p>gdzie localhost to nazwa hosta z Jenkinsem.<\/p>\n<p>Pluginy mo\u017cna te\u017c zainstalowa\u0107 korzystaj\u0105c z CLI Jenkinsa:<\/p>\n<pre class=\"lang:sh decode:true \">wget http:\/\/localhost:8080\/jnlpJars\/jenkins-cli.jar\r\njava -jar jenkins-cli.jar -s http:\/\/localhost:8080 install-plugin checkstyle cloverphp crap4j dry htmlpublisher jdepend plot pmd violations warnings xunit\r\njava -jar jenkins-cli.jar -s http:\/\/localhost:8080 safe-restart<\/pre>\n<p>Instalacja PHP 7.2 na Centos 7:<\/p>\n<pre class=\"lang:sh decode:true\">yum install php72\r\nyum install php72-php-fpm php72-php-gd php72-php-json php72-php-mbstring php72-php-mysqlnd php72-php-xml php72-php-xmlrpc php72-php-opcache<\/pre>\n<p>Potrzebne s\u0105 tak\u017ce nast\u0119puj\u0105ce narz\u0119dzia dla PHP 7.2:<\/p>\n<ul>\n<li>Composer<\/li>\n<li><a href=\"https:\/\/phpunit.de\/\">PHPUnit<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/squizlabs\/PHP_CodeSniffer\">PHP_CodeSniffer<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/sebastianbergmann\/phploc\">PHPLOC<\/a><\/li>\n<li><a href=\"http:\/\/pdepend.org\/\">PHP_Depend<\/a><\/li>\n<li><a href=\"http:\/\/phpmd.org\/\">PHPMD<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/sebastianbergmann\/phpcpd\">PHPCPD<\/a><\/li>\n<li><a href=\"http:\/\/phpdox.de\/\">phpDox<\/a><\/li>\n<\/ul>\n<p>Instalacja Composer na CentOS 7:<\/p>\n<pre class=\"lang:sh decode:true \"># yum -y install composer<\/pre>\n<p>Instalacja PHP Timer<\/p>\n<pre class=\"lang:sh decode:true\"># cd \/root\r\n# composer require --dev phpunit\/php-timer<\/pre>\n<p>Instalacja PHPUnit:<\/p>\n<pre class=\"lang:sh decode:true\"># composer require --dev phpunit\/phpunit ^7\r\n# \/root\/vendor\/bin\/phpunit --version<\/pre>\n<p>Instalacja PHP_CodeSniffer<\/p>\n<pre class=\"lang:sh decode:true \"># composer require --dev squizlabs\/php_codesniffer<\/pre>\n<p>Instalacja PHPLOC:<\/p>\n<pre class=\"lang:sh decode:true\"># composer require --dev phploc\/phploc\r\n<\/pre>\n<p>Instalacja PHPDepend:<\/p>\n<pre class=\"lang:sh decode:true\"># composer require --dev pdepend\/pdepend<\/pre>\n<p>Instalacja PHPMD<\/p>\n<pre class=\"lang:sh decode:true \"># composer require --dev phpmd\/phpmd<\/pre>\n<p>Instalacja PHP Copy\/Paste Detector (PHPCPD):<\/p>\n<pre class=\"lang:sh decode:true\"># composer require --dev sebastian\/phpcpd<\/pre>\n<p>Instalacja phpDox<\/p>\n<pre class=\"lang:sh decode:true \"># composer require --dev theseer\/phpdox<\/pre>\n<p>Niestety przez composera nie mog\u0142em zainstalowa\u0107 phpdox poniewa\u017c wymaga\u0142 on php-timer 1.0. Z koleji PHPUnit 7.1.2 wymaga php-timer w wersji 2.0. Zainstalowa\u0142em wi\u0119c phpdox innym sposobem:<\/p>\n<pre class=\"lang:sh decode:true \"># wget http:\/\/phpdox.de\/releases\/phpdox.phar\r\n# chmod +x phpdox.phar\r\n# mv phpdox.phar \/usr\/local\/bin\/phpdox\r\n# ln -s \/usr\/local\/bin\/phpdox \/root\/vendor\/bin\/phpdox\r\n# phpdox --version\r\nphpDox 0.11.0 - Copyright (C) 2010 - 2018 by Arne Blankerts and Contributors<\/pre>\n<p>Mo\u017cna tak\u017ce doda\u0107 do zmiennej $PATH powy\u017csze narz\u0119dzia PHP. Tak to mo\u017cna zrobi\u0107 dla phploc:<\/p>\n<pre class=\"lang:sh decode:true \"># ln -s \/root\/vendor\/phploc\/phploc\/phploc \/usr\/local\/bin\/phploc<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Praktyka ci\u0105g\u0142ej integracji (CI) wymaga pe\u0142nej automatyzacji tworzenia build\u00f3w oraz efektywnego systemu kontroli wersji. Automatyzacja tworzenia build\u00f3w to praktyka oskryptowania r\u00f3\u017cnych zada\u0144, kt\u00f3re musz\u0105 wykonywa\u0107 developerzy w czasie ich codziennej pracy. Do zada\u0144 tych nale\u017cy z regu\u0142y kompilacja kodu \u017ar\u00f3d\u0142owego, testy automatyczne, pakietyzacja binarek a finalnie deployment aplikacji na serwerach.<\/p>\n","protected":false},"author":1,"featured_media":2036,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[54],"tags":[],"_links":{"self":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/2001"}],"collection":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/comments?post=2001"}],"version-history":[{"count":34,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/2001\/revisions"}],"predecessor-version":[{"id":2054,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/2001\/revisions\/2054"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media\/2036"}],"wp:attachment":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media?parent=2001"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/categories?post=2001"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/tags?post=2001"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}