Nerrvana в работе – сборка приложения и Jenkins (часть 1)

Using Nerrvana - deployment & Jenkins (part 1)

Схема развёртывания приложения – установка и настройка Jenkins -
подготовка к установке приложения для тестирования

Part 1 – Nerrvana в работе – как это делается у нас
Part 2 – Nerrvana в работе – SVN втыкается в Jenkins
Part 3 – Nerrvana в работе – сборка приложения и Jenkins (часть 1) – этот пост
Part 4 – Nerrvana в работе – сборка приложения и Jenkins (часть 2)

Для начала несколько слов о развёртывании приложения (application deployment). В самом общем случае развёртывание заключается в превращении кода, полученного из системы контроля версий, в работающее приложение. Мы пока не используем Jenkins для обновления наших сайтов и сервисов, но предполагаем, что развёртывание для тестирования будет не очень отличаться от развёртывания для обновления или установки. В последнем случае нужно позаботиться о пользователях, сообщив им заранее о перерыве в работе сервиса и уделить большее внимание безопасности: правам доступа к файлам, возможности отката назад автоматически в случае неудачи. Так или иначе, сейчас эти проблемы нас не интересуют. Нам нужно получить работающее приложение на внутреннем сервере, с которым могут работать Selenium-тесты. Для различных приложений процедуры развёртывания будут разными. Мы расскажем о своей – в немного упрощённом варианте. В последнем посте цикла мы обязательно покажем свою конфигурацию, но сейчас эта информация будет попросту мешать.

Для работы нам понадобится Ant. Поэтому, если он не установлен – устанавливаем его (yum install ant). Теперь устанавливаем Jenkins. В этом нам поможет руководство.

jen_host#yum install java-1.6.0-openjdk
jen_host#sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
jen_host#sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
jen_host#yum install Jenkins
jen_host#chkconfig jenkins on
jen_host#service jenkins start

Итак, наше веб-приложение Answers написано на PHP. Это не веб-сервис, а приложение, которое вы покупаете и устанавливаете у себя.

Первой особенностью, связанной с тем, что это не веб-сервис, является отсутствие заранее сконфигурированного файла установок. Есть Settings.class.template.php, который используется инсталлятором для создания реального файла Settings.class.php. В будущем, возможно, мы напишем Selenium-скрипт, который будет устанавливать приложение так, как это будут делать пользователи (запуская инсталлятор), и заодно тестировать и его. Эх и заживём! Но пока его у нас нет, нам нужно как-то создать отсутствующий Settings.class.php перед началом тестирования. Для этого мы используем bash-скрипт, который с помощью sed меняет все нужные параметры в шаблоне. Мы, конечно, могли бы создать заранее готовый Settings.class.php и положить его в SVN. Но тогда, если добавится новый параметр в шаблоне конфига, мы можем забыть добавить его и в конфиг для тестов – не буду говорить, чем это чревато.

Второй особенностью нашего приложения является тот факт, что оно является встраиваемым в ваш основной сервис. Это значит, что в нём нет страниц входа (login) и выхода (logout). Сессия создаётся при входе в основное приложение, к которому подключаются Answers. Мы создали такие страницы для того, чтобы иметь возможность запускать Selenium тесты и положили в специальную папку вместе с пакетом Selenium тестов. В процессе разворачивания приложения нам нужно перенести эти файлы в корень виртуального сервера Apache, то есть туда, где их ожидают увидеть тесты.

Кстати сказать, начав использовать Jenkins в качестве CI-сервера и Nerrvana для запуска Selenium тестов, мы изменили структуру репозитория.

Структура проекта изменённая для CI и Selenium

Структура проекта изменённая для CI и Selenium

Я дам имена двум хостам, которые у нас задействованы, чтобы пост был короче и писался быстрее. jen_host – установлен Jenkins и depl_host – где будем тестировать наше приложение.

