Создание Пакета Сборки Cloudfoundry/Ibm Bluemix Или Веб-Сервиса На Awk (Gawk)

gawk — смотреть с открытым ртом, вытаращить глаза

Создание пакета сборки CloudFoundry/IBM Bluemix или веб-сервиса на Awk (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 #разработка веб-сайтов

Вместе с данным постом часто просматривают: