Привет, читатели! Сегодня я хотел бы рассказать о том, как можно воспользоваться бесплатным решением от RedHat для размещения своих сайтов в облаке на примере Play! Framework. Не буду описывать отдельно каждый из продуктов, т.к. про них уже не раз писали, расскажу лишь об их взаимодействии и моей схеме для автоматизации сборки и развертывания.
Итак, приступим. Создав JBoss приложение на OpenShift, мы получаем в распоряжение Git-репозиторий, в котором лежат семпловые исходники (для последующей замены на наши сорцы) и собранная версиях этих исходников в виде WAR-архива.
Разворачивать приложение можно двумя способами: или пропушивая на сервер исходники, которые будут собираться с помощью pom.xml, используя Maven, или пропушивая готовый WAR-архив. Других путей, к сожалению, нет: «заливать» файлы на сервер можно только через Git. Конечно, существует возможность присоединиться к серверу по SSH, но это используется больше для административных задач. На этом с OpenShift-частью пока закончим.
Play! Framework версии 2.1.1 (последней на данный момент), к сожалению, не поддерживает создание WAR-архива, он работает немного по-другому, создавая на выходе подобную структуру:
my-first-application-1.0
└ lib
└ *.jar
└ start
Я не сумел подружить такую дистрибьюцию с OpenShift (мейби это возможно — буду рад увидеть решение в комментариях), поэтому остановился на использовании версии 1.2.4.
Итак, создаем наше приложение:
play new SuperApplication
cd SuperApplication
play idealize / play eclipsify
На даном этапе мы получили тестовое приложение, убедиться в работоспособности которого можно выполнив команду play start
Далее добавляем соль/перец по вкусу вносим необходимые изменения — и мы готовы к развертыванию приложения.
Самое время вернуться к нашему OpenShift-репозиторию, который можно склонировать по следующему адресу: ssh://hashcode@superapplication-suffix.rhcloud.com/~/git/superapplication.git/
и в итоге мы получим нечто подобное:
superapplication
└ .git
└ bullshit
└ .openshift
└ bullshit
└ deployments
└ ROOT.war <---
└ src
└ sources
То, что нас интересует, выделено стрелкой. Соответственно, задача теперь сделать так, чтобы наш проект собирался в архив под названием ROOT.war, копировался в нужную папку, происходил коммит и пуш.
Теперь пару слов о конкретно моей ситуации. Все гораздо проще, ежели мы собираемся хранить исходники в том же самом репозитории. Но так вышло, что Web-часть была лишь одним модулем из нескольких, присутствующих у меня в проекте, а сам проект хостился на BitBucket. Поэтому папку src
из OpenShift я удалил за ненадобностью, базовую дерикторию переименовал в dist и использовал чисто для деплоя (не забудьте запушить изменения), а исходники продолжил хостить в отдельном месте. И теперь начинается шаманство…
Для автоматизации сборки и развертывания мною был выбран Ant. Не хочу долго описывать содержимое скрипта — он неплохо прокомментирован, поэтому сразу приведу его:
<project name="SuperApplication" default="dist" basedir=".">
<!-- Устанавливаем глобальные переменные для скрипта. -->
<property name="dist" location="..dist"/>
<property name="deployments" location="..distdeployments"/>
<!--
Выполняем сборку проекта с помощью команды "play war -o outputname"
Обратите внимание, что в Windows не смотря на корректно прописанные переменные окружения, приходится вызывать play.bat, указывая расширение.
После успешного билда зипуем то, что получилось, в архив, не забывая удалить ненужные файлы после этого.
-->
<target name="dist" depends="clean" description="generate the distribution" >
<exec executable="play.bat">
<arg line="war -o ${deployments}ROOT" />
</exec>
<zip destfile="${deployments}ROOT.war"
basedir="${deployments}ROOT" />
<delete dir="${deployments}ROOT"/>
</target>
<!--
Самое интересное - развертывание.
Обратите внимание: работаем не в директории текущего проекта, а в папке ${dist}, потому что именно там находится наш OpenShift-Git-репозиторий.
-->
<target name="deploy" description="upload war" >
<exec executable="git" dir="${dist}">
<arg line="add ."/>
</exec>
<exec executable="git" dir="${dist}">
<arg line="commit -m 'Deploy'"/>
</exec>
<exec executable="git" dir="${dist}">
<arg line="push"/>
</exec>
</target>
<!-- Выполняем очистку, удаляя старый ROOT.war -->
<target name="clean" description="clean up" >
<delete file="${deployments}ROOT.war" />
</target>
</project>
Вот, в принципе, и все. Используя цели dist и deploy, мы можем соответственно собирать и разворачивать наш прокет.
Не могу сказать, что решение элегантное — скорее оно смахивает на костыль. Но этот костыль помогает в кратчайшее время наладить быструю и удобную разработку сайта в бесплатном облаке, а значит он имеет право на существование.
Удачи!
Автор: drtitoff