Совершенствуем процесс сборки при помощи IBM Rational Build Forge: Часть 2. Автоматизируем процесс сборки для реального проекта TomcatИсточник: IBM Ян Лим
Описание: Изучив учебное руководство, вы узнаете, каким образом Rational Build Forge может расширить стандартный процесс компиляции и сборки за счет добавления средств пользовательской настройки и развертывания. Переходим от неавтоматизированных методов к автоматизации: проверки на наличие изменений кода, получения самого актуального исходного кода, компиляции и упаковки, настройки, копирования файлов на сервер развертывания и перезапуска сервера, и, наконец, отправки уведомлений по электронной почте о доступности новой версии. В этой серии рассказывается о том, как реализовать систему управления сборками, которая будет использовать и расширять уже имеющиеся в вашей среде автоматизированные технологии. Изучение данной серии из двух статей позволит вам повысить показатели производительности с 0 до 96 bpd (builds per day, сборок в день) за два дня. ПЕРЕД НАЧАЛОМ РАБОТЫ В 1-й части данной серии мы установили систему Rational Build Forge и попробовали удаленно управлять сборкой программы Hello World. В этой части учебного руководства вы узнаете, как выполнить сборку реального проекта Jakarta Tomcat. Tomcat - один из самых успешных проектов с открытым исходным кодом в мире. Он представляет собой ядро исполнения сервлетов, которое используется в крупных и малых производственных средах.. День второй. В процессе изучения данного учебного руководства вы узнаете, как:
Предполагается, что вы уже закончили изучение 1-й части данной серии. Кроме того, мы предполагаем, что вы имеете представление о сборке Java-приложений. Среда Build Forge не зависит от конкретного языка программирования, но проект Tomcat написан на языке программирования Java. Опыт работы с Apache Ant и Subversion полезен, но не обязателен. Для выполнения примеров учебного руководства необходимо установить следующее программное обеспечение:
Это не самые последние версии Java, Ant и Subversion. Первоначальные попытки выполнить сборку Tomcat при помощи Java 6 не увенчались успехом. Решению проблемы могло бы помочь изменение свойств сборки, но подобные действия могли бы усложнить изучение данного руководства. Для сборки проекта Tomcat и подключения к репозиторию Tomcat Subversion необходимо подключение к сети Интернет. УСТАНАВЛИВАЕМ НЕОБХОДИМОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ Если в вашей системе не установлены JDK, Apache Ant или Subversion, не беспокойтесь. Их совсем несложно установить. Самая распространенная ошибка - не включить каталог bin для каждого продукта в переменную окружения path. В результате при вводе команды
Убедитесь в том, что путь к каталогу bin отображается в значениях системной переменной окружения path.
Необходимо также добавить переменные окружения ANT_HOME и JAVA_HOME. Эти переменные окружения, как и path, устанавливаются через Control Panel (Панель управления) > System (Система) > Advanced (Дополнительно) > Environment Variables (Переменные среды). Установив JDK, Ant и Subversion, проверьте их работоспособность; для этого откройте новое окно командной строки, перейдите в каталог C:\ и введите следующие команды:
ВЫПОЛНЯЕМ СБОРКУ TOMCAT ИЗ КОМАНДНОЙ СТРОКИ Если вам до сих пор не приходилось выполнять сборку продукта с открытым исходным кодом из исходного кода, то Tomcat - самый подходящий проект для изучения этого процесса. Распакуйте файл архива с исходным кодом в каталог и воспользуйтесь Ant для запуска скриптов сборки Tomcat.
Теперь необходимо проверить, можно ли использовать файлы, созданные процессом сборки. По умолчанию, сервер Tomcat запускается на порту 8080. Если этот порт используется каким-либо другим приложением, то запуск не будет выполнен. Предположим, что порт 8080 свободен, и мы можем запустить tomcat. В командной строке из каталога C:\tomcat_build\apache-tomcat-6.0.14-src\output\build\bin введите команду При запуске Tomcat из командной строки будет открыто отдельное окно, которое останется открытым после запуска. Если при запуске произойдет какая-либо ошибка (например, в момент запуска выяснится, что порт используется), то окно закроется раньше, чем вы сможете его увидеть. Чтобы понять причину неудачи, запустите утилиту Если адрес существует, и вы убедились, что ни один процесс не использует данный порт, попробуйте выполнить в этом каталоге команду Подключитесь к Tomcat через Web-браузер Откройте в Web-браузере http://localhost:8080/, чтобы просмотреть страницу администрирования Tomcat по умолчанию. В этом учебном руководстве мы несколько раз будем выполнять повторные сборки и перезапуски сервера Tomcat. Пока завершите его работу, выполнив команду Дополнительный контроль над процессом сборки Использование параметров по умолчанию дает результаты, но это не совсем то, что нужно. Важнее всего то, что по умолчанию вывод записывается в каталог, в котором находится файл Tomcat build.xml (используется относительное указание пути). При повторной сборке Tomcat предыдущая сборка будет перезаписана (или останется без изменений, если сборка не была выполнена). После этого будет невозможно понять, какая версия или сборка с каким номером создала двоичные файлы в каталоге output. Чтобы контролировать такие моменты как каталог записи вывода, необходимо создать текстовый файл с именем build.properties в каталоге C:\tomcat_build\apache-tomcat-6.0.14-src и добавить в него следующие значения:
Кроме того, нам нужна возможность запускать команду
Теперь мы контролируем процесс сборки Tomcat настолько, чтобы настроить автоматизацию при помощи Build Forge. Мы добились такого уровня контроля, не изменяя скриптов сборки Tomcat. ВЫПОЛНЯЕМ СБОРКУ TOMCAT ПРИ ПОМОЩИ BUILD FORGE В 1-й части мы создали в Build Forge проект Hello World и воспользовались консолью управления Build Forge Management Console для выполнения команд при помощи удаленного агентского компонента. Теперь мы создадим более полную конфигурацию сборки для выполнения сборки Tomcat. С этой целью мы создадим группу окружения Build Forge для хранения параметров, а также проект и шаг в проекте для выполнения Ant-скрипта Tomcat с правильными параметрами. До сих пор все, что касалось сборки Tomcat, выполнялось вручную. В этом разделе мы начнем раскрашивать зеленым цветом ячейки в столбце "Автоматизированные" напротив автоматизированных задач. Проект (Project) будет исходной точкой для выполнения и настройки конфигурации сборки. Чтобы создать новый проект, выполните следующие действия:
Build Forge позволяет контролировать имя каждой сборки в проекте при помощи тега project . Для проекта Tomcat настройте этот тег таким образом, чтобы он отображал версию Tomcat, сборка которой выполняется (версия 6), и порядковый номер сборки, который будет увеличиваться при каждом выполнении сборки. Теги позволяют отличать сборки друг от друга и управлять размещением вывода для каждой сборки. Теги для первых двух сборок будут TC_6_BUILD_1, TC_6_BUILD_2 и т.д.
Создаем группу окружения проекта Группа окружения будет содержать все параметры, необходимые для управления сборкой. Группы окружения в Build Forge предоставляют уровень абстракции, который:
Группы окружения ассоциируются с серверами, проектами и шагами. При выполнении шага сборки этот шаг обращается к параметрам в группах окружения, которые ассоциированы с этим шагом, проектом, в котором он содержится, и сервером, который был выбран (возможно, динамически) для этой сборки. Чтобы получить дополнительную гибкость, продумайте типы переменных окружения, которые нужно создать. Для примера в этом учебном руководстве нам необходима группа окружения, которая будет использоваться каждым шагом в проекте Tomcat. Эта группа будет содержать свойства, которые были определены ранее в файле build.properties при запуске сборки вручную из командной строки.
Вводим параметры группы окружения После того как вы нажали кнопку Save Environment в предыдущем шаге, окно программы изменилось. Теперь мы можем отредактировать параметры группы окружения tomcat_build_properties. Используйте эту панель для создания необходимых свойств. Первое свойство, которое нужно определить, будет управлять каталогом записи вывода, созданного в процессе сборки. Здесь в ручной процесс сборки необходимо внести значительное усовершенствование. Неавтоматизированный процесс сборки всегда записывает вывод в один и тот же каталог output, что может обусловить ряд проблем:
В качестве передового метода рекомендуется использовать систему управления сборками типа Build Forge, которая будет создавать новые каталоги сборки при каждом запуске сборок. Build Forge для управления этим поведением предоставляет ряд встроенных переменных в параметрах окружения.
При каждом выполнении сборки значения Создаем остальные переменные группы окружения Остальные переменные будут повторно использовать переменную
Ассоциируем группу окружения с проектом Связь между группой окружения и проектом создается на вкладке Project Details.
Чтобы открыть список шагов проекта Tomcat, нажмите ссылку Tomcat в списке проектов. Теперь у нас есть переменные, необходимые для того, чтобы выполнить сборку и получить вывод в разных каталогах при каждом выполнении. Теперь нам нужно указать команды командной строки, необходимые для выполнения сборки. Может показаться, что нам нужна всего одна команда (та, что мы вводили ранее в командной строке), но на самом деле нам необходимы две команды. Из-за особенностей механизма использования командной оболочкой Ant переменных окружения в скриптах сборки Tomcat недостаточно, чтобы эти переменные просто существовали в памяти (это обеспечивает Build Forge). Они должны на самом деле считываться Ant в процессе сборки. В Tomcat, как и в любом другом внешнем проекте, вы не можете диктовать разработчикам, как они должны писать сценарии сборки, поэтому придется работать с тем, что есть. Механизм, который рабочая группа Tomcat выбрала для извлечения параметров, основан на импорте файла свойств, поэтому нам нужно сначала создать такой файл и внести в него параметры сборки. 1. Введите 2. Убедитесь, что в поле Path по умолчанию выбрано значение Relative. 3. В поле Command введите нижеследующий текст, а в остальных полях оставьте значения по умолчанию.
4. Нажмите кнопку Save Step. На предыдущем шаге был создан файл temp.properties. Теперь мы создадим шаг, который ссылается на этот файл, а также на файл build.xml, который мы запускаем из командной строки.
На экран будет выведено периодически обновляемое окно с индикатором выполнения сборки. После выполнения каждого шага в результатах показывается успешность или неуспешность его выполнения. Все выглядит так, как будто сборка работает. Так ли это на самом деле? Метод, который по умолчанию использует Build Forge, чтобы оценить результат - это анализ кода завершения, который операционная система возвращает при выполнении шага. В отношении задач Ant, аналогичных показанной в шаге 2 ниже, коду завершения не всегда можно доверять.
Почему же код завершения показывает Build Forge, что шаг был успешно выполнен? В данном случае операционная система получила указание выполнить команду Ant с набором параметров (которые содержатся в файлах build и properties). Если операционная система может найти команду Ant, а команда Ant может найти указанные файлы, то этого достаточно, чтобы получить код завершения, говорящий об успешности выполнения. Данная проблема часто возникает при сборке. Успешность или неуспешность выполнения шага часто приходится определять путем изучения вывода сборки. Поиск нужной информации в длинных файлах журналов - это дорогостоящая и подверженная ошибкам процедура. Build Forge предоставляет возможность автоматизировать поиск сообщений при помощи фильтров журнала. Создайте фильтр журнала для поиска не слишком загадочного сообщения BUILD FAILED в шаге Ant, примените его к шагу и повторно выполните шаг.
Каждый фильтр может иметь любое число шаблонов. Шаблоны - это регулярные выражения, которые Build Forge применяет к выводу журнала. Чтобы узнать предлагаемые возможности, изучите команды в меню Action. Очень полезна команда Notify, которую мы в данном учебном руководстве использовать не будем. Прекрасным примером применения Notify в фильтре журнала может быть создание шаблона, который будет искать сообщение об ошибках переполнения диска в процессе выполнения шага сборки, создающего много файлов. Без этой операции уведомления для разработчиков - это пустая трата их времени. Необходимо уведомить об ошибках операторов, чтобы они могли освободить место на диске или указать новое место для записи. Использование команды Notify в фильтрах позволяет отправлять целевые уведомления. Если пользователи получают только те сообщения, которые касаются непосредственно их, то вероятность того, что они примут автоматически рассылаемые электронные сообщения за спам, будет гораздо меньшей.
Примените созданный фильтр к шагу Ant в сборке Tomcat
Теперь, после запуска сборки, мы получим корректное уведомление о том, что сборка не была выполнена. Изучив записи в журнале для этого шага, вы также увидите, что фильтр журнала выделил совпадения, в значительной степени упростив поиск момента сбоя в длинном журнале. Теперь нам нужно решить проблему, вызвавшую появление сообщения Добавьте недостающее значение группы окружения
Чтобы снова запустить проект, выполните следующие действия.
Теперь сборка будет выполнена, в чем можно убедиться, изучив окончание записи в журнале. Прежде чем запускать Web-сервер Tomcat, необходимо изменить номер порта, на котором он будет ожидать запросы. Порт, заданный по умолчанию (8080), возможно, уже используется, поэтому изменим номер порта на 8081. Переменная группы окружения определена при помощи этого значения, поэтому нам нужно выяснить, в какой файл необходимо записать значение, и решить, как внести изменение. Файл Tomcat server.xml в каталоге output\build\conf - это как раз тот файл, который нужно изменить. Существует несколько способов (причем один проще другого) сделать это. Build Forge предоставляет несколько удобных методов для выполнения распространенных задач сборки и развертывания. Один из методов - команда Автоматизируем операцию изменения порта Tomcat Создайте в проекте сразу после шага сборки шаг для изменения номера порта, как показано ниже.
Еще раз выполните проект, последовательно нажав кнопки Start Project и Execute. В выводе журнала мы увидим результат подстановки. Тестируем собранные двоичные файлы Теперь мы готовы запустить Tomcat и проверить, получился ли в результате сборки работоспособный сервер Tomcat.
Откройте в браузере URL http://localhost:8081/ и убедитесь, что сервер Tomcat запущен. Позднее мы перезапустим сервер Tomcat. Чтобы избежать ошибок на данном этапе, пока остановим Tomcat. Для этого либо закройте окно командной строки, из которой он был запущен, либо нажмите Ctrl+c и подтвердите завершение пакетного задания. Попробуйте обновить страницу http://localhost:8081/ в браузере. Если вы завершили работу Tomcat, то вы увидите сообщение об ошибке. Это именно то, что нужно! Теперь можно раскрасить зеленым цветом ячейки напротив еще нескольких задач.
ВЫПОЛНЯЕМ РАЗВЕРТЫВАНИЕ TOMCAT ПРИ ПОМОЩИ BUILD FORGE Автоматизация процесса сборки - это достижение. Рекомендуем вам пойти дальше и автоматизировать процесс развертывания и, если можно, верификации сборки при помощи автоматизированных тестов. В этом разделе мы дополним сборку Tomcat процессом развертывания. Для имитации развертывания мы создадим в Build Forge новый объект server, который будет выполнять функции сервера развертывания. Развертывание будет осуществляться в той же физической системе, которая использовалась для сборки, но мы логически разделим эти две среды, чтобы в дальнейшем было легче мигрировать на другой физический сервер. При помощи Build Forge можно достоверно имитировать многосерверную среду. Чтобы создать каталог развертывания и открыть к нему общий доступ, выполните следующие действия.
Чтобы создать сервер развертывания в Build Forge:
Тестируем подключение к серверу развертывания:
Создаем объект selector для сервера развертывания:
Чтобы добавить переменную селектора:
Теперь, когда у нас есть сервер, на котором можно выполнить развертывание, и этот сервер ограничен работой в каталоге c:\deploy , можно перейти к созданию шагов для выполнения развертывания. Развертывание обычно включает четыре стадии:
На данный момент лучшим передовым методом считается включение в процедуру автоматизированных тестов, позволяющих убедиться в том, что только что собранный и развернутый код готов для передачи тестировщикам. Хороший вариант - использование инструмента типа Rational Functional Tester, пригодного для тестирования Web-приложений. Программа откроет страницу, выполнит переход по нескольким ссылкам, попытается сделать запись об операции в журнале и т. д. В этом учебном руководстве мы не будем касаться таких сложных моментов, и вместо этого выполним быструю проверку на уровне операционной системы, чтобы убедиться, что процесс прослушивает порт 8081 Это будет прекрасным свидетельством того, что только что развернутый сервер Tomcat готов к работе. Этот тест выполняется при помощи команды
Этот фильтр действует в два этапа. На первом этапе он констатирует невыполнение шага при наличии в выводе строки Создаем шаг для тестирования Tomcat
Теперь наш список шагов больше похож на реальный проект, чего и следовало ожидать, поскольку мы выполнили сборку и развертывание настоящего Java-проекта. Запустите проект как обычно, нажав последовательно кнопки Start Project и Execute. Можно поставить еще несколько галочек. Общие задачи развертывания выполнены. После успешной сборки Build Forge теперь может остановить сервер, удалить ненужные файлы, скопировать новые файлы и перезапустить сервер развертывания. НЕПРЕРЫВНАЯ ИНТЕГРАЦИЯ До сих пор мы в достаточной степени контролировали проект, используя Build Forge для управления сборками. Возможно, вы думали и о других способах, которые могли бы улучшить или дополнить описанные функции. Почему бы не включить номер сборки Build Forge в HTML-код домашней страницы при помощи команды Реальный пример использования сборки Tomcat, который мы создали, предназначен для сборки Tomcat из самой последней версии кода при любом внесении разработчиком изменений в базовый код Tomcat. Вслед за этим можно взять внутренний проект сервлета, развернуть его на только что созданном и развернутом сервере Tomcat и выполнить тесты, чтобы посмотреть, все ли в порядке. Чтобы описанное тестирование интеграции между Tomcat и вашим кодом выполнялось непрерывно (непрерывная интеграция), необходимо:
Наша цель - автоматизировать все этапы этого процесса. Как и при автоматизации сборки, мы начнем выполнять процесс вручную, найдем способы преодоления различных препятствий и, после того как процесс будет успешно выполняться из командной строки, используем Build Forge для настройки автоматизации. Запускаем процесс выгрузки из репозитория Subversion В окне командной строки введите следующую команду:
Клиентский компонент системы Subversion установит соединение с репозиторием Tomcat Subversion и начнет копирование самой последней версии кода в каталог c:\temp\svn_tomcat. Получаем обновленные зависимые файлы для Tomcat После того как последняя версия кода загружена, необходимо получить обновленные библиотеки для выполнения компиляции. В командной строке введите команду:
Запускаем сборку Tomcat из командной строки Используя свойства по умолчанию, выполните сборку Tomcat в каталог c:\temp\svn_tomcat\trunk посредством ввода в окне командной строки команды:
Запускаем сборку Tomcat из Build Forge В процессе изучения данного учебного руководства разработчики Tomcat в последней версии кода Subversion изменили каталог по умолчанию для библиотек, используемых в этом процессе сборки, с c:\usr\share в 6.0.14 source на c:\usr\share\java. Чтобы изменить параметры сборки для изменений Tomcat:
Изменяем файл build.xml, на который ссылается проект Tomcat:
Снова выполните проект с самой последней версией исходного кода, нажав последовательно кнопки Start Project > Execute. Мы сделали необходимые изменения, позволяющие нам получать последнюю версию кода для сборки в рабочей группе Tomcat. Мы использовали инструмент Subversion для получения самой последней версии кода вручную, и теперь мы готовы к настройке Build Forge на непрерывное получение самой последней версии кода. Build Forge использует адаптеры для взаимодействия с такими системами управления версиями как Subversion, IBM® Rational ClearCase, CVS и т. п. Адаптеры пишутся на гибком языке программирования на базе XML, который специально предназначен для взаимодействия с API командной строки. Функция адаптера заключается в выполнении команд, необходимых для непрерывной интеграции, анализе вывода и принятии однозначного решения по поводу запуска сборки. Адаптер хранит необходимую информацию, например, номер версии в репозитории с момента последней успешной сборки, в переменных группы окружения. Кроме того, он хранит информацию об идентификационных данных разработчика, зафиксировавшего изменения в базовом коде, и изменения кода; вся эта информация фиксируется в отчетах сборки или используется в уведомлениях по электронной почте. Чтобы настроить непрерывную интеграцию, необходимо создать несколько перечисленных ниже объектов Build Forge.
Создаем группу окружения адаптера Нам нужно создать пустую группу окружения, которая будет заполнена системой Build Forge после создания адаптера.
Пока не нужно добавлять переменные в эту группу окружения. Разрешаем использование шаблонов адаптеров для системы Subversion Чтобы гарантировать загрузку шаблонов для системы Subversion через Build Forge, выполните следующие действия:
Чтобы связать воедино проект, группу окружения адаптера и сам адаптер, мы создаем связку адаптера Adaptor Link.
Чтобы проверить сгенерированные переменные группы окружения адаптера, выполните следующие действия.
При сохранении связки адаптера были созданы следующие переменные и значения. Для синхронизации с репозиторием Tomcat Subversion значения по умолчанию необходимо изменить. Необходимо указать номер последней версии ( Получаем номер редакции Subversion для текущей версии кода В командной строке введите команду:
Просмотрите результаты выполнения команды Для целей тестирования укажите число редакций, в которых будут выбраны изменения, но не больше 50, в противном случае выполнение команды Эта команда выполнит запрос к репозиторию Tomcat Subversion на выборку записей в журнале, относящихся к изменениям, имевшим место между указанными номерами редакций. Если командная строка показывает всего один журнал, попробуйте выполнить команду снова с меньшими значениями, убывающими на 100 при каждом выполнении команды, пока не получите нужный результат. Запишите значение, потому что позднее его придется вводить в переменной группы окружения адаптера SVN_LAST_REV. Чтобы записать значения в переменные группы окружения, выполните следующие действия:
Повторите процедуру для перечисленных ниже переменных, а для остальных переменных сохраните значения по умолчанию.
После вызова адаптер получает доступ к переменным окружения адаптера, которые применяются в качестве параметров для команд системы Subversion. Адаптер выполнит три команды:
Если команда Адаптеры исходного кода, аналогичные тому, который мы настроили, предназначены для выполнения по расписанию. Однако при создании и отладке адаптеров ожидание запланированного времени означает непроизводительную потерю времени. Чтобы запустить адаптер вручную, необходимо изменить системные параметры.
Чтобы запустить адаптер, выполните следующие действия:
Изучаем спецификацию материалов Bill of Materials В процессе сборки адаптер записывает информацию в спецификацию материалов Bill of Materials. Спецификация материалов Bill of Materials представляет собой документ аудита, который содержит журналы сборки и изменения, относящиеся к сборке, и может служить основой для отчета сборки. Чтобы получить доступ к спецификации материалов Bill of Materials по завершении сборки, выполните следующие действия:
Адаптер может проверять наличие изменений и запускать сборку при их обнаружении. Теперь нам нужно настроить расписание его запуска. Расписание должно отражать ваше решение в отношении частоты выполнения проверок. Чем чаще в базовый код вносятся изменения, тем чаще необходимо выполнять сборки. Минимальный интервал между сборками должен быть равным средней продолжительности сборки плюс время на буферизацию, если только у вас нет специального кластера серверов сборки для выполнения сборок. Для нашего примера укажите в расписании время запуска через каждые 15 минут. Значения для периодичности запуска расписания должны быть знакомы специалистам, которым приходилось конфигурировать задания для демона cron на серверах UNIX. В противном случае поищите примеры в интернет-справке по Build Forge.
Можете раскрасить зеленым цветом ячейку в столбце "Автоматизированные" для еще одной задачи. Обновляем исходный код Tomcat в процессе сборки В столбце неавтоматизированных осталась задача "Получить самую последнюю версию исходного кода". Хотя адаптер проверяет код на наличие изменений и записывает отличающиеся фрагменты кода, на самом деле он не обновляет код, который собирает и развертывает Build Forge. Чтобы исправить это, необходимо добавить еще один шаг.
Теперь список шагов включает новый шаг перед шагом Build Tomcat. Конфигурируем сервер для отправки уведомлений по электронной почте Для выполнения этого шага нам необходим IP-адрес SMTP-сервера, через который консоль управления Build Forge Management Console сможет отправлять почту.
Настраиваем адрес электронной почты для учетной записи пользователя
Прекрасная работа - мы закончили автоматизацию задач. Build Forge проверяет репозиторий Tomcat Subversion по сети Интернет каждые 15 минут на наличие изменений в коде. Если изменения будут обнаружены, система обновит наш локальный код и запустит сборку. По завершении сборки Build Forge изменит конфигурационный файл Tomcat, чтобы подготовить его для использования в среде развертывания. После этого Build Forge передаст только что скомпилированный код на сервер развертывания, выполнит перезагрузку экземпляра сервера Tomcat и выполнит тест. ЗАКЛЮЧЕНИЕ В этом учебном руководстве мы шаг за за шагом выполнили сборку реального проекта. Теперь вы знаете, как выполнить сборку Tomcat с нуля, автоматизировать сборку при помощи Rational Build Forge, развернуть сервер Tomcat, изменить параметры развертывания, получить актуальную версию кода Tomcat из репозитория и настроить Build Forge на выполнение регулярных проверок кода на наличие изменений с последующим запуском сборок. Неплохо для двух дней работы. |