Setelah sebulan yang panjang dan berat mencoba berbagai hal dan digigit setiap kali saya menyadari,
hanya karena Heroku menggunakan repositori git sebagai mekanisme penerapan, Anda tidak boleh memperlakukannya sebagai repositori git
bisa juga rsync, mereka menggunakan git, jangan sampai teralihkan karena ini
jika Anda melakukannya, Anda membuka diri terhadap semua jenis luka. Semua solusi yang disebutkan di atas gagal total di suatu tempat:
- itu membutuhkan sesuatu untuk dilakukan setiap waktu, atau secara berkala, atau hal-hal tak terduga terjadi (mendorong submodul, menyinkronkan subpohon, ...)
- jika Anda menggunakan mesin misalnya untuk memodularisasi kode Anda, Bundler akan memakan Anda hidup-hidup, tidak mungkin untuk menggambarkan jumlah frustrasi yang saya alami dengan proyek itu selama pencarian untuk menemukan solusi yang baik untuk ini
- Anda mencoba menambahkan mesin sebagai tautan git repo +
bundle deploy
- gagal, Anda perlu memaketkan pembaruan setiap saat
- Anda mencoba menambahkan mesin sebagai
:path
+ bundle deploy
- gagal, tim pengembang menganggap :path
opsi sebagai "Anda tidak menggunakan Bundler dengan opsi permata ini" sehingga tidak akan digabungkan untuk produksi
- juga, setiap penyegaran mesin ingin memperbarui tumpukan rel Anda -_-
- satu-satunya solusi yang saya temukan adalah menggunakan engine sebagai
/vendor
symlink dalam pengembangan, dan sebenarnya menyalin file untuk produksi
Solusinya
Aplikasi yang dimaksud memiliki 4 proyek di git root:
- api - tergantung pada profilnya akan berjalan di 2 host heroku yang berbeda - unggah dan api
- web - situs web
- web-lama - situs web lama, masih dalam migrasi
- Common - komponen umum yang diekstraksi dalam mesin
Semua proyek memiliki vendor/common
symlink yang melihat ke root common
mesin. Saat menyusun kode sumber untuk diterapkan ke heroku, kita perlu menghapus symlink dan rsync kode itu secara fisik berada di folder vendor dari setiap host terpisah.
- menerima daftar nama host sebagai argumen
- menjalankan git push di repo pengembangan Anda dan kemudian menjalankan git pull bersih di folder terpisah, memastikan tidak ada perubahan kotor (tidak terikat) yang didorong ke host secara otomatis
- menyebarkan host secara paralel - setiap heroku git repo ditarik, kode baru disinkronkan ke tempat yang tepat, berkomitmen dengan informasi push dasar di komentar git commit,
- pada akhirnya, kami mengirim ping dengan curl untuk memberi tahu host hobi untuk bangun dan membuntuti log untuk melihat apakah semua anggur habis.
- bermain bagus dengan jenkins juga: D (dorongan kode otomatis untuk menguji server setelah tes berhasil)
Bekerja sangat sangat baik di alam liar dengan masalah minimal (bukan?) 6 bulan sekarang
Berikut skripnya https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f
Perbarui 1
@AdamBuczynski, ini tidak pernah sesederhana itu.
Pertama, Anda akan selalu memiliki produksi dan lingkungan pengujian setidaknya - dan sekumpulan cluster khusus fungsi yang lebih buruk - tiba-tiba 1 folder perlu dipetakan ke proyek heroku sebagai persyaratan yang cukup mendasar dan semuanya perlu diatur sedemikian rupa sehingga skrip "tahu" sumber apa yang ingin Anda terapkan di mana,
Kedua, Anda akan ingin berbagi kode antar proyek - sekarang sync_common
bagiannya, shennanigans dengan symlink dalam pengembangan diganti dengan kode rsynced yang sebenarnya di Heroku karena Heroku memerlukan struktur folder tertentu dan bundler dan rubygems benar-benar benar-benar membuat segalanya menjadi jelek sangat buruk jika Anda ingin mengekstrak benang merah menjadi permata
Ketiga Anda akan ingin memasang CI dan itu akan mengubah sedikit bagaimana subfolder dan repo git perlu diatur, pada akhirnya dalam kasus penggunaan yang paling sederhana Anda berakhir dengan inti yang disebutkan di atas.
Dalam proyek lain saya perlu memasang Java build, ketika menjual perangkat lunak ke banyak klien Anda perlu memfilter modul yang diinstal tergantung pada persyaratan instalasi dan yang lainnya,
Saya harus benar-benar mempertimbangkan untuk menjelajahi menggabungkan hal-hal menjadi Rakefile atau sesuatu dan melakukan semuanya dengan cara itu ...