Статьи

Подготовка и сборка проекта PHP в Дженкинс

В предыдущей статье мы рассмотрели установку Jenkins и подготовили все, чтобы начать работу. Мы продолжим в этой статье, фактически подготовив наш проект. Если у вас уже есть готовая установка Jenkins, вам не нужно проходить предыдущую часть — вы можете очень хорошо выполнить ее.

Подготовить композитора

Мы собираемся подготовить наш проект в первую очередь. Мы могли бы использовать проект, предоставленный Себастьяном Бергманном, но это скорее базовый проект, и он без проблем будет работать в Дженкинсе. В этой статье мы будем использовать другой репозиторий, в котором нам придется преодолеть некоторые препятствия. Мы будем использовать форк Jumph в качестве основы.

Прежде всего, мы должны убедиться, что у нас есть такие инструменты, как PHPUnit и PHP-CodeSniffer. Мы можем сделать это двумя разными способами. Либо мы устанавливаем пакеты на наш сервер Jenkins через Pear или Composer глобально, либо определяем зависимости в нашем файле composer.json Я решил использовать последний метод, чтобы мы могли легко контролировать версию этих инструментов как на нашей локальной машине, так и на Jenkins. Поэтому мы начнем с добавления следующих строк в файл composer.jsoncomposer update

 "require-dev": {
    "squizlabs/php_codesniffer": "~1.5.*",
    "phpmd/phpmd": "~2.1.*",
    "sebastian/phpcpd": "~2.0.*",
    "pdepend/pdepend": "~2.0.*",
    "phploc/phploc": "~2.0.*",
    "phpunit/phpunit": "~4.3.*",
    "theseer/phpdox": "~0.7.*",
},

Если вы хотите узнать больше о том, что делает каждый пакет, посмотрите статью Бруно об инструментах PHP QA .

Подготовить муравей

На нашем сервере Jenkins мы будем использовать Ant . Так что, если Ant еще не установлен на вашем сервере, убедитесь, что это, выполнив следующую команду.

 sudo apt-get install ant

Ant помогает автоматизировать процесс сборки программного обеспечения. Вы определяете задачи, называемые целями, в файле конфигурации. Ant прочитает этот файл и выполнит соответствующее действие. Вы можете определить зависимости, чтобы указать, в каком порядке Ant должен выполнять эти задачи. Файл конфигурации — это так называемый файл build.xml Мы собираемся добавить это в наш проект, чтобы Ant мог выполнять эти задачи на нашем сервере Jenkins. Мы собираемся использовать шаблон, предоставленный Себастьяном Бергманном, который можно найти здесь . Мы добавляем это в корень нашего проекта.

Чтобы запустить Ant, вы можете запустить ant build Это означает, что Ant запустит цель build Если параметр не указан, Ant запустит цель, как указано в конфигурации по умолчанию, которая в этом случае также является build

Давайте внимательнее посмотрим на цель build

 <target name="build" depends="prepare,lint,phploc-ci,pdepend,phpmd-ci,phpcs-ci,phpcpd-ci,phpunit,phpdox" description=""/>

Цель пуста, однако это зависит от множества других целей. Сначала он запустит цель preparelint Давайте посмотрим на цель phploc-ci, например.

 <target name="phploc-ci" depends="prepare" description="Measure project size using PHPLOC and log result in CSV and XML format. Intended for usage within a continuous integration environment.">
    <exec executable="${toolsdir}phploc">
        <arg value="--count-tests"/>
        <arg value="--log-csv"/>
        <arg path="${basedir}/build/logs/phploc.csv"/>
        <arg value="--log-xml"/>
        <arg path="${basedir}/build/logs/phploc.xml"/>
        <arg path="${basedir}/src"/>
        <arg path="${basedir}/tests"/>
    </exec>
</target>

Эту цель довольно легко понять. Вы заметите, что это зависит от цели prepare Так как он уже был запущен целью build Затем мы получаем исполняемый файл phploc Вы установили это ранее с помощью Composer. Наконец, мы увидим конкретные аргументы PHPLOC. Ant запустит следующий ввод командной строки на основе этой целевой конфигурации.

 phploc --count-tests --log-csv /build/logs/phploc.csv --log-xml /build/logs/phploc.xml /src /tests

${toolsdir}${basedir} В зависимости от того, как они настроены, они могут влиять на общий вывод командной строки

Как указано выше, если вы хотите запустить только эту цель, вы должны запустить ant phploc-ci

Обратите внимание, что эта команда phploc.csvphploc.xmlbuild.xml Плагины, установленные в Jenkins ранее, будут, например, читать эти файлы и конвертировать их в графики. В следующей статье мы углубимся в эту тему.

Если вы посмотрите весь файл phpunit.xml build / phpmd.xml , build / phpdox.xml и build / phpunit.xml . Эти файлы конфигурации запрашиваются фактическими инструментами. Чтобы узнать больше, посмотрите их соответствующие документы.

Обратите внимание, что phpunit.xml.distbuild.xml

Изменение файла build.xml

Итак, мы закончили? К сожалению, пока нет. Файл toolsdir Сначала нам нужно определить, где можно найти такие инструменты, как PHPUnit. Наш композитор установил их автоматически в каталог bin в корне нашего проекта. Нам нужно изменить свойство <property name="toolsdir" value="bin/" />

 build.xml

Мы также можем очистить несколько команд. Текущий файл srctests<arg path="${basedir}/tests"/> Поскольку Symfony2 включает тесты в каталоге src, мы можем удалить все пути к каталогу tests, как в этом примере.

 build.xml

Хотя это и не обязательно, я предпочитаю содержать все в чистоте, насколько это возможно, чтобы оно соответствовало нашему проекту.

Наконец, текущая конфигурация для PHPDox, как указано в файле <target name="phpdox" depends="phploc-ci,phpcs-ci,phpmd-ci" description="Generate project documentation using phpDox">
<exec executable="${toolsdir}phpdox">
<arg value="--file" />
<arg value="${basedir}/build/phpdox.xml" />
</exec>
</target>
Я изменил цель, как показано ниже, поэтому она правильно читает наш файл конфигурации.

 parameters.yml

Создание новых целей

Все было настроено так, чтобы все наши инструменты обеспечения качества работали так, как ожидалось. Однако наш проект немного сложнее. Если вы проанализировали хранилище, вы заметите, что зависимости регулируются Composer и Bower. Поскольку это проект Symfony, нам также понадобится файл default.yml по умолчанию. Нам нужно разобраться с этими требованиями, чтобы правильно настроить проект на Jenkins.

Начнем с файла parameters.yml. Мы можем работать с содержимым по умолчанию для parameters.yml.dist Мы начнем с создания новой цели с именем copy-parameterscp

 <target name="copy-parameters" description="Copy parameters.yml file">
  <exec executable="cp" failonerror="true">
   <arg path="app/config/parameters.yml.dist" />
   <arg path="app/config/parameters.yml" />
  </exec>
 </target>

Далее идут Композитор и Бауэр. Я решил установить их глобально на сервере Jenkins, выполнив следующие команды.

 curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/bin/composer

sudo apt-get install nodejs
sudo apt-get install npm
sudo npm install -g bower
sudo ln -s /usr/bin/nodejs /usr/bin/node #This is needed on certain linux distro's.

[Ред .: Обратите внимание, что если вы запускаете все это на виртуальной машине, размещенной в Windows, BowerPHP будет гораздо лучшим вариантом, чем Bower.]

Теперь давайте создадим цель для Composer.

 <target name="composer" description="Installing composer dependencies">
 <exec executable="composer" failonerror="true">
  <arg value="install" />
  <arg value="--dev" />
  <arg value="--prefer-dist" />
  <arg value="--no-progress" />

  <env key="SYMFONY_ENV" value="test"/>
 </exec>
</target>

Важно настроить SYMFONY_ENV

Давайте продолжим с Бауэром.

 <target name="bower" description="Installing bower dependencies">
 <exec executable="bower" failonerror="true">
  <arg value="install" />
 </exec>
