[Из песочницы] Развертываем Ratpack приложение на Heroku
Развертывание простого Ratpack приложения на Heroku на много сложнее, чем должно быть. После большого количества проб и ошибок, мне наконец удалось получить работающую конфигурацию для успешного развертывания. Эта статья — мануал о том, как развернуть приложение шаг за шагом. В следующей статье я расскажу, как использовать Gradle plugin для упрощения процесса.Артифакты
Для успешного развертывания, определенные артифакты должны быть представленны в вашем проекте для Heroku, чтобы успешно обнаружить ваше приложение. Эти файлы я рекомендую поместить в отдельную ветку в вашем Git, потому что Heroku использует Git для развертывания.Для начала нам нужно создать следующую структуру папок: bin├── compile└── detectИ файлы со следующим содержанием: bin/detect
#!/usr/bin/env bash
# bin/use
if [ -f $1/src/ratpack/ratpack.groovy ]; then
echo «Ratpack» && exit 0
else
echo «no» && exit 1
fi
bin/compile
#!/usr/bin/env bash
# bin/compile
# fail fast set -e
BIN_DIR=$(cd $(dirname $0); pwd) # absolute path
# parse args BUILD_DIR=$1 CACHE_DIR=$2
#env variables JAVA_DIST=«openjdk1.7.0_21» JDK7_URL=«https://s3.amazonaws.com/heroku-jdk/${JAVA_DIST}.tar.gz»
#create the cache dir if it doesn’t exist mkdir -p $CACHE_DIR
cd »$BUILD_DIR»
#jdk7 if [ -d .jdk7 ]; then echo »-----> .jdk7 folder found, moving along.»
else echo -n »-----> .jdk7 folder not found!» if [[ -d »$CACHE_DIR/.jdk7» ]]; then echo -n «Copying jdk from cache to app…» cp -r »$CACHE_DIR/.jdk7» »$BUILD_DIR» echo «Done!»
else echo -n »-----> Installing ${JAVA_DIST} build (to .jdk7)…» mkdir »$BUILD_DIR/.jdk7» cd »$BUILD_DIR/.jdk7» curl --max-time 180 --location »$JDK7_URL» | tar xz cd »$BUILD_DIR» echo «Done!» fi fi
cd $BUILD_DIR
export JAVA_HOME=»$BUILD_DIR/.jdk7» export PATH=»$JAVA_HOME/bin:$PATH»
echo » echo »-----> Building project with Gradle wrapper:» echo » ./gradlew clean installApp» export GRADLE_OPTS=»-Dfile.encoding=UTF-8 -server -Xmx512m -XX:+UseCompressedOops» export GRADLE_USER_HOME=»$CACHE_DIR/.gradle»
./gradlew clean installApp
rm -rf »$CACHE_DIR/.jdk7» cp -r .jdk7 »$CACHE_DIR/.jdk7» Далее нам необходим Procfile, оставим его в корневом каталоге нашего Ratpack проекта.Procfile
--- addons: config_vars: JAVA_OPTS: -Dfile.encoding=UTF-8 -server -Xmx512m -XX:+UseCompressedOops default_process_types: web: build/install/ratpack/bin/ratpack Файл build/install/ratpack/bin/ratpack, а так же папка build/install/ratpack появляются в web процессе. Этот файл и папка будут названа именем корневой папки вашего проекта. Можно (и нужно), переопределить это значение на развертывания в Heroku, так как имя корневого проекта происходит от создаваемого хэша. Для того, чтобы исправить это, мы должны установить имя root проекта, чтобы нечто известное (в нашем случае ratpack). Это может быть настроено в файле настроек в корне проекта:
settings.gradlerootProject.name = 'ratpack’Теперь нам нужно установить переменную окружения RATPACK_OPTS указывающую на переменную $PORT, предоставленную нам в процессе развертывания. Она должна быть прописана в скрипте скрытом в недрах нашего проекта в папке profile.d.
.profile.d/setenv.sh
#!/bin/bash echo «Setting environment varialbes…» export RATPACK_OPTS=»-Dratpack.port=$PORT» export JAVA_HOME=»${BUILD_DIR}/.jdk7» Теперь у нас есть следующая структура папок: ├── bin│ ├── compile│ └── detect├── Procfile├── .profile.d│ └── setenv.sh└── settings.gradle
Процесс развертывания Теперь нам нужно создать наше новое приложение на Heroku, используя команду buildpack. Это простая команда передает все команды артифактам, которые мы создали в нашем проекте. Команда так же создает наше приложение, как Cedar Stack основанное на Ubuntu 10.04 на Heroku.heroku apps: create myapplication --buildpack github.com/kr/heroku-buildpack-inline.gitДалее мы переключаемся на нашу новую ветку, которую мы создали для развертывания и коммитим туда все наши артифакты.
git checkout -b deploy git add bin Procfile settings.gradle .profile.d git commit -m 'Heroku deployment artifacts.' git push heroku deploy: master Теперь мы должны увидеть наше приложение успешно развернутым:-----> Fetching custom git buildpack… done-----> Ratpack app detected-----> .jdk7 folder not found! Copying jdk from cache to app… Done!
-----> Building project with Gradle wrapper:./gradlew clean installApp
-----> Compiled slug size: 64.8MB-----> Launching… done, v38myapplication.herokuapp.com deployed to HerokuИ мы можем посмотреть логи, чтобы подтвердить это: heroku logs --tail --num 100 --app myapplication
В следующей статье я расскажу, как сделать то же самое, использую Gradle плагин, который предложен здесь. Исходники можно посмотреть здесь. Оригинал статьи находится здесь. Спасибо за внимание.