
Схема развёртывания приложения – установка и настройка 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
Я дам имена двум хостам, которые у нас задействованы, чтобы пост был короче и писался быстрее. 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
Итак, заходим на 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 (192.168.3.96 – depl_host)
Теперь мы готовы создать наш проект в Jenkins. В следующем посте мы создадим ту его часть, которая реагирует на коммит и устанавливает приложение для тестирования.
Когда будет продолжение?
Очень надо, ибо разворачиваю сейчас нечто подобное.
Сегодня следующая часть. Следующая за ним тожее будет скоро (там о тестировании в Nerrvana из Jenkins). Затем финальный пост с реальными конфигурационными файлами.
Ok, спасибо, жду с нетерпением!