Pull to refresh

Автоматизация развертывания Play! Framework приложений на платформе OpenShift

Reading time3 min
Views6.1K
    

Привет, хабражители! Сегодня я хотел бы рассказать о том, как можно воспользоваться бесплатным решением от 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="..\dist\deployments"/>

<!-- 
Выполняем сборку проекта с помощью команды "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, мы можем соответственно собирать и разворачивать наш прокет.

Не могу сказать, что решение элегантное — скорее оно смахивает на костыль. Но этот костыль помогает в кратчайшее время наладить быструю и удобную разработку сайта в бесплатном облаке, а значит он имеет право на существование.

Удачи!
Tags:
Hubs:
+3
Comments5

Articles

Change theme settings