gawk — смотреть с открытым ртом, вытаращить глаза
Никаких шуток, я опишу, как запустить веб-сервис Awk (Gawk) на IBM Bluemix.
CloudFoundry и созданная на его основе платформа IBM Блюмикс поддерживать много разных языки программирования и веб-фреймворки.
Все это благодаря поддержке билдпаков (мой перевод слова buildpack).
Пакет сборки можно рассматривать как плагин, который отвечает за установку и настройку среды выполнения приложения.
Сборочный пакет обычно создается в двух случаях.
Зачем писать сборочный пакет?
В первом случае поддерживается язык или фреймворк, но для приложения требуются сторонние библиотеки, например OpenCV, которые невозможно установить с помощью стандартного менеджера зависимостей для этого языка (npm, pip, Bundler).В этом случае модифицируется существующий билдпак и добавляется установка необходимых библиотек.
Большая часть билдпаков лежит на github, делается форк, с помощью которого можно развернуть приложение.
Второй случай более редкий — язык пока не поддерживается, т.е.
билдпак еще никто не создал.
В этом случае вам придется сделать его с нуля, о чем будет рассказано ниже.
Я долго искал какой язык CloudFoundry еще не поддерживает, выбор пал на Brainfuck. К сожалению, когда я закончил сборку, я понял, что быстро написать веб-сервер на этом языке я не смогу.
Поиск показал, что у других возникли трудности с этой задачей.
Чтобы было немного понятнее, в чем проблема: билдпак устанавливает среду, в которую затем помещается пользовательское приложение; имя порта и хоста передаются ему через переменные среды, где приложение должно начать обработку HTTP-запросов.
Те.
Простого приветствия, мир, недостаточно.
Я продолжил поиск и нашел реализацию веб-серверов на Постскриптум И Авк (точнее глазеть) .
В результате я выбрал Awk и начал писать новый билдпак.
Ок, что пишем?
Документация хорошо описывает общие понятия, также можно посмотреть готовые билдпаки.В самом простом случае вам нужно создать папку bin и поместить в нее 3 исполняемых файла: обнаружить — определяет, можно ли применить этот билдпак к приложению.
Если да, то сценарий должен вернуть 0 и вывести название языка или платформы.
В нашем случае мы проверяем наличие app.awk в корне приложения и вводим такое соглашение.
компилировать необходимо установить все необходимое и скомпилировать пользовательское приложение, если требуется.#!/usr/bin/env bash # bin/detect <build-dir> # Any awk web app must have app.awk file if [ -f $1/app.awk ]; then echo "gawk" exit 0 fi exit 1
В нашем случае нам нужно скачать и установить gawk. Чтобы сэкономить время при развертывании приложения, вы можете собрать его вручную для разных версий Ubuntu и на этом этапе выбрать подходящую.
Но создание gawk не так уж и дорого, и оно поддерживается кэшем, поэтому большинству проектов потребуется скомпилировать только один раз.
Но мы обязательно получим файл, скомпилированный под нужную версию ОС и архитектуру.
#!/usr/bin/env bash
# bin/compile <build-dir> <cache-dir>
set -e
build_dir=$1
cache_dir=$2
awk_cache=$cache_dir/gawk-4.1.3
awk_url=" http://ftp.gnu.org/gnu/gawk/gawk-4.1.3.tar.gz "
if [ -f $awk_cache/gawk ]; then
echo "Using cached gawk"
else
# download and compile gawk
mkdir -p $awk_cache
curl -o $cache_dir/gawk.tar.gz "$awk_url"
cd $cache_dir
tar zxvf gawk.tar.gz
cd $awk_cache
.
/configure
make
fi
# copy gawk to build dir
cp $awk_cache/gawk $build_dir
# set path and test gawk
PATH=$build_dir:$PATH
gawk -V
# create a launcher to wrap env vars passing
echo "#!/usr/bin/env bash\n" > $build_dir/awk-start
echo "/app/gawk -v PORT=\"\$PORT\" -v HOST=\"\$VCAP_APP_HOST\" -f \$1" >> $build_dir/awk-start
chmod +x $build_dir/awk-start
Первый аргумент — это местоположение сборки файла (build_dir), второй — кеш.
Наша задача — поместить файлы, необходимые для запуска, в build_dir, в нашем случае это gawk. Кроме того, сценарий Awk не имеет доступа к переменным среды, и нам необходимо знать, какой порт CloudFoundry выделяет нам для запуска (переменная среды PORT).
Поэтому я сделал небольшую обертку для удобства запуска.
выпускать — передает метаданные, необходимые для запуска приложения.
Обычно это переменные среды и строка запуска по умолчанию.
Он будет использоваться, если приложение не предоставляет эту информацию, что обычно делается в Procfile. #!/usr/bin/env bash
# bin/release <build-dir>
cat <<EOF
config_vars:
PATH: /app:$PATH
default_process_types:
web: /app/awk-start app.awk
EOF
Проверяем работу скриптов локально, затем заливаем всё на github, запоминаем адрес https://github.com/hashmap/gawk-buildpack
Вы понимаете, как заставить все работать?
Теперь напишем приложение.
Создайте папку gawktest, в ней файл app.awk # A Web Server in Awk
# a simple, single user, web server built with gawk.
# based on code form http://awk.info/Эtools/server by Michael Sanders
BEGIN {
host = "/inet/tcp/" PORT "/0/0" # host string
status = 200 # 200 == OK
reason = "OK" # server response
RS = ORS = "\r\n" # header line terminators
doc = Setup() # html document
len = length(doc) + length(ORS) # length of document
print "Staring AWK server"
while (1) {
print "HTTP/1.0", status, reason |& host
print "Connection: Close" |& host
print "Pragma: no-cache" |& host
print "Content-length:", len |& host
print ORS doc |& host
close(host) # close client connection
host |& getline # wait for new client request
}
}
function Setup() {
tmp = "<html>\
<head><title>Simple gawk server</title></head>\
<body>\
Hello from awk!\
</body>\
</html>"
return tmp
}
Проверка работы приложения локально: gawk -v PORT=8080 -f app.awk
Теперь можем отправлять в Bluemix, делаем стандартный cf push, но еще указываем адрес нашего билдпака: gawktest cf push gawktest -b https://github.com/hashmap/gawk-buildpack
Updating app gawktest in org [email protected] / space dev as [email protected].
OK
Uploading gawktest.
Uploading app files from: /Users/alex/projects/gawktest
Uploading 32.3K, 3 files
Done uploading
OK
Stopping app gawktest in org [email protected] / space dev as [email protected].
OK
Starting app gawktest in org [email protected] / space dev as [email protected].
-----> Downloaded app package (8.0K)
-----> Downloaded app buildpack cache (11M)
Cloning into '/tmp/buildpacks/gawk-buildpack'.
Using cached gawk GNU Awk 4.1.3, API: 1.1 Copyright (C) 1989, 1991-2015 Free Software Foundation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ .
-----> Uploading droplet (724K)
1 of 1 instances running
App started
OK
App gawktest was started using this command `/app/awk-start app.awk`
Showing health and status for app gawktest in org [email protected] / space dev as [email protected].
OK
requested state: started
instances: 1/1
usage: 64M x 1 instances
urls: gawktest.mybluemix.net
last uploaded: Wed Jul 15 12:21:13 UTC 2015
stack: lucid64
buildpack: https://github.com/hashmap/gawk-buildpack
state since cpu memory disk details
#0 running 2015-07-15 03:22:08 PM 0.0% 1.1M of 64M 1.9M of 1G
Конечные титры
Все работает и доступный А пока хотя бы не забывай, что сервер однопользовательский.Т.
к.
это не первый запуск, то уже собранный гавк был просто скопирован из кэша.
При первом запуске нового приложения вы сможете увидеть, как оно скачивается, распаковывается и собирается.
Также в целях отладки распечатываются версия gawk и ее лицензия.
Если кто-нибудь напишет веб-фреймворк на Brainfuck, дайте мне знать.
Теги: #cloudfoundry #bluemix #buildpack #awk #разработка веб-сайтов
-
Трейлер К Запуску Metal War Online
19 Oct, 24