![](https://habrastorage.org/files/75b/bd9/f60/75bbd9f6074d4cb8a46ad705051aa8e0.png)
Удивительно, но факт — дистрибьюция Java приложений в 21 веке по прежнему огромный костыль. Разработчики до сих пор придумывают способы вроде rsync/copy-paste/wget для установки java приложений на сервер. И только монструозные enterprise production ready платформы иногда позволяют сделать чуть больше — откатить приложение на предыдущую версию. В этой статье я хотел бы рассказать о доступном и простом способе организации дистрибьюции.
deb и apt
В мире существует множество действительно гигантских репозиториев приложений и инструментов по их дистрибьюции. Самые большие, по ощущениям, — это AppStore, Google Play, Debian/Ubuntu репозитории и CentOS/Fedora YUM репозитории. Например в Ubuntu репозитории для версии 15.04 содержится около 90000 приложений (без учета различных версий). Почему бы не воспользоваться провернной временем системой и для дистрибьюции Java приложений? Тем более, что:
— большинство серверов и так используют Debian/Ubuntu
— проверенный временем инструмент: первый релиз был 16 лет назад
— нативная поддержка в операционной системе
Для начала немного о системе дистрибьюции приложений в Debian/Ubuntu. Она состоит из двух основных частей:
— deb пакеты
— apt (Advanced Package Tool) инструменты
deb пакеты
deb это бинарный дистрибутив приложения. Он состоит из 3 основных частей:
— метаинформация. Производитель, версия, зависимости на другие пакеты (очень похоже на maven), описание и пр.
— непосредственно приложение. .tar.gz архив
— (опционально) скрипты, которые будут выполняться во время установки
Структура .tar.gz архива может быть абсолютно произвольной. Однако, чтобы Ваше приложение было похоже на все остальные приложения системы, оно должно следовать структуре каталогов Debian/Ubuntu:
— /etc — конфиги
— /etc/init.d/ — скрипты запуска демонов
— /usr/bin — исполняемые файлы
— /usr/lib — библиотеки
— /usr/log — логи
В зависимости от Вашего приложения каталоги могут немного отличаться, но общая структура надеюсь понятна.
Еще одной важной особенностью deb пакетов является возможность запускать скрипты во время установки. Эти скрипты тоже хранятся в deb пакете и имеют стандартное именование. Каждый скрипт может выполняться в определенную фазу установки. Установка пакета делится на несколько фаз:
— preinst
— inst
— postinst
— prerm
— rm
— postrm
Существует множество различных промежуточных фаз и различные комбинации состояния инсталляции. Нас они мало интересуют, но тем кто хочет разобраться можно почитать официальную документацию. Обычно эти скрипты настраивают ротацию и архивирование логов, задают начальные значения конфигураций (например, root-пароль для mysql). Если же у вас конечное бизнес-приложение, то лучше взять какое-нибудь нормальное средство автоматизации вроде Ansible, Chief, Puppet.
apt
apt — это набор инструментов для работы с deb пакетами. Он позволяет:
— конфигурировать репозитории и работать с ними: добавлять, удалять, менять, обновлять индекс
— управлять пакетами: устанавливать, удалять, обновлять, искать
apt репозиторий в упрощенном виде — это HTTP сервер, который раздает deb пакеты. У него есть индекс (файл), который доступен по стандартному пути и непосредственно бинарники, путь к которым находится в индексе.
Связывая все воедино
После того, как стала понятна примерная схема работы связки deb + apt, можно попробовать их съинтегрировать. Примерная схема такая:
— создания deb пакета в фазе package
— публикация получившегося пакета в фазе deploy
Для этого есть несколько maven плагинов.
jdeb
Схема его работы достаточно проста:
— перечислить файлы и директории, которые попадут в результирующий .tar.gz архив
— указать пермиссии
Более полная документация о возможностях плагина можно узнать на официальной странице.
maven-apt-plugin
Работает с репозиторием заданным в distributionManagement как с apt репозиторием, а не maven репозиторием. Хотя ничего не мешает их использовать одновременно под одним url. Их layout’ы совместимы между собой.
Пример конфигурации выглядит следующим образом:
<plugin> <groupId>com.st.maven</groupId> <artifactId>maven-apt-plugin</artifactId> <version>1.0</version> <executions> <execution> <id>deploy</id> <goals> <goal>deploy</goal> </goals> </execution> </executions> <configuration> <component>main</component> <codename>strepo</codename> </configuration> </plugin>
И секция distributionManagement (ничего необычного):
<distributionManagement> <repository> <id>maven-release-repo</id> <url>http://example.com/maven</url> </repository> </distributionManagement>
После выполнения фазы deploy, example.com/maven станет еще и apt репозиторием. И можно смело писать:
sudo add-apt-repository "deb http://example.com/maven strepo main" sudo apt-get update sudo apt-get install <artifactId>
Немного любимого enterprise
Манца любого java-enterprise разработчика звучит следующим образом:
— security
— stability
— high availability production ready platform
Все это отлично решается, если устроить apt репозиторий из самого популярного хостинга для разработчиков: s3. Вкупе с cloudfront, он даёт гарантию 99.9% надёжности и географическую распределённость.
Делается это опять же достаточно просто. Надо подключить плагин для работы с s3:
<build> <extensions> <extension> <groupId>org.springframework.build</groupId> <artifactId>aws-maven</artifactId> <version>5.0.0.RELEASE</version> </extension> </extensions> ... </build>
Поменять url в секции distributionManagement на имя bucket’a:
<distributionManagement> <repository> <id>maven-release-repo</id> <url>s3://example.bucket</url> </repository> </distributionManagement>
И настроить доступ к вашему bucket’у:
<servers> <server> <id>maven-release-repo</id> <username>apikey</username> <password>apisecret</password> </server> ... </servers>
На конечных серверах для доступа к такому репозиторию существует специальный плагин: apt-transport-s3. К сожалению его еще нет в официальных репозиториях, поэтому необходимо добавить вручную один из репозиториев, где он содержится:
sudo add-apt-repository ppa:leonard-ehrenfried/apt-transport-s3 sudo apt-get install apt-transport-s3
После чего можно уже указывать наш s3 репозиторий:
sudo add-apt-repository "deb s3://apikey:apisecret@s3.amazonaws.com/example.bucket strepo main"
Итого
В результате всех манипуляций установка приложения:
— mvn clean deploy
На любом Debian/Ubuntu сервере в любой точке мира:
— apt-get update
— apt-get install artifactId
ссылка на оригинал статьи http://habrahabr.ru/post/264995/
Добавить комментарий