Статьи

Супер быстрое развертывание приложений Tomcat с использованием сценария PULL

Если вам удалось прочесть мой последний блог, вы вспомните, что я продемонстрировал простой скрипт для создания новой установки tomcat на сервере путем разделения двоичных файлов tomcat из файлов conf, сохранения двоичных файлов на FTP-сервере и файлов conf в версии контроль, с помощью сценария, объединяющего две части.

Следующим и наиболее очевидным улучшением этой идеи является создание системы для автоматического развертывания приложения после того, как оно скомпилировало и прошло свои модульные тесты. Есть много способов сделать это, от покупки высококлассных приложений у надежных поставщиков, до написания собственной системы Heath Robinson , основанной на клее, ножницах и клейкой ленте; однако, для меня, независимо от того, как вы смотрите на это, всегда будет только два жизнеспособных способа достижения автоматического развертывания. Первый — это метод вытягивания, а секунд — его аналог: push.

Предполагая, что у вас есть Hudson, Jenkins или какой-либо другой сервер сборки, который автоматически компилирует и тестирует модули проверки вашего кода, тогда PULL-процесс — это некоторый сценарий или процесс, который выполняется на вашем компьютере Tomcat, который запускается вручную или автоматически, и
Тянет последний WAR-файл из выходного репозитория вашего сервера сборки, развертывая его на вашем сервере Tomcat.

С другой стороны, процесс PUSH включает сервер сборки, выполняющий сценарий или выполняющий некоторый процесс, который доставляет или PUSHES файл WAR с сервера сборки на ваш веб-сервер.

Примером push-системы может служить плагин Maven Tomcat, выполняющий цель tomcat:redeploy как часть вашего процесса сборки. Например, « mvn install tomcat:redeploy ». Это означает, что когда ваша сборка Hudson или Jenkins выполняется и все ваши тесты пройдены, ваш WAR-файл автоматически развертывается на вашем сервере; однако, это не единственный доступный механизм push, и у него есть недостаток, который присущ всем системам, которые используют ваш сервер Tomcat как часть процесса развертывания.

Проблема использования tomcat как части процесса развертывания связана не с tomcat, а с вашим кодом. Вы должны быть уверены, что ваше приложение не содержит утечек памяти, что иногда бывает трудно сделать. Если у вашего приложения есть утечка памяти, то после java.lang.OutOfMemoryError: PermGen или двух вы получите исключение java.lang.OutOfMemoryError: PermGen tomcat, что означает, что для перезапуска сервера требуется ручное вмешательство. Помните, что исключение java.lang.OutOfMemoryError: PermGen является вашей ошибкой, а не ошибкой кота.

Мне кажется, гораздо лучше управлять перераспределением вашего приложения без помощи tomcat. Это позволяет выполнять основные шаги

  1. выключение вашего сервера Tomcat
  2. очистка любых каталогов развертывания
  3. определение точки отката
  4. развертывание новой версии вашего приложения
  5. перезапуск сервера

Преимущество остановки и перезапуска сервера состоит в том, что у вас есть «чистый» сервер, на котором можно начать тестирование, и, учитывая это, приведенный ниже пример сценария демонстрирует все вышеперечисленные моменты, используя пример моего address из репозитория CaptainDebug Github .

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
#!/bin/bash
 
echo 'Running Address Application install Script'
 
TOMCAT_VERSION=apache-tomcat-7.0.33-blog
 
# The FTP server holding the tomcat binaries
SERVER=<Your Server Name>
REPOSITORY=/.m2/repository/
ARTIFACT_ID=com/captaindebug/address/
APP=address
TYPE=WAR
 
SERVER_USER=<Your User Name>
SERVER_PASSWORD=<The Password Goes Here>
CUT_DIRS=6
NEW_VERSION_ARG=$1
 
wait_for_shutdown() {
 
 i=1
 while [ $i -le 20 ]
    do
    ps -ef | grep catalina.startup.Bootstrap > fred.txt
    if ls -l fred.txt | grep 81
    then
       i=21
    else
       i=`expr $i + 1`
       sleep 1
    fi
 done
}
 
check_version() {
 
    if [ -z $NEW_VERSION_ARG ]
    then
        VERSION=1.0.0-BUILD-SNAPSHOT
    else
         VERSION=$NEW_VERSION_ARG 
    fi
    echo 'Using version $VERSION'
}
 
make_app_location() {
 
    check_version
    APP_LOCATION=$REPOSITORY$ARTIFACT_ID$VERSION/$APP-$VERSION.$TYPE
}
 
do_shutdown() {
 
    cd ../$TOMCAT_VERSION
    bin/shutdown.sh
 
    wait_for_shutdown
}
 
clean_directories() {
 
    echo changing directory
    cd ../$TOMCAT_VERSION/webapps
    pwd
    rm -rf $APP
    rm $APP.$TYPE
}
 
get_new_version() {
 
    WAR_FILE=ftp://$SERVER_USER:$SERVER_PASSWORD@$SERVER$APP_LOCATION
    echo $WAR_FILE
    wget -r -nH --cut-dirs=$CUT_DIRS $WAR_FILE
}
 
create_rollback_point() {
 
    DATE=`date`
    BAK_FILE=$APP-$VERSION.$TYPE.$DATE.bak
    echo 'Backup file is $BAK_FILE'
    mv '$APP-$VERSION.$TYPE' '$BAK_FILE'
    ln -s '$BAK_FILE'  $APP.$TYPE
}
 
restart_server() {
 
    cd ..
    pwd
    bin/startup.sh
}
 
make_app_location
do_shutdown
clean_directories
get_new_version
create_rollback_point
 
echo 'The directory now looks like this:'
ls -l
 
restart_server

В этом сценарии на моем сервере Hudson создается пример кода адреса, и результат сохраняется в репозитории Maven. Сценарий находится в каталоге сценариев, который находится на том же уровне, что и сервер: apache-tomcat-7.0.33-blog . В сценарии используется метод Хита Робинсона, который завершает работу сервера и обеспечивает его отключение перед продолжением. Это делается путем проверки размера файла вызова временного файла fred.txt . При продолжении он очищает существующие каталоги, удаляя каталог развертывания address и символическую ссылку на файл war. Затем он использует wget для захвата новой версии приложения, причем версия указывается либо в командной строке, либо по умолчанию — 1.0.0-BUILD-SNAPSHOT .

Следующее, что нужно сделать, это создать точку отката, чтобы мы могли откатить последнее развертывание, если обнаружим, что оно содержит кучу отвратительных ошибок. Первый шаг здесь — переименовать переданный WAR-файл, добавив дату и расширение «.bak». Следовательно,

address-1.0.0-BUILD-SNAPSHOT.WAR

будет выглядеть так:

address-1.0.0-BUILD-SNAPSHOT.WAR.Tue 1 Jan 2013 20:18:21 GMT.bak

Добавление даты полезно при развертывании снимков, а «.bak» означает, что файл не будет загружен tomcat. Второй шаг в настройке отката достигается с помощью символической ссылки на переименованный файл WAR, так что развернутая WAR всегда будет называться
address.war независимо от любого номера версии, встроенного в имя файла.

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

Последняя строка скрипта перезапускает сервер.

Следующее, что нужно запомнить, это сохранить ваш скрипт в системе контроля версий.

Да, я знаю, что этот сценарий не так элегантен, как мог бы быть. Если у кого-то есть предложения по улучшению, пожалуйста, дайте мне знать …

Дополнительным преимуществом использования такого сценария является то, что вы можете использовать один и тот же сценарий для развертывания файла WAR вашего приложения в любой среде: dev, test, UAT, production или в любой другой. Преимущество этого в том, чтобы сделать вашу локальную среду разработки чуть более похожей на производственную среду; идея заключается в том, что это минимизирует ошибки и ошибки развертывания, делая вашу жизнь немного проще. Помните, давно прошли дни, когда вы могли сказать «хорошо, что это работает на моей машине» жалобе парней из ops, что ваше приложение не работает.

Следующее звено в цепочке развертывания состоит в том, что теперь что-то должно вступить во владение и запустить набор автоматических приемочных тестов, но об этом позже …

Справка: супер быстрое развертывание приложений Tomcat с использованием сценария PULL от нашего партнера по JCG Роджера Хьюза в блоге Captain Debug’s Blog .