Как стать автором
Обновить

Развертываем Ratpack приложение на Heroku

Время на прочтение 4 мин
Количество просмотров 3K
Развертывание простого Ratpack приложения на Heroku на много сложнее, чем должно быть. После большого количества проб и ошибок, мне наконец удалось получить работающую конфигурацию для успешного развертывания. Эта статья – мануал о том, как развернуть приложение шаг за шагом. В следующей статье я расскажу, как использовать Gradle plugin для упрощения процесса.

Артифакты

Для успешного развертывания, определенные артифакты должны быть представленны в вашем проекте для Heroku, чтобы успешно обнаружить ваше приложение. Эти файлы я рекомендую поместить в отдельную ветку в вашем Git, потому что Heroku использует Git для развертывания.
Для начала нам нужно создать следующую структуру папок:
bin
├── compile
└── detect
И файлы со следующим содержанием:
bin/detect
#!/usr/bin/env bash
# bin/use <build-dir>

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 <build-dir> <cache-dir>

# 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.gradle
rootProject.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
<snip/>
-----> Discovering process types
Procfile declares types -> JAVA_HOME, JAVA_OPTS, web

-----> Compiled slug size: 64.8MB
-----> Launching… done, v38
myapplication.herokuapp.com deployed to Heroku
И мы можем посмотреть логи, чтобы подтвердить это:
heroku logs --tail --num 100 --app myapplication

В следующей статье я расскажу, как сделать то же самое, использую Gradle плагин, который предложен здесь. Исходники можно посмотреть здесь. Оригинал статьи находится здесь. Спасибо за внимание.
Теги:
Хабы:
0
Комментарии 0
Комментарии Комментировать

Публикации

Истории

Работа

Java разработчик
359 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн