После долгого и тяжелого месяца пробовать разные вещи и каждый раз меня кусали, я понял,
только потому, что Heroku использует репозиторий git в качестве механизма развертывания, вы не должны рассматривать его как репозиторий git
это могло быть и rsync, они пошли на git, не отвлекайтесь из-за этого
если вы сделаете это, вы откроете себя для всех видов боли. Все вышеупомянутые решения где-то с треском проваливаются:
- он требует, чтобы что-то делалось каждый раз или периодически, или происходили неожиданные вещи (подталкивание подмодулей, синхронизация поддеревьев, ...)
- если вы используете движок, например, для модулирования своего кода, Bundler съест вас заживо, невозможно описать количество разочарования, которое я испытал по поводу этого проекта во время поисков хорошего решения для этого
- вы пытаетесь добавить движок как git repo link +
bundle deploy
- сбой, вам нужно каждый раз связывать обновление
- вы пытаетесь добавить движок как
:path
+ bundle deploy
- неудачно, команда разработчиков рассматривает :path
вариант как «вы не используете Bundler с этим параметром драгоценного камня», поэтому он не будет комплектоваться для производства
- кроме того, каждое обновление движка хочет обновить ваш стек рельсов -_-
- единственное решение, которое я нашел, - использовать движок в качестве
/vendor
символической ссылки при разработке и фактически копировать файлы для производства
Решение
Рассматриваемое приложение имеет 4 проекта в git root:
- api - в зависимости от профиля будет работать на 2 разных хостах heroku - upload и api
- web - сайт
- web-old - старый веб-сайт, все еще в процессе миграции
- common - общие компоненты, извлеченные в двигателе
У всех проектов есть vendor/common
символическая ссылка, указывающая на корень common
движка. При компиляции исходного кода для развертывания в heroku нам нужно удалить символическую ссылку и rsync, чтобы его код физически находился в папке vendor каждого отдельного хоста.
- принимает список имен хостов в качестве аргументов
- запускает git push в вашем репозитории разработки, а затем запускает чистый git pull в отдельной папке, гарантируя, что никакие грязные (незавершенные) изменения не будут автоматически отправлены на хосты
- развертывает хосты параллельно - каждый репозиторий heroku git вытягивается, новый код синхронизируется в нужные места, фиксируется с базовой информацией о push в комментарии git commit,
- в конце мы отправляем ping с curl, чтобы сообщить ведущим, чтобы они проснулись и проследили журналы, чтобы увидеть, все ли прошло
- хорошо играет и с Дженкинсом: D (автоматическая отправка кода на тестовые серверы после успешных тестов)
Работает очень-очень красиво в условиях дикой природы с минимальными (нет?) Проблемами уже 6 месяцев
Вот сценарий https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f
Обновление 1
@AdamBuczynski, никогда не бывает так просто.
1-й, у вас всегда будет как минимум производственная и тестовая среда - и, в худшем случае, куча специфичных для функций кластеров - внезапно 1 папка должна быть сопоставлена с n проектами heroku в качестве довольно простого требования, и все это нужно как-то организовать так, чтобы сценарий «знает», какой источник вы хотите развернуть,
sync_common
Во-вторых, вы захотите поделиться кодом между проектами - теперь наступает часть, махинации с символическими ссылками в разработке заменяются реальным rsynced кодом на Heroku, потому что Heroku требует определенной структуры папок и бандлера, а rubygems действительно действительно очень сильно делают вещи уродливыми, если вы хочу извлечь общие нити в драгоценный камень
В-третьих, вы захотите подключить CI, и это немного изменит то, как должны быть организованы подпапки и репозиторий git, в конце концов, в самом простом варианте использования вы получите вышеупомянутую суть.
В других проектах мне нужно подключать сборки Java, при продаже программного обеспечения нескольким клиентам вам нужно будет фильтровать модули, которые устанавливаются, в зависимости от требований к установке и еще много чего,
Мне действительно стоит подумать о том, чтобы объединить вещи в Rakefile или что-то в этом роде и сделать все таким образом ...