Apa strategi penyebaran php pilihan Anda? [Tutup]

161

Saya memulai proyek baru di PHP dan saya ingin mendapatkan umpan balik dari pengembang lain tentang strategi pilihan mereka untuk penerapan PHP. Saya ingin mengotomatiskan hal-hal sedikit sehingga setelah perubahan dilakukan, mereka dapat dengan cepat dimigrasikan ke server pengembangan atau produksi.

Saya memiliki pengalaman dengan penggunaan menggunakan Capistrano dengan Ruby serta beberapa skrip shell dasar.

Sebelum saya menyelam sendiri, akan lebih baik untuk mendengar bagaimana orang lain mendekati ini dalam proyek mereka.

Informasi lebih lanjut

Saat ini pengembang bekerja pada instalasi lokal situs dan melakukan perubahan pada repositori subversi. Penerapan awal dilakukan dengan mengekspor rilis yang ditandai dari svn dan mengunggahnya ke server.

Perubahan tambahan biasanya dilakukan sedikit demi sedikit dengan mengunggah file yang diubah secara manual.

GloryFish
sumber
Lucu :) Terima kasih untuk edit splattne.
GloryFish
1
@ Paul Tomblin: OMG Saya tidak bisa berhenti tertawa !!!!! Tidak ada cara yang lebih baik :)
Andrei Rînea
Dapatkah seseorang menjawab ini tolong - stackoverflow.com/questions/36034277/…
Sandeepan Nath

Jawaban:

109

Untuk PHP, SVN dengan skrip build Phing adalah caranya. Phing mirip dengan ANT tetapi ditulis dalam PHP, yang membuatnya lebih mudah bagi pengembang PHP untuk memodifikasi untuk kebutuhan mereka.

Rutin penyebaran kami adalah sebagai berikut:

  • Semua orang berkembang di server lokal yang sama di tempat kerja, setiap pengembang juga memiliki checkout di mesinnya di rumah.
  • Komit memicu kait pasca-komitmen yang memperbarui server pementasan.
  • Tes dijalankan pada staging server, jika lulus - lanjutkan.
  • Script phing build dijalankan:
  • Menghentikan server produksi, mengalihkan domain ke halaman "Sedang dibangun"
  • Menjalankan pembaruan SVN pada checkout produksi
  • Menjalankan skrip delta skema
  • Menjalankan tes
  • Jika tes gagal - jalankan skrip rollback
  • Jika tes lulus, server mengarahkan kembali ke checkout produksi

Ada juga phpUnderControl , yang merupakan server Integrasi Berkelanjutan. Saya tidak merasa sangat berguna untuk proyek web untuk jujur.

Eran Galperin
sumber
Saya hendak memposting daftar apa yang saya lakukan di toko Windows / .NET saya, tetapi ini kurang lebih seperti yang Anda dapatkan di sini. +1
Daniel Schaffer
Pernahkah Anda mengalami kerugian karena memiliki co svn sebagai lingkungan produksi? Saya benar-benar tidak dapat memikirkan kerugian tetapi tampaknya tidak "bersih" untuk memiliki co svn sebagai produksi? Mengapa bukan svn export atau rsync?
ChrisR
Karena perbedaan mendasar antara co dan ekspor - Anda tidak dapat mendorong perubahan spesifik, Anda harus mengekspor lagi seluruh aplikasi. Ini adalah perbedaan yang sangat penting yang membuat hidup jauh lebih mudah
Eran Galperin
36
Mengapa memasang situs di bawah layar? Jika Anda menjalankan direktori rilis /, dan arahkan liveSite / melalui symlink ke folder Anda di rilis /, maka Anda dapat sepenuhnya checkout situs ke rilis / folder baru dan membalikkan symlink lebih dari seketika setelah co selesai? Tidak perlu downtime (kecuali Anda adalah isak miskin yang membuat permintaan selama sakelar symlink).
Joseph Lust
2
Siapa yang bertanggung jawab untuk melakukan semua tugas seperti memperbarui SVN pada produksi dan symlink dalam rilis baru? Apakah itu phing? Apakah itu jenkins?
Daniel Ribeiro
24

