Рубрики
Без рубрики

Как запустить Python и Ruby на Heroku с несколькими пакетами сборки

Цель этой статьи-попытаться показать, как я справился с запросом подопечного, и рассказать вам о том, как запускать несколько пакетов сборки на Heroku.

Автор оригинала: Inanc Gumus.

Один из моих подопечных здесь, в codementor.io возникла проблема при запуске Python и Ruby вместе на Героку . Эта сессия вдохновила меня на написание этого учебника—как запустить более одной среды на Heroku.

ПРОБЛЕМА

Проект работал в Cloud 9 без каких-либо проблем. Однако после развертывания в Heroku в журнале отображались сообщения об ошибках, связанных с проблемами Python. Стив написал скребок на Python, и он не работал. Стив, мой подопечный, создал старую тестовую среду в облаке 9, чтобы я работал над его проблемой.

РЕШЕНИЕ

Это решение использует это руководство от Heroku.

Я решил эту проблему, используя Heroku multi-buildpacks для Python и Ruby.

Heroku multi-buildpack

Пакеты сборки отвечают за настройку вашего приложения. Heroku объясняет пакеты сборки в своей документации следующим образом: “Пакеты сборки состоят из набора сценариев, и в зависимости от языка программирования сценарии будут извлекать зависимости, выводить сгенерированные ресурсы или скомпилированный код и многое другое. Этот вывод собирается в slug компилятором slug.”

Есть много пакетов сборки (многие из них можно увидеть здесь и здесь ). Существуют различные пакеты сборки для Ruby и Python .

Итак, если кто-то хочет развернуть Ruby и Python вместе на Heroku, ему нужно использовать “несколько пакетов сборки” . Таким образом, Heroku будет использовать различные пакеты сборки для запуска вашего приложения. Каждый пакет сборки создает отдельную среду.

Запуск приложений с профилем

Приложение Стива должно работать на сервере Puma ( веб-сервер по умолчанию Ruby on Rails ). Итак, мне нужно было создать Профиль . Профиль автоматически выполняет команды после развертывания. Профили отвечают за запуск шелл-кода на Heroku после развертывания. Например, вы можете запустить веб-серверы и длительные задачи. Подробнее см. здесь .

Итак, я создал файл профиля, подобный этому, в корне его проекта:

# Procfile
web: bundle exec rails server -p $PORT
worker: python scraper.py

В нескольких пакетах сборки порядок пакетов сборки имеет решающее значение.

Мне нужно было добавить Ruby buildpack в качестве последнего, потому что Стив будет запускать веб-сервер Puma для Ruby. Если бы я этого не сделал, Стив не смог бы запустить свой рубиновый сервер на Heroku. Итак, я сначала добавил Python buildpack, а затем добавил Ruby buildpack позже. Вместе они становятся “могучим множественным пакетом сборки”, готовым к использованию на Heroku.

# command line commands
heroku buildpacks:clear  # remove all of the buildpacks first
heroku buildpacks:add heroku/python  # add the python buildpack first
heroku buildpacks:add heroku/ruby    # add the ruby buildpack second

heroku buildpacks  # to see what I have done
# === golden-ratio-1618 Buildpack
# 1. heroku/python
# 2. heroku/ruby

Внутренние части пакета сборки

Чтобы узнать больше о внутренних компонентах пакета сборки, вы можете просмотреть исходный код пакета сборки на Github, например, файл Ruby . bin/detect . Вы можете просмотреть исходный код этого файла, чтобы узнать, что необходимо Heroku для развертывания вашего приложения. Например, для Ruby вам нужно создать Gemfile в корневом каталоге вашего приложения, иначе он выйдет из строя.

Необходимые пакеты отсутствовали

Однако после добавления всех пакетов сборки проект еще не функционировал на Heroku. Это было из-за Python requirements.txt файл. Файл отвечает за добавление необходимых пакетов Python в ваше приложение, которые будут автоматически устанавливаться на Heroku после каждого развертывания ( like Gemfile в Ruby ). Каждый раз при развертывании Heroku запускает новый экземпляр и инициализирует его, запустив эти файлы. Они являются необходимыми файлами для сред, таких как Python и Ruby.

Мне также нужно было проверить поведение в локальном, поэтому я запустил pip install-r requirements.txt в качестве команды для установки необходимых пакетов на локальный сервер.

Кроме того, я протестировал настройку с помощью команды: heroku local . Подробнее об этом здесь .

Я поместил необходимые пакеты, посмотрев на код заголовка скребков Python. Одним из них был lxml . Я нашел его номер последней версии, посмотрев на его страницу github ( к тегам ).

Итак, мы создали requirements.txt файл, подобный этому:

# requirements.txt file
lxml==3.6.4

Итак, после проведения тренировки Стив ответил так::

Реакция Стива после того, как я решил эту проблему

Вывод

В этой статье моя цель состояла в том, чтобы показать, как я справился с запросом подопечного, и рассказать вам о том, как запускать несколько пакетов сборки на Heroku. Конечно, есть много деталей, которые я пропустил. Возможно, это могут быть темы следующей статьи. Аналогичным образом, вы также можете прочитать дополнительные руководства по Heroku, например: как анализировать панель мониторинга Heroku или как получать push-уведомления при развертывании приложения Heroku . Увидимся в следующий раз.