Статьи

Непрерывная интеграция с Дженкинсом, часть 2

В первой части этой статьи я представил случай непрерывной интеграции. Теперь мы установим и настроим Jenkins для мониторинга автоматического построения простого демонстрационного PHP-приложения. Мы начнем с демонстрационного проекта, затем рассмотрим установку Дженкинса, и, наконец, настроим его и посмотрим, как он работает.

Демонстрационный проект

Демонстрационный проект основан на классе User и его тестовом скрипте, который использовала Мишель Санвер в своей статье Начало работы с PHPUnit . Чтобы все было организовано, я создал каталог с именем workspace в своем домашнем каталоге и настроил его так:

workspace имеет два подкаталога: .git который автоматически создается и используется Git, и builds папку стабильной версии.

Файл разработки — это User.php в workspace тогда как стабильный файл имеет то же имя, но находится в workspace/builds . Цель состоит в том, чтобы иметь возможность вносить изменения в workspace/User.php , тестировать эти изменения и, если они проходят, скопировать этот файл в workspace/builds .

Следующие строки создают рабочее workspace/builds каталогов и workspace/builds и инициализирует Git-репозиторий:

  jajeronymo @ desktop: ~ $ mkdir -p рабочая область / сборки
 jajeronymo @ desktop: ~ рабочее пространство $ cd
 jajeronymo @ desktop: ~ / workspace $ git init
 Инициализированный пустой репозиторий Git в /home/jajeronymo/workspace/.git/ 

Для удобства я воспроизведу классы Мишель, которые должны быть соответственно сохранены как workspace/User.php и workspace/UserTest.php здесь:

 <?php class User { protected $name; public function getName() { return $this->name; } public function setName($name) { $this->name = $name; } public function talk() { return "Hello world!"; } } 
 <?php require_once "User.php"; class UserTest extends PHPUnit_Framework_TestCase { public function testTalk() { $user = new User(); $expected = "Hello world!"; $actual = $user->talk(); $this->assertEquals($expected, $actual); } } 

Чтобы запустить тест PHPUnit:

  jajeronymo @ desktop: ~ / workspace $ phpunit UnitTest UserTest.php
 PHPUnit 3.6.10 от Себастьяна Бергмана. 
 , 
 Время: 0 секунд, память: 3,25 Мб 
 ОК (1 тест, 1 утверждение) 

Как вы знаете, точка во второй строке вывода означает, что User.php прошел тест.

И эта строка добавляет User.php в репозиторий Git:

  jajeronymo @ desktop: ~ / workspace $ git add User.php 

Добавление файла просто говорит Git, что он существует. Чтобы записать его как последнюю версию, мы должны зафиксировать это:

  jajeronymo @ desktop: ~ / workspace $ git commit -m "Первая версия".  User.php 

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

Apache Ant ищет файл с именем build.xml в домашней папке проекта и выполняет ряд операций, описанных в формате XML, например, в этом примере, который копирует последний User.php в папку builds:

 <project name="user"> <copy file="User.php" tofile="builds/User.php"/> </project> 

Сохраните вышеупомянутое в workspace/build.xml и запустите:

  jajeronymo @ desktop: ~ / workspace $ ant -v 

Ant должен вернуть вывод, который заканчивается аналогично:

  [копия] Копирование 1 файла в / home / prospero / workspace / builds 
 [копия] Копирование /home/jajeronymo/workspace/User.php в /home/jajeronymo/workspace/builds/User.php 

На этом этапе проверенная копия User.php находится в папке стабильной версии и готова к отправке на User.php сервер. Для дальнейшей автоматизации процесса мы можем добавить тест в скрипт Ant:

 <project name="user"> <exec executable="phpunit" failonerror="true"> <arg line=" UnitTest UserTest.php" /> </exec> <copy file="User.php" tofile="builds/User.php"/> </project> 

Сохраните вышеупомянутое снова и запустите Ant:

  jajeronymo @ desktop: ~ / workspace $ ant -v 

Теперь мы получили две простые задачи для нашей упрощенной непрерывной интеграции: фиксация версий в Git и запуск Ant для тестирования кода, который в случае одобрения будет скопирован в текущую папку стабильной сборки. Итак, зачем нам нужен Дженкинс в конце концов?

Необходимость автоматизации и мониторинга

Чтобы ответить на это, я буду использовать IDE или текстовый редактор, чтобы внести небольшое изменение в User.php , скажем, добавить несколько дополнительных восклицательных знаков в «Hello World!». Как только я закончу, я добавлю новую версию в репозиторий Git:

  jajeronymo @ desktop: ~ / workspace $ git commit -m "Добавлено несколько ударов".  User.php
 [master d2c96bb] Добавлено несколько ударов. 
  1 изменение файлов, 1 вставка (+), 1 удаление (-) 
 jajeronymo @ desktop: ~ / workspace $ ant -v 

Но подожди минутку! Разве я не должен был проверить изменения перед их внесением? Конечно, я был! Давайте сделаем это сейчас, прежде чем кто-то получит непроверенный коммит!