Saat ini saya sedang menggunakan PHP menggunakan Git . Hanya produksi git push yang diperlukan untuk memperbarui server produksi saya dengan salinan terbaru dari Git. Sangat mudah dan cepat karena Git cukup pintar untuk hanya mengirim diff dan bukan keseluruhan proyek lagi. Ini juga membantu menyimpan salinan repositori yang berlebihan pada server web jika terjadi kegagalan perangkat keras pada saya (meskipun saya juga mendorong agar GitHub aman).

Kyle Cronin
sumber
Saya telah melakukan hal yang sama selama bertahun-tahun pada proyek-proyek kecil hingga menengah. Saya harus mengatakan, ini bekerja dengan baik untuk saya. Anda harus menyukai kesederhanaan dari pendekatan ini.
Chris Allen Lane
3
Bagaimana Anda menangani database dengan pendekatan ini?
32423hjh32423
1
@neilc Dengan tangan, sayangnya. Setiap perubahan pada DB harus dilakukan secara manual sebelum ditekan.
Kyle Cronin
Saya biasanya menyertakan () file PHP yang berisi konfigurasi DB, dan secara manual menempatkan file di server atau mesin uji. Dengan begitu Anda tidak menyimpan kata sandi di git dan juga tidak secara tidak sengaja beroperasi pada basis data produksi.
Matt
Bagaimana Anda mengonfigurasi git untuk melakukan ini untuk Anda? Apakah ada panduan / tutorial? Terima kasih sebelumnya.
Miguel Stevens
14

Kami menggunakan Webistrano , antarmuka web untuk Capistrano, dan sangat senang dengannya.

Webistrano memungkinkan penyebaran multi-tahap, multi-lingkungan dari SVN, GIT dan lainnya. Ini memiliki dukungan rollback bawaan, dukungan untuk peran server terpisah seperti web, db, aplikasi, dll., Dan disebarkan secara paralel. Ini memungkinkan Anda untuk mengesampingkan parameter konfigurasi pada berbagai tingkatan, seperti per tahap, dan mencatat hasil setiap penyebaran, secara opsional mengirimkannya.

Meskipun Capistrano dan Webistrano adalah aplikasi Ruby, sintaksis dari 'resep' penyebaran mudah dan cukup kuat untuk dipahami oleh setiap programmer PHP. Awalnya Capistrano dibangun untuk proyek-proyek Ruby on Rails, tetapi dengan mudah mengakomodasi proyek-proyek PHP.

Setelah dikonfigurasi itu bahkan cukup mudah untuk digunakan oleh non-programmer, seperti penguji menggunakan versi pementasan.

Untuk menyediakan kemungkinan penyebaran tercepat, kami menginstal metode fast_remote_cache , yang memperbarui cache copy pekerjaan svn pada server jarak jauh, dan kemudian menghubungkan hasil.

Martijn Heemels
sumber
7

Saya menggunakan Apache Ant untuk digunakan ke target yang berbeda (dev, QA dan live). Ant dirancang untuk bekerja untuk penyebaran Java, tetapi memberikan solusi kasus umum yang cukup berguna untuk menyebarkan file sewenang-wenang.

Sintaks file build.xml cukup mudah dipelajari - Anda menentukan target berbeda dan dependensinya yang dijalankan saat Anda memanggil program semut di baris perintah.

Sebagai contoh, saya memiliki target untuk dev, QA dan live, yang masing-masing tergantung pada target cvsbuild yang memeriksa revisi head terbaru dari server CVS kami, menyalin file yang sesuai ke direktori build (menggunakan tag fileset), dan kemudian rsyncs direktori build ke server yang sesuai. Ada beberapa kebiasaan untuk dipelajari, dan kurva belajarnya tidak sepenuhnya rata, tetapi saya telah melakukannya dengan cara ini selama bertahun-tahun tanpa kesulitan jadi saya akan merekomendasikannya untuk situasi Anda, meskipun saya ingin tahu apa jawaban lain yang saya Akan lihat di utas ini.

notneilcasey
sumber
6

