Стратегии развертывания Heroku + Github
Я работаю над веб-приложением, размещая исходный код на Github и запуская приложение на Heroku. Все работает нормально, но я по делу не могу обернуть голову. Перед развертыванием моего кода я запускаю некоторые скрипты для оптимизации кода (минирование, объединение файлов и т.д.). Приложение heroku использует только оптимизированную версию приложения.
В принципе, у меня есть две папки: dev
и production
. dev
содержит исходный код, который я пишу, production
создается моими скриптами сборки (я использую grunt и requirejs). В настоящее время обе папки находятся в моем репозитории Git, и оба они переносятся в Github и Heroku. Мне бы хотелось только иметь dev
в Github и только production
на Heroku.
Я прочитал несколько статей о том, как настроить разные ветки для Heroku, как описанные в этом блоге. Могу ли я настроить производственную ветвь и иметь только папку production
, сохраняя при этом папку dev
в моей главной ветке? Или мне нужны отдельные репозитории?
Кто-нибудь пробовал что-то подобное? Я бы предположил, что это не что-то необычное.
Ответы
Ответ 1
Вы можете просто рассмотреть использование файла heroku .slugignore
(ref https://devcenter.heroku.com/articles/slug-compiler).
Этот файл позволит вам удалить папку dev
из пакета, который heroku разворачивает на каждый экземпляр сервера, а также позволяет сохранить весь ваш код в том же репозитории.
В корне проблемы рассматривается стратегия развертывания как та, где вы загружаете финальные биты на ваш сервер, где бит - это артефакт построения вашего репозитория. В таких случаях сборки обычно хранятся и архивируются отдельно от источника.
Модель Heroku немного отличается от нее тем, что предполагает, что ваш репозиторий - это артефакт для развертывания. Разница небольшая, но в вашем случае это просто означает, что вам нужно зафиксировать в вашем репозитории биты, которые вы хотите использовать герою.
Еще один способ подумать о том, что вы можете обойтись без вашей папки production
, и в рамках запуска вашего сервера будет запущен script для создания файлов папок production
. Это позволит вам удалить папку production
и сохранить ваш репозиторий за счет запуска этого процесса при каждом запуске вашего сервера. Это может оказаться непомерно дорогостоящим и нежелательным (существуют ограничения на то, как долго Heroku будет ждать запуска сервера, прежде чем он откажется от него), но, надеюсь, помогает в обеспечении некоторой ясности вокруг отношений Heroku и git.
Ответ 2
Эта ситуация немного необычна. Но вот несколько идей:
- Я использую процесс, похожий на тот, который вы указали в статье.
- Я бы создал только одно приложение, как ваше высказывание. Я бы создал его, создав новый репозиторий git в вашей папке
dev
.
- Затем я рекомендую стратегию развертывания, аналогичную описанной в этом ответе: fooobar.com/questions/168947/.... Я адаптировал его ниже:
Создайте файл rake
с двумя задачами в нем: rake deploy:production
и rake deploy:postprocess_files
. Эти задачи могут выглядеть примерно так:
namespace :deploy do
task :production do
puts "turn on 'maintenance page' on heroku"
system "heroku maintenance:on"
puts "deploying to production"
system "git push heroku-prod master"
puts "post processing files..."
system "heroku run rake production:postprocess_files"
puts "take off maintenance page"
system "heroku maintenance:off"
puts "done"
end
task :postprocess_files do
puts "run postprocessing of files on heroku"
... add commands here to post process the files.
end
end
Затем разверните его с использованием rake deploy:production
, а не нажав непосредственно с помощью git. Затем файл рейка:
- установите страницу обслуживания,
- нажмите на производство,
- выполните вашу пост-обработку файлов,
- снимите страницу обслуживания.
Обратите внимание, что вторая задача рейка в вашем файле содержит команды для последующей обработки в ваших файлах и вызывается для запуска на heroku первой задачей рейка.
В качестве альтернативы, возможно, вы сможете расширять активы: предварительно скомпилировать задачу, которую Heroku выполняет как часть каждого развертывания. Это, в сущности, то, что вы делаете в любом случае - подготовка активов для развертывания в производство.
Ответ 3
Это немного запутанно, потому что:
-
ваши dev
и production
представляют среды и являются каталогами с сгенерированным контентом:
Они не должны быть в VCS, но автоматически создаются с помощью script, который распознает среду, в которой он запущен, и создайте соответствующий каталог соответствующим образом.
-
dev
и production
, упомянутые в статье, вы ссылаетесь на " Развертывание нескольких сред на Heroku (при размещении кода на Github )" представляют этапы продвижения и являются ветвями.
Использование ветвей является хорошим, только для выделения вариаций кода (в указанных ветвях), а не для хранения сгенерированного кода.
Ваша конкретная проблема управления выпуском (т.е. Создание правильной доставки) должна управляться с помощью script (который может контролироваться версиями вместе с вашим кодом) и использовать в качестве крючка, например, для создания и развертывания правильного набора кодов в нужном месте.
Ответ 4
Мне лично нравится это решение: https://github.com/mbuchetics/heroku-buildpack-nodejs-grunt
И взгляните на это тоже: https://medium.com/the-javascript-collection/how-to-deploy-a-grunt-project-on-heroku-c227cb1ddc56
Это честно один из самых чистых способов.