</target>

Последнее, что нам нужно сделать, это убедиться, что эти цели выполнены. Поэтому мы меняем цель build

 <target name="build" depends="prepare,copy-parameters,bower,composer,lint,phploc-ci,pdepend,phpmd-ci,phpcs-ci,phpcpd-ci,phpunit,phpdox" description=""/>

Гит

Последнее, что нам нужно сделать, это подготовить наш файл .gitignore Если вы когда-нибудь захотите запустить цель Ant на своем локальном компьютере, ваш каталог сборки будет заполнен файлами журналов, которые вы не хотите фиксировать в своем хранилище. Поэтому мы добавляем следующие строки в файл .gitignore

 # build
!build/phpmd.xml
!build/phpunit.xml
!build/phpdox.xml
build/*

Возможно, вас немного смутили все изменения, которые мы внесли. Для вашего удобства здесь есть прямая ссылка на коммит со всеми изменениями, которые мы описали выше.

Создать проект в Дженкинс

Наш проект готов. Давайте вернемся к Дженкинсу и настроим его. Это будет самая легкая часть в этой статье.

Поскольку наш проект находится на Github, я предлагаю вам установить плагин Github в Jenkins. Если вы используете свой собственный git-сервер, вы можете просто установить обычный плагин Git. Если вы не уверены, как установить плагин, проверьте предыдущую статью.

Когда вы вернетесь к обзору, вы должны нажать на new item В качестве имени элемента мы заполняем Jumph. Далее мы выбираем опцию copy existing itemphp-template

Jenkins

Мы сразу же перейдем на страницу конфигурации этого проекта. Сначала мы снимаем флажок Disable build В поле ввода проекта Github мы заполняем URL-адрес проекта Github.

Последнее, что нам нужно сделать, это выбрать источник управления. В нашем случае это мерзавец. Далее необходимо заполнить ссылку на репозиторий. Если вы используете ссылку HTTPS, вам не нужно предоставлять никаких дополнительных учетных данных. Мы можем решить, какие ветви следует построить, но поскольку у нас есть только основная ветвь, мы оставим ее как есть.

Конфигурация выполнена — это так просто, потому что мы использовали предопределенный шаблон. Если вы прокрутите вниз, вы точно увидите, что шаблон настроен для нас. Не забудьте сохранить конфигурацию, прежде чем продолжить.

Начать сборку

Если вы выполнили все шаги до сих пор, теперь вы сможете начать сборку. Вы можете начать сборку, щелкнув build now Вы увидите внизу слева таблицы, что сборка появляется.

Jenkins

Если вы нажмете на саму сборку, вы получите новое боковое меню с опциями для этой конкретной сборки. Нажмите на console output В моем случае первая сборка не удалась из-за отсутствия некоторых расширений PHP.

Jenkins

Вывод на консоль очень удобен для выяснения причины неудачи вашего проекта. В моем случае мне просто нужно было запустить sudo apt-get install php5-curl php5-xsl php5-sqlite php5-xdebug Мне потребовалось несколько сборок, чтобы выяснить, чего не хватало, но с выводом на консоль легко выяснить, что происходит не так. В конце концов, так выглядит моя история сборки.

Jenkins

Красный означает, что сборка не удалась, а синий означает, что сборка прошла успешно Отказ может означать, что с конфигурацией что-то пошло не так, как мы видели ранее, но это также может означать, что модульные тесты не прошли Если вы снова откроете свой файл build.xmlfailonerror Если по какой-то причине эта цель потерпит неудачу, Ant автоматически остановится и сообщит, что сборка повреждена.

Возможно, вы ожидали зеленый шар вместо синего, когда сборка удалась. Существует плагин для отображения зеленых шаров вместо синих.

Вывод

В этой статье мы прошли путь к успешной сборке. Мы должны были подготовить наш проект и создать работу в Jenkins. Наконец нам пришлось отладить нашу первую пару сборок, так как мы забыли установить некоторые библиотеки.

В следующей части мы рассмотрим все результаты, которые Дженкинс возвращает.