Saya melakukan hal-hal secara manual menggunakan Git. Satu repositori untuk pengembangan, yang akan dikirim git push --mirrorke repo publik, dan server langsung adalah repo ketiga yang ditarik dari situ. Bagian ini saya kira sama dengan pengaturan Anda sendiri.

Perbedaan besar adalah bahwa saya menggunakan cabang untuk hampir setiap perubahan yang saya kerjakan (saya punya sekitar 5 sekarang), dan cenderung untuk bolak-balik di antara mereka. Cabang utama tidak bisa diubah secara langsung kecuali untuk menggabungkan cabang lainnya.

Saya menjalankan server langsung dari cabang master, dan ketika saya selesai dengan cabang lain dan siap untuk menggabungkannya, balikkan server ke cabang itu untuk sementara waktu. Jika rusak, mengembalikannya ke master membutuhkan beberapa detik. Jika berhasil, itu akan digabungkan menjadi master dan kode langsung diperbarui. Saya kira analogi ini dalam SVN akan memiliki dua copy pekerjaan dan menunjuk ke yang hidup melalui symlink.


sumber
3

Saya tahu Phing telah disebutkan beberapa kali sekarang, tapi saya sudah beruntung dengan phpUnderControl . Bagi kami, kami

  1. Lihat satu per satu cabang untuk mesin lokal
  2. Cabang diuji dan kemudian digabung menjadi Batang
  3. Komit ke Trunk secara otomatis dibangun oleh phpUnderControl, menjalankan tes dan membangun semua dokumentasi, menerapkan delta basis data
  4. Batang dijalankan melalui pengujian kualitas dan kemudian bergabung ke cabang Stabil kami
  5. Sekali lagi, phpUnderControl secara otomatis membangun Stable, menjalankan tes, dan menghasilkan database dokumentasi dan pembaruan
  6. Ketika kami siap untuk mendorong ke produksi, kami menjalankan skrip rsync yang mendukung Produksi, memperbarui database, dan kemudian mendorong file ke atas. Perintah rsync dipanggil dengan tangan sehingga kami memastikan seseorang menonton promosi.
dragonmantank
sumber
5
phpUnderControl sudah mati: |
m02ph3u5
3

alternatif untuk skrip penempatan buatan sendiri adalah dengan menggunakan platform-as-a-service yang mengabstraksi banyak hal yang cocok untuk Anda. PaaS biasanya akan menawarkan alat penyebaran kode sendiri, serta penskalaan, toleransi kesalahan (mis. Tidak turun ketika perangkat keras gagal), dan biasanya alat yang bagus untuk memantau, memeriksa log dll. Ada juga manfaat penerapan ke diketahui konfigurasi yang baik yang akan terus diperbarui dari waktu ke waktu (satu sakit kepala kurang untuk Anda).

PaaS yang saya sarankan adalah dotCloud , selain PHP ( lihat quickstart PHP mereka ) juga dapat menggunakan MySQL, MongoDB dan sejumlah layanan tambahan. Ini juga memiliki barang bagus seperti penerapan zero-downtime, rollback instan, dukungan penuh untuk SSL dan websocket, dll. Dan ada tingkatan gratis yang selalu menyenangkan :)

Tentu saja saya sedikit bias karena saya bekerja di sana! Opsi lain yang patut dicoba selain dotCloud adalah Pagodabox dan Orchestra (sekarang bagian dari Engine Yard).

Semoga ini membantu!

Salomo

Solomon Hykes
sumber
2

Bahwa Anda secara otomatis dan buta mengambil perubahan dari repositori ke server produksi terdengar berbahaya. Bagaimana jika kode yang Anda komit mengandung bug regresi, sehingga aplikasi produksi Anda menjadi glitchy?

Tetapi, jika Anda menginginkan sistem Integrasi Berkelanjutan untuk PHP, saya kira Phing adalah pilihan terbaik untuk PHP. Saya belum mengujinya sendiri, karena saya melakukan hal-hal dengan cara manual misalnya scp.

Henrik Paul
sumber
2

Saya jauh terlambat ke pesta, tetapi saya pikir saya akan membagikan metode kami. Kami menggunakan Phing dengan Phingistrano , yang menyediakan fungsionalitas seperti Capistrano untuk Phing melalui file build yang dibangun sebelumnya. Ini sangat keren, tetapi hanya berfungsi jika Anda menggunakan Git saat ini.