Поскольку тест ожидает, User.php выходная строка User.php будет точно «Hello World!», Он вернет ошибку:

  [ВЫПЛНЫ] 
      [exec] Был 1 сбой: 
      [ВЫПЛНЫ] 
      [exec] 1) UserTest :: testTalk 
      [exec] Не удалось утверждать, что две строки равны. 
      [exec] --- Ожидается 
      [exec] +++ Актуально 
      [exec] @@ @@ 
      [exec] - Привет, мир! 
      [exec] + «Привет, мир !!!» 
      [ВЫПЛНЫ] 
      [exec] /home/prospero/workspace/UserTest.php:15 
      [exec] / usr / bin / phpunit: 46 
      [ВЫПЛНЫ] 
      [exec] НЕУДАЧИ! 
      [exec] Тесты: 1, Утверждения: 1, Сбои: 1. 

 СТРОИТЬ НЕУДАЧИ 
 /home/prospero/workspace/build.xml:4: exec вернул: 1 

User.php … Я бы лучше вернулся в User.php и удалил эти лишние челки! Как только это будет сделано, я снова запущу Ant, прежде чем совершить коммит. Но вот когда зазвонил телефон, мое внимание требует неотложного вопроса, и User.php ускользает из моего разума. Вот почему нам нужен Дженкинс! Люди отвлекаются; компьютеры не делают.

Основная задача Дженкинса — не столько автоматизировать задачи, сколько контролировать их. На самом деле, автоматизация сборок — это не намного больше, чем работа cron, с которой справится любая приличная ОС. Дженкинс, конечно, облегчает создание таких заданий, называемых «триггерами». Но у него есть несколько других функций, связанных с определением того, кто несет ответственность за изменения, которые вызывают сбой теста, оповещение руководителей проектов, показ отчетов о возможных проблемах и многое другое. Вот откуда его полезность.

Настройка Дженкинс

Jenkins доступен на их веб-сайте в виде файла архива веб-приложения Java (.war) или в виде предварительно скомпилированных пакетов для нескольких популярных операционных систем. Используя WAR, просто поместите его в подходящую папку, скажем ~/jenkins и запустите:

  jajeronymo @ server: ~ / jenkins $ java -jar jenkins.war 

Это запускает Winstone, очень легкий контейнер сервлетов (своего рода сервер для приложений Java, который работает с Java более или менее так же, как веб-сервер работает с HTML и PHP). Терминал перечисляет несколько действий до окончания:

  ИНФОРМАЦИЯ: Jenkins полностью запущен и работает 

У Дженкинса есть веб-интерфейс, который прослушивает порт 8080. Указав свой браузер на http://localhost:8080 вы должны увидеть такой экран:

Чтобы создать наш демонстрационный проект, нажмите «Новая работа». Форма появится. Введите имя для работы (я введу «Демо») и выберите «Создать проект программного обеспечения в свободном стиле».

Затем нажмите OK, и длинный список параметров появится ниже в той же форме.

Ищите триггеры сборки и периодически проверяйте сборку. Появится текстовое поле с названием «Расписание». Напишите в нем «* / 5 * * * *». Это говорит Jenkins запускать процедуру сборки каждые 5 минут (здесь используется тот же синтаксис, что и в cron).

Перейдите в «Build» и нажмите «Add build step». Появится список параметров. Выберите «Invoke Ant» и нажмите кнопку «Advanced», которая появится. Эта кнопка показывает четыре текстовых поля. Во втором «Build file» напишите абсолютный путь к файлу build.xml используемому Ant. В моем случае это /home/jajeronymo/workspace/build.xml .

Перейдите в конец списка опций и нажмите «Сохранить». Это оно! С этого момента Jenkins будет запускать скрипт Ant каждые 5 минут, который, в свою очередь, проверяет любые изменения в User.php и, если ошибок не обнаружено, копирует его в папку сборки.

Из списка вакансий, который теперь отображается на начальной странице Jenkin, выберите нашу тестовую работу. В левой части окна вы можете увидеть список сборки. (Если он все еще пуст, вы можете нажать «Build now» в меню над ним, чтобы вызвать первую сборку).

Если вы исправили проблему в User.php , она должна пройти тест. Как только сборка заканчивается, Дженкинс добавляет в список ссылку с номером и временем выполнения, а рядом со ссылкой вы видите шарик — синий для успеха и красный для неудачи.

Нажав на ссылку, вы увидите меню, в котором вы можете выбрать изменения и пользователя, который запросил сборку. Нажатие на шар печатает вывод консоли Ant. Со временем сборки накапливаются. Вы можете поиграть с User.php , целенаправленно ломая и исправляя, и посмотреть, как это отражается в списке сборок и на выходе консоли.

Пока он остается запущенным, Jenkins будет неустанно запускать тест, и если проблем не будет найдено, перезапишите файл в сборке с последней стабильной версией User.php .

Резюме

Как было сказано в первой части, цель этой статьи заключалась в том, чтобы создать понимание проблем оперативной КИ, которые Дженкинс может решить для команды разработчиков. Наш пример был упрощен, но с этой и другими упомянутыми статьями заинтересованный читатель имеет инструменты для создания гораздо более сложных и полезных скриптов Ant. Об этом, пожалуйста, посетите http://jenkins-php.org/, где можно найти исчерпывающий шаблон для нескольких задач, связанных с разработкой PHP.

Изображение через Чарльза Тейлора / Shutterstock