Після довгого і важкого місяця пробуючи різні речі і покусаючи щоразу, коли я зрозумів,
тільки тому, що 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 - старий веб-сайт, який ще перебуває в міграції
- загальний - загальні компоненти, витягнуті в двигуні
Усі проекти мають vendor/common
симпосилання, що дивиться на корінь common
двигуна. При компілюванні вихідного коду для розгортання в heroku нам потрібно видалити симпосилання та rsync його код, щоб фізично знаходитись у папці постачальників кожного окремого хоста.
- приймає список імен хостів як аргументи
- запускає git push у вашій розробці repo, а потім запускає чистий git pull в окрему папку, переконуючись, що ніякі брудні (невмілі) зміни автоматично не надсилаються на хости
- паралельно розгортає хостів - витягується кожен heroku git repo, новий код розміщується в потрібних місцях, передається основна інформація про push у коментарі git počin,
- Врешті-решт, ми відправляємо пінг із завитком, щоб сказати господарям хобі прокинутися та загорнути колоди, щоб побачити, чи все пішло на вино
- грає добре і з jenkins: D (автоматичне натискання коду для тестування серверів після успішних тестів)
Працює дуже добре на природі з мінімальними (ні?) Проблемами 6 місяців
Ось сценарій https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f
Оновлення 1
@AdamBuczynski, це ніколи не буває просто.
По-перше, у вас завжди буде виробнича і тестова середовище як мінімум - і купа функціональних кластерів у гіршому випадку - раптом 1 папка повинна відображатись на n героїків проектів як досить основну вимогу, і все це потрібно якось організувати, щоб сценарій "знає", яке джерело ви хочете розгорнути куди,
По-друге, ви хочете поділитися кодом між проектами - тепер приходить sync_common
частина, шеннанігани з символічними посиланнями в процесі розвитку замінюються фактичним rsynced кодом на Heroku, тому що Heroku потрібна певна структура папок, а також bundler і rubygems дійсно дуже роблять речі потворними дуже погано, якщо ви хочуть витягти загальні нитки в дорогоцінний камінь
По-третє, ви захочете підключити CI, і це трохи змінить, як потрібно організувати підпапки та git repo, врешті-решт, у найпростішому можливому випадку використання ви закінчите вищезгаданий суть.
В інших проектах мені потрібно підключати Java-версії, при продажу програмного забезпечення декільком клієнтам вам потрібно буде фільтрувати модулі, які встановлюються залежно від вимог до встановлення та чого іншого,
Я дійсно повинен розглянути питання зв'язання речей у Rakefile чи щось таке, і робити все так ...