Таким образом, наша задача развёртывания в общем виде заключается:

  • в получении после коммита необходимой версии из SVN на jen_host
  • создании конфигурационного файла на jen_host
  • перемещении файлов login и logout в правильное место на jen_host
  • очистке на depl_host виртуального хоста от файлов, оставшихся от предыдущего тестирования
  • копировании подготовленного для работы тестов пакета Answers из jen_host в корень виртуального хоста на depl_host
  • пересоздании базы (ведь её структура тоже могла поменяться) на depl_host

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

Я не буду подробно описывать настройку depl_host. Скажу только, что там установлен Apache, PHP и MySQL.

Теперь мы позаботимся о том, чтобы наш пользователь ‘jenkins’ смог беспрепятственно попадать из jen_host в depl_host по ssh. У Jenkins уже есть приватный ключ, который лежит в /var/lib/jenkins/identity.key. Публичный же Jenkins посылает в заголовках HTTP, однако у нас не получилось подсоединиться с его помощью, и мы сгенерировали другую пару.

Jenkins публичный ключ в заголовках HTTP

Jenkins публичный ключ в заголовках HTTP

Итак, заходим на jen_host и генерируем ключи. Кодовую фразу (passphrase) я не вводил.

jen_host#cd /tmp
jen_host#ssh-keygen -f jenkey
jen_host#mv jenkey /var/lib/jenkins/
jen_host#chown jenkins:jenkins jenkey

Теперь переходим на depl_host, создаём пользователя ‘jenkins’ и кладём ему публичный ключ, который у нас остался в /tmp на jen_host.

depl_host#useradd -G apache jenkins
depl_host#cd /home/jenkins
depl_host#mkdir .ssh
depl_host#touch .ssh/authorized_keys
depl_host#chmod 755 .ssh
depl_host#chmod 644 .ssh/authorized_keys
depl_host#chown jenkins:jenkins authorised_keys

Копируем содержимое jenkey.pub в /tmp на jen_host в файл /home/jenkins/.ssh/authorized_keys на depl_host. Проверяем, вернувшись на jen_host командой:

jen_host#ssh jenkins@depl_host -i /var/lib/jenkins/jenkey

Заходим http://jen_host:8080/manage. Здесь нас будут интересовать плагины и общие установки Jenkins-а.

Нам понадобится плагин ‘Publish Over SSH’. Переходим на страницу http://jen_host:8080/pluginManager/available, выбираем вкладку ‘Available’, вводим в поле поиска (в верхнем правом углу) строку ‘ssh’ и, не нажимая ввод, ждём результатов аяксного поиска. Отмечаем чекбокс интересующего нас плагина и, если у вас большой монитор, опускаем глаза вниз, где находятся, собственно, две кнопки – ‘Поставить без перезапуска’ и ‘Загрузить и установить при перезапуске’.

Не пропустите кнопки на большом мониторе

Не пропустите кнопки на большом мониторе

Теперь настал черёд общих установок Jenkins – страница http://jen_host:8080/configure. Пусть вас не пугает размер формы. Всё, что нам нужно – так это добавить параметры SSH-сервера нашего depl_host.
В секции ‘SSH’ нажимаем кнопку ‘Add’. Если вы использовали кодовую фразу – вводим её. Далее указываем IP-адрес нашего depl_host, тестируем соединение и сохраняем конфигурацию, нажав ‘Save’ или ‘Apply’ внизу страницы.

Установки ssh в Jenkins

Установки ssh в Jenkins (192.168.3.96 – depl_host)

Теперь мы готовы создать наш проект в Jenkins. В следующем посте мы создадим ту его часть, которая реагирует на коммит и устанавливает приложение для тестирования.

Print this post | Home

3 comments

  1. Alexander says:

    Когда будет продолжение?
    Очень надо, ибо разворачиваю сейчас нечто подобное.

  2. Igor says:

    Сегодня следующая часть. Следующая за ним тожее будет скоро (там о тестировании в Nerrvana из Jenkins). Затем финальный пост с реальными конфигурационными файлами.

  3. Alexander says:

    Ok, спасибо, жду с нетерпением!