Po długim i ciężkim miesiącu próbowania różnych rzeczy i bycia ugryzionym za każdym razem, gdy zdałem sobie sprawę,
tylko dlatego, że Heroku używa repozytorium git jako mechanizmu wdrażania, nie powinieneś traktować go jako repozytorium git
równie dobrze mógł to być rsync, wybrali git, nie rozpraszaj się z tego powodu
jeśli to zrobisz, otworzysz się na wszelkiego rodzaju krzywdy. Wszystkie powyższe rozwiązania gdzieś fatalnie zawodzą:
- wymaga wykonania czegoś za każdym razem lub okresowo, albo zdarzają się nieoczekiwane rzeczy (wysyłanie modułów podrzędnych, synchronizowanie poddrzew, ...)
- jeśli używasz silnika na przykład do modularyzacji kodu, Bundler pożre cię żywcem, nie da się opisać ilości frustracji, jaką miałem z tym projektem podczas poszukiwania dobrego rozwiązania tego problemu
- próbujesz dodać silnik jako link do repozytorium git +
bundle deploy
- niepowodzenie, za każdym razem musisz pakować aktualizację
- próbujesz dodać silnik jako
:path
+ bundle deploy
- niepowodzenie, zespół :path
deweloperów uważa, że opcja „nie używasz Bundlera z tą opcją klejnotu”, więc nie zostanie ona dołączona do produkcji
- ponadto każde odświeżenie silnika chce zaktualizować stos szyn -_-
- Jedynym rozwiązaniem, które znalazłem, jest użycie silnika jako
/vendor
dowiązania symbolicznego w trakcie opracowywania i skopiowanie plików do produkcji
Rozwiązanie
Ta aplikacja ma 4 projekty w git root:
- api - w zależności od profilu będzie działać na 2 różnych hostach Heroku - upload i api
- web - strona internetowa
- web-old - stara strona internetowa, wciąż w trakcie migracji
- wspólne - wspólne komponenty wyodrębnione w silniku
Wszystkie projekty mają vendor/common
dowiązanie symboliczne do katalogu głównego common
silnika. Podczas kompilowania kodu źródłowego do wdrożenia w heroku musimy usunąć dowiązanie symboliczne i rsync, aby kod znajdował się fizycznie w folderze dostawcy na każdym oddzielnym hoście.
- akceptuje listę nazw hostów jako argumenty
- uruchamia git push w twoim repozytorium programistycznym, a następnie uruchamia czysty git pull w oddzielnym folderze, upewniając się, że żadne brudne (niezatwierdzone) zmiany nie są automatycznie przesyłane do hostów
- wdraża hosty równolegle - ściągane jest każde repozytorium git heroku, nowy kod jest rsynowany we właściwe miejsca, zatwierdzany z podstawowymi informacjami push w komentarzu git commit,
- na koniec wysyłamy ping z zawinięciem, aby powiedzieć hobbystom, aby się obudzili i śledzili dzienniki, aby sprawdzić, czy wszystko poszło na wino
- też dobrze gra z jenkinsem: D (automatyczne wypychanie kodu do testowania serwerów po udanych testach)
Działa bardzo dobrze na wolności z minimalnymi (nie?) Problemami już od 6 miesięcy
Oto skrypt https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f
Zaktualizuj 1
@AdamBuczynski, to nigdy nie jest takie proste.
Po pierwsze, zawsze będziesz mieć przynajmniej środowisko produkcyjne i testowe - a kilka klastrów specyficznych dla funkcji w gorszym - nagle 1 folder musi być mapowany do n projektów heroku jako dość podstawowy wymóg i wszystko musi być jakoś zorganizowane, aby skrypt „wie”, jakie źródło chcesz wdrożyć i gdzie,
Po drugie, będziesz chciał udostępniać kod między projektami - teraz przychodzi sync_common
część, shennanigany z linkami symbolicznymi w trakcie opracowywania zostaną zastąpione przez rzeczywisty kod rsynced na Heroku, ponieważ Heroku wymaga określonej struktury folderów i bundlera, a rubygemy naprawdę naprawdę sprawiają, że rzeczy są brzydkie, jeśli ty chcą wydobyć wspólne wątki w klejnot
Po trzecie, będziesz chciał podłączyć CI i zmieni się nieco sposób, w jaki muszą być zorganizowane podfoldery i repozytorium git, w końcu w najprostszym możliwym przypadku użycia skończysz z wyżej wymienioną treścią.
W innych projektach muszę podłączać kompilacje Javy, sprzedając oprogramowanie wielu klientom będziesz musiał filtrować moduły, które są instalowane w zależności od wymagań instalacji i tak dalej,
Naprawdę powinienem rozważyć dołączenie rzeczy do pliku Rakefile lub czegoś podobnego i zrobić wszystko w ten sposób ...