Развертывание простого Ratpack приложения на Heroku на много сложнее, чем должно быть. После большого количества проб и ошибок, мне наконец удалось получить работающую конфигурацию для успешного развертывания. Эта статья – мануал о том, как развернуть приложение шаг за шагом. В следующей статье я расскажу, как использовать Gradle plugin для упрощения процесса.
Для успешного развертывания, определенные артифакты должны быть представленны в вашем проекте для Heroku, чтобы успешно обнаружить ваше приложение. Эти файлы я рекомендую поместить в отдельную ветку в вашем Git, потому что Heroku использует Git для развертывания.
Для начала нам нужно создать следующую структуру папок:
bin
├── compile
└── detect
И файлы со следующим содержанием:
bin/detect
bin/compile
Далее нам необходим Procfile, оставим его в корневом каталоге нашего Ratpack проекта.
Procfile
Файл 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
│ ├── 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
Далее мы переключаемся на нашу новую ветку, которую мы создали для развертывания и коммитим туда все наши артифакты.
Теперь мы должны увидеть наше приложение успешно развернутым:
-----> 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 плагин, который предложен здесь. Исходники можно посмотреть здесь. Оригинал статьи находится здесь. Спасибо за внимание.
Артифакты
Для успешного развертывания, определенные артифакты должны быть представленны в вашем проекте для 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 плагин, который предложен здесь. Исходники можно посмотреть здесь. Оригинал статьи находится здесь. Спасибо за внимание.