На сегодняшний день инструментов непрерывной интерграции (Continuous Integration) PHP проектов много. Все они много чего умеют, и чем больше функционала предлагает то, или иное решение, тем трудней заставить его работать. Мне, почему-то нормальная документация попалась только по phpUnderControl на CruiseControl и Jenkins.
C CruiseControl как-то не заладилось, примеры устарели и почти не работают, поэтому Jenkins со своей работой из коробки победил. Итак, Jenkins
Вы убедиись, что ваш проект должен соответствовать стандартам качества. Для этого необходимо определять дефекты как можноо раньше. С небольшими итерациями этого добиться легче. Настройка непрерывной интеграции на сервере может оказаться не простой задачей, если вы никогда не делали этого. Я попробую описать как его настроить. Начнем стого, что WEB сервер нас уже есть (у меня CentOS+nginx+php_fpm).
Инструменты
Для PHP имеется много инструментов, которые могут быть использованы для анализа кода. Есть инструменты для выполнения модульных тестов, выявление copy/paste кода, проверки стандартов кодирования и многие другие. Мы должны поблагодарить Себастьяна Бергмана (Sebastian Bergmann) за то что он написал большинство этих инструментов для нас. Рассмотрим некоторые из них здесь.
PHPUnit
PHPUnit представителем семейства фреймворков XUnit на основе пакету SUnit, созданного Кентом Беком. Он позволяет запускать автоматизированные тесты на код. Чтобы установить его, используйте эти команды:
#pear config-set auto_discover 1 #pear install pear.phpunit.de/PHPUnit #phpunit --version PHPUnit 3.6.12 by Sebastian Bergmann.
Будем считать, что тесты вы писать умеете, и увас уже они есть. Помимо непосредственно выполнения тестов phpunit в связке с xdebug позволяется так же контролировать покрытие кода тестами. А в связке с утилитой PHP_CodeCoverage генерировать html отчеты о покрытии. PHP_CodeCoverage устанавливается вместе с phpunit, а вот xdebug необходимо устанавливать отдельно
# yum install php53u-devel # pecl install xdebug # #php -i | grep xdebug ... xdebug support => enabled ...
PHP CodeSniffer
PHP CodeSniffer анализирует ваш код на нарушения стандартов кодирования. Он потдерживает несколько стандартов, напр. Zend и PEAR. Но можно написать свой собственный стандарт - расширение существующего стандарта.
Устанавливаем
#pear install PHP_CodeSniffer
Для парсинга среднего проекта понадобится не мало времени, поэтому будем запускать CodeSniffer только для изменений из последнего коммита. Для этого нам понадобится такой PHP скрипт (должен лежать в директории проекта):
#!/usr/bin/php <?php $workspacePath = 'workspace/'; $commit = shell_exec("git --git-dir {$workspacePath}.git log --format='%H' -2 | tail -n1"); $commit = trim($commit); $files = shell_exec("git --git-dir {$workspacePath}.git diff --name-only {$commit}..HEAD -- . | sed '/^$/d' | uniq || echo ''"); $files = explode("\n", $files); $filePaths = ''; foreach ($files as $file) { if (empty($file)) continue; $filePaths .= $workspacePath . $file . ' '; } $phpcsOutput = shell_exec("phpcs --standard=ci-phpcs.xml --extensions=php --encoding=utf-8 --report=checkstyle --report-file={$workspacePath}checkstyle.xml {$filePaths}");
нивкакую не хотел отчет checkstyle сохраняться в /build/logs.
PHP Depend
PHP Depend - проводит статический анализ кода. Устанавливаем:
#pear channel-discover pear.pdepend.org #pear install pdepend/PHP_Depend-beta #pdepend --version PHP_Depend 1.1.0 by Manuel Pichler
Пока не будем его привязывать.
PHP Mess Detector
PHP Mess Detector используется для обнаружения проблем в коде. Он использует те же показатели, как PHP Depend, чтобы дать вам характеристику на ваш код. Он может обнаружить возможные ошибки.
Пока не будем его привязывать.
PHP Copy/Paste Detector
Как следует из названия, PHP Copy/Paste Detector определяет, когда код был скопирован. Это дает вам повод для рефакторинга кода.
Пока не будем его привязывать.
PHP Dead Code Detector
Как следует из названия, PHP Dead Code Detector сканирует ваш проект и выявляет функций, которые не вызываются. Это может показаться не важным функционалом, но мертвый код действительно может замедлить поддержку проекта. Т.к. разработчики могут смотреть и этот код, пытаться понять и, может даже, исправлять ошибки в это коде, который никогда не вызывается.
Пока не будем его привязывать.
Собираем все вместе с Jenkins
Все эти инструменты очень хороши, но вызывать их один за другим вручную для всего проекта очень трудоемкая операция. Jenkins сервер непрерывной интеграции - берет на себя эту задачу. Он будет центральной точкой доступа для всех отчетов и отправки уведомлений при сборке, если она не удалась.
Создание проекта
Jenkins может построить проект разными способами. Он может использовать batch файл Windows, shell скрипт, Ant и Maven для сборки.
В нашем проекте мы будем использовать Ant (— утилита для автоматизации процесса сборки программного продукта). Чтобы установить Ant, убедитесь, что у вас установлен Java JDK (+Tomcat), если нет, устанавливаем:
#yum install -y java ant #java -version java version "1.6.0_22" #ant -version Apache Ant version 1.6.5 compiled on January 6 2007 #yum install tomcat5 tomcat5-webapps tomcat5-admin-webapps
Теперь необходимо создать билд файл. На сайте Ant есть отличная инструкция. Билд файл будет исполнять Ant.
Устанавливаем Jenkins
#wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo #rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key #yum install jenkins #service jenkins start
Теперь Jenkins доступен на http://localhost:8080
Конфигурация Jenkins
Jenkins имеет множество опций конфигурирования. Мы не будем рассматривать их все, рассмотрим только то, что входит в рамки текущего мануала. Кликните на “Manage Jenkins” потом “Configure System”. Здесь можете включить защиту, если хотите, чтобы только авторизованные пользователи могли заходить в Jenkins. Здесь, также можно настроить рассылки чтобы Jenkins мог отправлять эл. сообщения об успешном\неуспешном билде.
После конфигурирования, можно перейти к набору используемых плагинов. Мы в своей работе используем Git, поэтому устанавливаем Git Plugin. Для публикации результатов тестов phpUnit необходимо установить плагин Jenkins Clover PHP plugin. Для публикации отчетов CodeSniffer необходим Checkstyle Plugin. Для публикачии ответа PHP depend необзодим плагин JDepend.
Создание проекта
Теперь созданим проект для сборки. Кликаем “New Job”. Заполняем Имя проекта, выбираем "free style project" и кликаем OK. Вы будете перенаправлены на страницу конфигурации сборки проекта. Каждая опция сопровождает пояснением, которое можно увидеть кликнув на вопросик возле поля конфигурации.
Впринципе каждая опция говорит сама за себя и не нуждается пояснении. У нас выбрано:
+ Удалять устаревшие сборки, хранить не больше 10 последних сборок
+ Указан путь к git repo и выбран бранч development
+ "Опрашивать SCM об изменениях" каджую минуту (* * * * *)
В секции настройки сборки, Мы просто говорим Jenkins'у запустить Ant. Все последовательности и цели написане в файле сборке Ant'а (build.xml). Вот наш файл сборки:
Папку build нужно создать (/var/lib/jenkins/jobs/YourProj/build). В настройках проекта Путь к файлу сборки тоже укажем явно /var/lib/jenkins/jobs/YourProj/build.xml. Так же поместим файл с настройками phpunit.xml в папку проекта (/var/lib/jenkins/jobs/YourProj/phpunit.xml)
В секции Post Build Actions будут работать большинство наших модулей. Это модули отображения результатов сборки. Для обработки и публикации результатов тестов phpUnit необходимо добавить действие "Publish Clover PHP Coverage Report", как написано в build.xml Clover XML location находится в /var/lib/jenkins/jobs/mercury/build/logs/clover.xml
В описание проекта можно написать:
Для отображения графиков PHP Depend.
Ссылки по теме:
Комментариев нет:
Отправить комментарий