Uzun ve zor bir aydan sonra farklı şeyler denedikten ve her fark ettiğimde ısırıldıktan sonra,
Heroku, bir dağıtım mekanizması olarak bir git deposu kullandığından, onu bir git deposu olarak değerlendirmemelisiniz
rsync de olabilirdi, git için gittiler, bu yüzden dikkatiniz dağılmasın
eğer bunu yaparsanız, kendinizi her türlü incitmeye açarsınız. Yukarıda belirtilen çözümlerin tümü bir yerlerde sefil bir şekilde başarısız oluyor:
- her seferinde veya periyodik olarak veya beklenmedik şeyler olduğunda bir şeyin yapılmasını gerektirir (alt modülleri itmek, alt ağaçları senkronize etmek, ...)
- Örneğin, kodunuzu modüler hale getirmek için bir motor kullanırsanız, Bundler sizi canlı canlı yer, bunun için iyi bir çözüm bulma arayışı sırasında o projeyle yaşadığım hayal kırıklığının miktarını açıklamak imkansızdır.
- motoru git repo bağlantısı olarak eklemeye çalışıyorsunuz +
bundle deploy
- başarısız, her seferinde güncellemeyi paketlemeniz gerekiyor
- motoru
:path
+ bundle deploy
- fail olarak eklemeye çalışırsanız , geliştirme ekibi :path
seçeneği "bu mücevher seçeneğiyle Bundler'ı kullanmıyorsunuz" olarak değerlendirir , bu nedenle üretim için paketlenmez
- ayrıca, motorun her yenilemesi ray yığınınızı güncellemek ister -_-
- Bulduğum tek çözüm, motoru
/vendor
geliştirmede bir sembolik bağlantı olarak kullanmak ve aslında dosyaları üretim için kopyalamak.
Çözüm
Söz konusu uygulamanın git kökünde 4 projesi var:
- api - profile bağlı olarak 2 farklı heroku sunucusunda çalışır - yükleme ve api
- web - web sitesi
- web-old - eski web sitesi, hala göç ediyor
- ortak - bir motorda çıkarılan ortak bileşenler
Tüm projelerde motorun vendor/common
köküne bakan bir sembolik bağ vardır common
. Heroku'ya dağıtım için kaynak kodunu derlerken, sembolik bağlantıyı kaldırmamız ve kodunu fiziksel olarak her ayrı ana bilgisayarın satıcı klasöründe olacak şekilde yeniden senkronize etmemiz gerekir.
- ana bilgisayar adlarının bir listesini bağımsız değişken olarak kabul eder
- geliştirme deponuzda bir git push çalıştırır ve ardından ayrı bir klasörde temiz bir git pull çalıştırır, böylece hiçbir kirli (beklenmeyen) değişikliklerin ana bilgisayarlara otomatik olarak gönderilmemesini sağlar
- ana bilgisayarları paralel olarak dağıtır - her heroku git repo çekilir, yeni kod doğru yerlere yeniden senkronize edilir, git commit yorumundaki temel push bilgileriyle birleştirilir,
- sonunda, hobi sahiplerine uyanmalarını ve her şeyin şarap olup olmadığını görmek için günlükleri takip etmelerini söylemek için curl ile bir ping gönderiyoruz
- jenkins ile de iyi oynuyor: D (başarılı testlerden sonra sunucuları test etmek için otomatik kod itme)
En az (hayır?) Sorunla vahşi doğada çok çok güzel çalışıyor 6 aydır
İşte komut dosyası https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f
Güncelleme 1
@AdamBuczynski, asla bu kadar basit değildir.
Birincisi, her zaman en azından bir üretim ve test ortamına sahip olacaksınız - ve daha kötüsü bir grup işleve özel kümeye sahip olacaksınız - aniden 1 klasörün n heroku projesine eşlenmesi gerekiyor ve oldukça temel bir gereksinim ve her şeyin bir şekilde organize edilmesi gerekiyor. komut dosyası, hangi kaynağı nereye dağıtmak istediğinizi "bilir",
sync_common
İkincisi, projeler arasında kod paylaşmak isteyeceksiniz - şimdi bölüm geliyor, geliştirmede sembolik bağlara sahip shennaniganların yerini Heroku'da gerçek eşzamanlı kod alıyor çünkü Heroku belirli bir klasör yapısı ve paketleyici ve rubygemler gerçekten gerçekten işleri çirkin hale getiriyorsa ortak konuları bir mücevherin içine çıkarmak istiyorum
Üçüncüsü, CI'yi takmak isteyeceksiniz ve bu, alt klasörlerin ve git repo'nun nasıl organize edilmesi gerektiğini biraz değiştirecek, sonunda, yukarıda bahsedilen özü elde edeceğiniz en basit olası kullanım durumunda.
Diğer projelerde Java sürümlerini eklemem gerekiyor, yazılımı birden fazla istemciye satarken, kurulum gereksinimlerine ve ne olmadığına bağlı olarak yüklenen modülleri filtrelemeniz gerekecek,
Bir şeyleri Rakefile veya başka bir şeye toplamayı gerçekten düşünmeliyim ve her şeyi bu şekilde yapmalıyım ...