{"id":2057,"date":"2018-05-10T22:52:31","date_gmt":"2018-05-10T20:52:31","guid":{"rendered":"http:\/\/miroslaw.borodziuk.eu\/?p=2057"},"modified":"2018-05-17T18:43:31","modified_gmt":"2018-05-17T16:43:31","slug":"ci-cd-projektow-php-na-jenkinsie-inspekcja","status":"publish","type":"post","link":"http:\/\/miro.borodziuk.eu\/index.php\/2018\/05\/10\/ci-cd-projektow-php-na-jenkinsie-inspekcja\/","title":{"rendered":"CI\/CD projekt\u00f3w PHP na Jenkinsie &#8211; Ci\u0105g\u0142a Inspekcja"},"content":{"rendered":"<p>Praktyka ci\u0105g\u0142ej inspekcji rozszerza ide\u0119 ci\u0105g\u0142ej integracji przez przeprowadzanie kontroli kodu za ka\u017cdym razem gdy jest on zmieniany. Mo\u017cliwa jest detekcja niepo\u017c\u0105danych zmian w kodzie takich jak np. zwi\u0119kszaj\u0105ce si\u0119 skomplikowanie kodu i dostrze\u017cenie tych zmian zanim ich odwr\u00f3cenie stanie si\u0119 zbyt kosztowne.<\/p>\n<p><!--more--><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Metryki oprogramowania.<\/span><\/p>\n<p>Do \u015bledzenia rozmiar\u00f3w metryk projektu takich jak np. ilo\u015b\u0107 linii kodu (LOC &#8211; Lines of Code) s\u0142u\u017cy\u0107 mo\u017ce phploc.<\/p>\n<pre class=\"lang:sh decode:true \">&lt;target name=\"phploc\"\r\n  unless=\"phploc.done\"\r\n  description=\"Measure project size using PHPLOC and print human readable output. Intended for usage on the command line.\"&gt;\r\n  &lt;exec executable=\"${phploc}\" taskname=\"phploc\"&gt;\r\n    &lt;arg value=\"--count-tests\" \/&gt;\r\n    &lt;arg path=\"${basedir}\/src\" \/&gt;\r\n    &lt;arg path=\"${basedir}\/tests\" \/&gt;\r\n  &lt;\/exec&gt;\r\n  &lt;property name=\"phploc.done\" value=\"true\"\/&gt;\r\n&lt;\/target&gt;\r\n\r\n&lt;target name=\"phploc-ci\"\r\n  unless=\"phploc.done\"\r\n  depends=\"prepare\"\r\n  description=\"Measure project size using PHPLOC and log result in CSV and XML format. Intended for usage within a continuous integration environment.\"&gt;\r\n  &lt;exec executable=\"${phploc}\" taskname=\"phploc\"&gt;\r\n    &lt;arg value=\"--count-tests\" \/&gt;\r\n    &lt;arg value=\"--log-csv\" \/&gt;\r\n    &lt;arg path=\"${basedir}\/build\/logs\/phploc.csv\" \/&gt;\r\n    &lt;arg value=\"--log-xml\" \/&gt;\r\n    &lt;arg path=\"${basedir}\/build\/logs\/phploc.xml\" \/&gt;\r\n    &lt;arg path=\"${basedir}\/src\" \/&gt;\r\n    &lt;arg path=\"${basedir}\/tests\" \/&gt;\r\n  &lt;\/exec&gt;\r\n  &lt;property name=\"phploc.done\" value=\"true\"\/&gt;\r\n&lt;\/target&gt;<\/pre>\n<p>Wg powy\u017cszego przyk\u0142adu PHPLOC b\u0119dzie logowa\u0142 do pliku CSV i XML. Dane z plik\u00f3w mog\u0105 by\u0107 plotowane przez plugin Jenkinsa Plot.<\/p>\n<p>Innym narz\u0119dziem do obliczania szerokiej gamy metryk oprogramowania jest PHP_Depend. Poni\u017cej przyk\u0142ad jak wywo\u0142a\u0107 to narz\u0119dzie z poziomu Ant:<\/p>\n<pre class=\"lang:sh decode:true \">&lt;target name=\"pdepend\"\r\n  unless=\"pdepend.done\"\r\n  depends=\"prepare\"\r\n  description=\"Calculate software metrics using PHP_Depend and log result in XML format. Intended for usage within a continuous integration environment.\"&gt;\r\n  &lt;exec executable=\"${pdepend}\" taskname=\"pdepend\"&gt;\r\n    &lt;arg value=\"--jdepend-xml=${basedir}\/build\/logs\/jdepend.xml\" \/&gt;\r\n    &lt;arg value=\"--jdepend-chart=${basedir}\/build\/pdepend\/dependencies.svg\" \/&gt;\r\n    &lt;arg value=\"--overview-pyramid=${basedir}\/build\/pdepend\/overview-pyramid.svg\" \/&gt;\r\n    &lt;arg path=\"${basedir}\/src\" \/&gt;\r\n  &lt;\/exec&gt;\r\n  &lt;property name=\"pdepend.done\" value=\"true\"\/&gt;\r\n&lt;\/target&gt;<\/pre>\n<p>O metrykach oprogramowania mo\u017cna poczyta\u0107 <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Metryka_oprogramowania\">tutaj<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Zduplikowany kod.<\/span><\/p>\n<p>Utrzymanie kodu, kt\u00f3ry jest zduplikowany jest zdecydowanie trudniejsze, poniewa\u017c wszystkie duplikaty musz\u0105 by\u0107 sp\u00f3jne ze sob\u0105, natomiast b\u0142\u0119dy znalezione w zduplikowanym kodzie musz\u0105 by\u0107 poprawiane w wielu miejscach. PHP Copy\/Paste Detector mo\u017ce by\u0107 u\u017cywany do automatycznej detekcji zduplikowanego kodu w projektach PHP.<\/p>\n<pre class=\"lang:sh decode:true\">&lt;target name=\"phpcpd\"\r\n  unless=\"phpcpd.done\"\r\n  description=\"Find duplicate code using PHPCPD and print human readable output. Intended for usage on the command line before committing.\"&gt;\r\n  &lt;exec executable=\"${phpcpd}\" taskname=\"phpcpd\"&gt;\r\n    &lt;arg path=\"${basedir}\/src\" \/&gt;\r\n  &lt;\/exec&gt;\r\n\r\n  &lt;property name=\"phpcpd.done\" value=\"true\"\/&gt;\r\n&lt;\/target&gt;\r\n\r\n&lt;target name=\"phpcpd-ci\"\r\n  unless=\"phpcpd.done\"\r\n  depends=\"prepare\"\r\n  description=\"Find duplicate code using PHPCPD and log result in XML format. Intended for usage within a continuous integration environment.\"&gt;\r\n  &lt;exec executable=\"${phpcpd}\" taskname=\"phpcpd\"&gt;\r\n    &lt;arg value=\"--log-pmd\" \/&gt;\r\n    &lt;arg path=\"${basedir}\/build\/logs\/pmd-cpd.xml\" \/&gt;\r\n    &lt;arg path=\"${basedir}\/src\" \/&gt;\r\n  &lt;\/exec&gt;\r\n\r\n  &lt;property name=\"phpcpd.done\" value=\"true\"\/&gt;\r\n&lt;\/target&gt;<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Naruszenie standard\u00f3w kodowania.<\/span><\/p>\n<p>W ka\u017cdym rozwijanym projekcie wa\u017cne jest aby zesp\u00f3\u0142 u\u017cywa\u0142 jednolitego standardu kodowania. Wsp\u00f3lny standard kodowania pozwala na skupianiu si\u0119 tylko na takich problemach jakie maj\u0105 znaczenie dla projektu zamiast g\u0142owi\u0107 si\u0119 nad zrozumieniem innych styl\u00f3w kodowania. PHP_CodeSniffer to narz\u0119dzie do wykrywania narusze\u0144 standard\u00f3w formatowania kodu. Dostarcza ono setki pr\u00f3bek, z kt\u00f3rych ka\u017cda sprawdza jedn\u0105 w\u0142a\u015bciwo\u015b\u0107 kodu. Mo\u017cliwe jest zdefiniowanie w\u0142asnego zestawu regu\u0142 lub u\u017cywanie regu\u0142 wbudowanych takich jak PEAR lub Zend.<\/p>\n<pre class=\"lang:sh decode:true \">&lt;target name=\"phpcs\"\r\n  unless=\"phpcs.done\"\r\n  description=\"Find coding standard violations using PHP_CodeSniffer and print human readable output. Intended for usage on the command line before committing.\"&gt;\r\n  &lt;exec executable=\"${phpcs}\" taskname=\"phpcs\"&gt;\r\n    &lt;arg value=\"--standard=PSR2\" \/&gt;\r\n    &lt;arg value=\"--extensions=php\" \/&gt;\r\n    &lt;arg value=\"--ignore=autoload.php\" \/&gt;\r\n    &lt;arg path=\"${basedir}\/src\" \/&gt;\r\n    &lt;arg path=\"${basedir}\/tests\" \/&gt;\r\n  &lt;\/exec&gt;\r\n\r\n  &lt;property name=\"phpcs.done\" value=\"true\"\/&gt;\r\n&lt;\/target&gt;\r\n\r\n&lt;target name=\"phpcs-ci\"\r\n  unless=\"phpcs.done\"\r\n  depends=\"prepare\"\r\n  description=\"Find coding standard violations using PHP_CodeSniffer and log result in XML format. Intended for usage within a continuous integration environment.\"&gt;\r\n  &lt;exec executable=\"${phpcs}\" output=\"\/dev\/null\" taskname=\"phpcs\"&gt;\r\n    &lt;arg value=\"--report=checkstyle\" \/&gt;\r\n    &lt;arg value=\"--report-file=${basedir}\/build\/logs\/checkstyle.xml\" \/&gt;\r\n    &lt;arg value=\"--standard=PSR2\" \/&gt;\r\n    &lt;arg value=\"--extensions=php\" \/&gt;\r\n    &lt;arg value=\"--ignore=autoload.php\" \/&gt;\r\n    &lt;arg path=\"${basedir}\/src\" \/&gt;\r\n    &lt;arg path=\"${basedir}\/tests\" \/&gt;\r\n  &lt;\/exec&gt;\r\n\r\n  &lt;property name=\"phpcs.done\" value=\"true\"\/&gt;\r\n&lt;\/target&gt;<\/pre>\n<p>&nbsp;<\/p>\n<p>PHP Mess Detector skupia si\u0119 nie na naruszeniu standard\u00f3w formatowania kodu ale na takich kwestiach jak mo\u017cliwe bugi, kod trudny do utrzymania, nieu\u017cywane parametry i zmienne, nie u\u017cywane metody. Dostarcza wiele regu\u0142, kt\u00f3re sprawdzaj\u0105 konkretn\u0105 w\u0142a\u015bciwo\u015b\u0107 kodu. Mo\u017cna tak\u017ce ustala\u0107 w\u0142asne regu\u0142y.<\/p>\n<pre class=\"lang:sh decode:true \">&lt;target name=\"phpmd\"\r\nunless=\"phpmd.done\"\r\ndescription=\"Perform project mess detection using PHPMD and print human readable output. Intended for usage on the command line before committing.\"&gt;\r\n&lt;exec executable=\"${phpmd}\" taskname=\"phpmd\"&gt;\r\n&lt;arg path=\"${basedir}\/src\" \/&gt;\r\n&lt;arg value=\"text\" \/&gt;\r\n&lt;arg path=\"${basedir}\/build\/phpmd.xml\" \/&gt;\r\n&lt;\/exec&gt;\r\n\r\n&lt;property name=\"phpmd.done\" value=\"true\"\/&gt;\r\n&lt;\/target&gt;\r\n\r\n&lt;target name=\"phpmd-ci\"\r\nunless=\"phpmd.done\"\r\ndepends=\"prepare\"\r\ndescription=\"Perform project mess detection using PHPMD and log result in XML format. Intended for usage within a continuous integration environment.\"&gt;\r\n&lt;exec executable=\"${phpmd}\" taskname=\"phpmd\"&gt;\r\n&lt;arg path=\"${basedir}\/src\" \/&gt;\r\n&lt;arg value=\"xml\" \/&gt;\r\n&lt;arg path=\"${basedir}\/build\/phpmd.xml\" \/&gt;\r\n&lt;arg value=\"--reportfile\" \/&gt;\r\n&lt;arg path=\"${basedir}\/build\/logs\/pmd.xml\" \/&gt;\r\n&lt;\/exec&gt;\r\n\r\n&lt;property name=\"phpmd.done\" value=\"true\"\/&gt;\r\n&lt;\/target&gt;<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Dokumentacja kodu.<\/span><\/p>\n<p>Dobrze napisany zorientowany obiektowo kod powinien dokumentowa\u0107 si\u0119 sam. PhpDox to narz\u0119dzie, kt\u00f3re wydobywa informacje z kodu i przedstawia je w formacje HTML. Domy\u015blnie phpDox u\u017cywa PHP-Parsera do zbierania informacji o kodzie PHP. Informacje te sk\u0142adowane s\u0105 w dokumentach XML, kt\u00f3re mog\u0105 by\u0107 wzbogacone o dane z zewn\u0119trznych \u017ar\u00f3de\u0142 takie jak logi XML, PHP_CodeSniffer, PHP Mess Detector (PHPMD) lub PHPUnit. Finalnie wszystkie informacje renderowane s\u0105 do postaci HTML.<\/p>\n<p>Przyk\u0142ad wywo\u0142ania phpDox ze skryptu build Apache Ant.<\/p>\n<pre class=\"lang:sh decode:true\">&lt;target name=\"phpdox\"\r\n  unless=\"phpdox.done\"\r\n  depends=\"phploc-ci,phpcs-ci,phpmd-ci\"\r\n  description=\"Generate project documentation using phpDox\"&gt;\r\n  &lt;exec executable=\"${phpdox}\" dir=\"${basedir}\/build\" taskname=\"phpdox\"\/&gt;\r\n  &lt;property name=\"phpdox.done\" value=\"true\"\/&gt;\r\n&lt;\/target&gt;<\/pre>\n<p>&nbsp;<\/p>\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 inspekcji rozszerza ide\u0119 ci\u0105g\u0142ej integracji przez przeprowadzanie kontroli kodu za ka\u017cdym razem gdy jest on zmieniany. Mo\u017cliwa jest detekcja niepo\u017c\u0105danych zmian w kodzie takich jak np. zwi\u0119kszaj\u0105ce si\u0119 skomplikowanie kodu i dostrze\u017cenie tych zmian zanim ich odwr\u00f3cenie stanie si\u0119 zbyt kosztowne.<\/p>\n","protected":false},"author":1,"featured_media":2058,"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\/2057"}],"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=2057"}],"version-history":[{"count":33,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/2057\/revisions"}],"predecessor-version":[{"id":2091,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/2057\/revisions\/2091"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media\/2058"}],"wp:attachment":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media?parent=2057"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/categories?post=2057"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/tags?post=2057"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}