Clint
sumber
1

Saya memiliki salinan kantor cabang rilis SVN di server. Memperbarui situs (ketika tidak ada perubahan skema) semudah mengeluarkan perintah pembaruan SVN. Saya bahkan tidak perlu membuat situs offline.


sumber
1
jadi Anda memiliki direktori .svn yang tersebar di seluruh situs? otak murni saya menentang ini :)
Stann
Ini hanya menangani kode sumber. Penyebaran sering membutuhkan tindakan lain yang diambil - perubahan basis data diterapkan, cache dibersihkan, dll.
Leonid Mamchenkov
1

Phing mungkin merupakan taruhan terbaik Anda, jika Anda tahan terhadap file konfigurasi xml. Kerangka kerja Symfony memiliki port rake (pake) sendiri, yang bekerja cukup baik, tetapi agak erat digabungkan dengan bagian lain dari Symfony (Meskipun Anda mungkin bisa memisahkannya).

Pilihan lain adalah menggunakan Capistrano. Jelas itu tidak berintegrasi juga dengan PHP, seperti halnya dengan Ruby, tetapi Anda masih dapat menggunakannya untuk banyak hal.

Terakhir, Anda selalu dapat menulis skrip shell. Sejauh ini, itulah yang telah saya lakukan.

troelskn
sumber
1

Satu tahun terlambat tetapi ... Dalam kasus saya, penyebaran tidak otomatis. Saya merasa berbahaya untuk menyebarkan kode dan menjalankan skrip migrasi basis data secara otomatis.

Sebagai gantinya, kait subversi hanya digunakan untuk menyebarkan ke server pengujian / staging. Kode digunakan untuk produksi pada akhir iterasi, setelah menjalankan tes dan memastikan semuanya akan berhasil. Untuk penyebaran itu sendiri, saya menggunakan Makefile custom-made yang menggunakan rsync untuk mentransfer file. Makefile juga dapat menjalankan skrip migrasi di server jarak jauh, menghentikan sementara / melanjutkan web dan server basis data.

Rafa
sumber
1

Pada pekerjaan saya sendiri dan tim saya telah mengembangkan pengganti berorientasi Phing untuk penyebaran capistrano dan kami juga telah memasukkan beberapa barang yang tersedia dalam phing seperti pengujian PHPUnit, phpcs dan PHPDocumentor. Kami telah membuatnya menjadi repo git yang dapat ditambahkan ke proyek sebagai submodule di git dan ia bekerja dengan sangat baik. Saya telah melampirkannya ke beberapa proyek dan cukup modular sehingga mudah untuk membuatnya bekerja dengan proyek apa pun di salah satu dari beberapa lingkungan kami (pementasan, pengujian, produksi, dll ...).

Dengan skrip build phing Anda dapat menjalankannya dari baris perintah secara manual, dan saya juga telah berhasil mengotomatiskan rutinitas build / deploy dengan Hudson dan sekarang Jenkins ci.

Saya tidak dapat memposting tautan apa pun sekarang karena repo belum terbuka untuk umum, tetapi saya telah diberitahu bahwa kami akan segera membuka sumbernya, jadi jangan ragu untuk menghubungi saya jika Anda tertarik atau jika Anda memiliki pertanyaan tentang mengotomatiskan penyebaran Anda dengan phing dan git.

Jesse Greathouse
sumber
0

Saya kira cara penyebaran SVN tidak terlalu baik. Karena:

Anda perlu membuka akses SVN untuk seluruh dunia

memiliki banyak .svn di server web produksi

Saya pikir Phing untuk menghasilkan cabang + menggabungkan semua js / css + ganti stage config + ssh upload ke semua server www adalah cara yang lebih baik.

ssh ke 10 server www dan svn up juga merupakan masalah.

Eric Fong
sumber
Membuka server svn saya ke seluruh dunia, tidak mungkin! Cukup gunakan firewall dan otentikasi Anda melebihi ssl untuk membatasi siapa yang dapat melihat kode Anda.
Shadok