Menyiapkan siklus penerapan / bangun / CI untuk proyek PHP


200

Saya seorang pengembang tunggal sebagian besar waktu saya, mengerjakan sejumlah besar, terutama proyek berbasis PHP. Saya ingin memprofesionalkan dan mengotomatiskan bagaimana perubahan pada basis kode ditangani, dan membuat proses Integrasi Berkelanjutan yang memungkinkan transisi untuk bekerja dalam tim dimungkinkan tanpa harus membuat perubahan mendasar.

Apa yang saya lakukan saat ini adalah, saya memiliki lingkungan pengujian lokal untuk setiap proyek; Saya menggunakan SVN untuk setiap proyek; perubahan diuji secara lokal, dan kemudian ditransfer ke versi on-line, biasanya melalui FTP. Dokumentasi API dihasilkan secara manual dari kode sumber; Tes unit adalah sesuatu yang saya lakukan secara perlahan, dan itu belum menjadi bagian dari rutinitas harian saya.

"Build cycle" yang saya bayangkan akan melakukan hal berikut:

  • Changeet diperiksa ke dalam SVN setelah diuji secara lokal.

  • Saya memulai proses pembangunan. Revisi KEPALA SVN diperiksa, dimodifikasi jika perlu, dan siap untuk diunggah.

  • Dokumentasi API dihasilkan secara otomatis - jika saya belum mengaturnya secara detail, menggunakan templat default, memindai seluruh basis kode.

  • Revisi baru dikerahkan ke lokasi remote melalui FTP (Termasuk beberapa direktori penggantian nama, chmodding, mengimpor database, dan sejenisnya.) Ini adalah sesuatu yang saya sudah seperti phing untuk sangat banyak, tapi aku terbuka untuk alternatif tentu saja.

  • Tes unit yang berada di lokasi yang telah ditentukan dijalankan. Saya diberitahu tentang kegagalan atau keberhasilan mereka menggunakan E-Mail, RSS atau (lebih disukai) output HTML yang dapat saya ambil dan masukkan ke dalam halaman web.

  • (opsional) file teks "changelog" pengguna akhir di lokasi yang ditentukan akan diperbarui dengan bagian pesan komit yang telah ditentukan sebelumnya ("Sekarang mungkin untuk memfilter baik" foo "dan" bar "pada saat yang sama. waktu) Pesan ini tidak harus identik dengan pesan komit SVN, yang mungkin mengandung lebih banyak informasi internal.

  • Hal-hal seperti metrik kode, pengecekan gaya kode, dan sebagainya bukan fokus utama saya saat ini, tetapi dalam jangka panjang, mereka pasti akan melakukannya. Solusi yang membawa ini out-of-the-box sangat ramah dipandang.

Saya mencari

  • Umpan balik dan pengalaman dari orang-orang yang berada atau berada dalam situasi yang sama, dan telah berhasil menerapkan solusi untuk ini

  • Terutama, tutorial langkah demi langkah yang baik dan langkah-langkah tentang cara mengatur ini

  • Solusi yang menyediakan otomatisasi sebanyak mungkin , misalnya dengan membuat kerangka API, menguji kasus dan sebagainya untuk setiap proyek baru.

dan juga

  • Rekomendasi produk . Yang saya tahu sejauh ini adalah phing / semut untuk membangun, dan phpUnderControl atau Hudson untuk bagian pelaporan. Saya suka semuanya sejauh yang saya bisa lihat, tapi tentu saja saya tidak punya pengalaman mendetail dengan mereka.

Saya dibanjiri pekerjaan, jadi saya memiliki kecenderungan kuat terhadap solusi sederhana. Di sisi lain, jika fitur hilang, saya akan menangis karena terlalu terbatas. :) Solusi point-and-click dipersilahkan juga. Saya juga merekomendasikan produk komersial yang dapat bekerja dengan proyek PHP.

Pengaturan saya

Saya bekerja pada Windows secara lokal (7, tepatnya) dan sebagian besar proyek klien dijalankan pada LAMP stack, seringkali pada shared hosting (= tidak ada SSH jarak jauh). Saya mencari solusi yang dapat saya jalankan di lingkungan saya sendiri. Saya siap mengatur VM Linux untuk ini, tidak ada masalah. Solusi yang dihosting menarik bagi saya hanya jika mereka menyediakan semua aspek yang dijelaskan, atau cukup fleksibel untuk berinteraksi dengan bagian lain dari proses.

Bounty saya menerima jawaban yang saya rasa akan memberi saya jarak tempuh paling besar. Ada banyak masukan bagus di sini, saya berharap saya bisa menerima lebih dari satu jawaban. Terimakasih semuanya!

Jawaban:


76

Saya telah melalui buildbot , CruiseControl.net , CruiseControl dan Hudson . Walaupun saya benar-benar menyukai CruiseControl *, itu terlalu merepotkan dengan kasus ketergantungan yang sangat kompleks. buildbot tidak mudah untuk diatur, tetapi memiliki aura yang bagus (saya hanya suka python, itu saja). Tapi hudson menang atas tiga mantan karena:

  1. Mudah diatur
  2. Mudah untuk menyesuaikan
  3. Ini terlihat bagus dan mendapat fungsionalitas ikhtisar yang bagus
  4. Itu mendapat pembaruan titik-dan-klik, untuk dirinya sendiri dan semua plugin yang diinstal. Ini adalah fitur yang sangat bagus, yang saya hargai semakin banyak

Peringatan: Saya hanya pernah menggunakan linux sebagai basis untuk server build yang disebutkan di atas (CC.net berlari pada mono ), tetapi mereka semua - menurut dokumen - menjalankan cross-platform.

Menyiapkan server hudson

Prasyarat:

  • Java (1,5 akan melayani Anda dengan baik)
  • Baca akses ke server subversi (saya punya akun terpisah untuk pengguna hudson)

Dari sini, hanya saja:

java -jar hudson.war

Ini akan menjalankan contoh server kecil langsung dari konsol Anda, dan Anda harus dapat menelusuri instalasi di Anda http://localhost:8080, jika Anda tidak memiliki hal lain yang berjalan di port tersebut di muka (Anda dapat menentukan port lain dengan meneruskan --httpPort=ANOTHER_HTTP_PORTopsi ke perintah di atas) dan semuanya berjalan dengan baik dalam proses 'instalasi'.

Jika Anda pergi ke direktori plugins yang tersedia ( http://localhost:8080/pluginManager/available), Anda akan menemukan plugins untuk mendukung tugas-tugas yang disebutkan di atas (dukungan subversi diinstal per default).

Jika itu yang Anda sukai, Anda harus menginstal server aplikasi java, seperti tomcat atau jetty . Instruksi pemasangan tersedia untuk semua server aplikasi utama

Pembaruan : Kohsuke Kawaguchi telah membangun installer layanan windows untuk hudson

Menyiapkan proyek di hudson

Tautan dalam walk-through berikut ini mengasumsikan instance berjalan dari hudson yang terletak di http://localhost:8080

  1. Pilih Pekerjaan baru ( http://localhost:8080/view/All/newJob) dari menu di sebelah kiri
  2. Beri nama pada pekerjaan itu dan centang Build a free-style software projectpada daftar
  3. Menekan 'ok' akan membawa Anda ke halaman konfigurasi pekerjaan. Semua opsi memiliki tanda tanya kecil di sampingnya. Menekan ini akan memunculkan teks bantuan tentang opsi.
  4. Di bawah grup opsi 'Manajemen Kode Sumber' Anda akan menggunakan Subversion. Hudson menerima baik akses url maupun akses modul lokal
  5. Di bawah grup opsi 'Bangun Pemicu', Anda akan menggunakan 'Poll SCM'. Sintaks yang digunakan di sini adalah cron, jadi polling repositori subversi setiap 5 menit akan dilakukan*/5 * * * *
  6. Proses membangun proyek ditentukan di bawah grup opsi 'Bangun'. Jika Anda sudah memiliki file semut build dengan semua target yang Anda butuhkan, Anda beruntung. Cukup pilih 'Aktifkan semut' dan tulis nama target. Grup opsi mendukung perintah maven dan shell juga di luar kotak, tetapi ada juga plugin yang tersedia untuk phing .
  7. Centang tindakan build tambahan di 'Post Build Actions', seperti pemberitahuan email atau pengarsipan artefak bangunan.

Untuk mengatur proses yang hudson tidak memiliki plugin, Anda dapat memanggil mereka langsung melalui skrip shell dari dalam setup build, atau Anda bisa menulis Anda sendiri plugin

Perangkap:

  • Jika Anda memilikinya, buat artefak buatan, ingat untuk meminta hudson membersihkannya sendiri secara berkala.
  • Jika Anda memiliki lebih dari 20 proyek yang disiapkan, pertimbangkan untuk tidak menampilkan status pembangunannya sebagai halaman utama default di hudson

Semoga berhasil!


2
Saya pikir ada kesalahan dengan sintaks cron Anda. Itu akan berjalan pada menit kelima setiap jam. Jika Anda ingin melakukan polling pada repo setiap 5 menit, Anda perlu menggunakan * / 5
Brian Wigginton

2
@BrianWigginton: Anda sepenuhnya benar. Dan saya bahkan mencoba untuk memperbaiki posting, tetapi saya tidak dapat menyimpannya karena saya memiliki "referensi ke nama host yang tidak valid", yaitu 'localhost'. Saya harap orang-orang melihat ke sini untuk koreksi.
Steen

22

Istilah yang Anda cari adalah "integrasi berkelanjutan."

Berikut adalah contoh seseorang yang menggunakan GIT + phpundercontrol: http://maff.ailoo.net/2009/09/continuous-integration-phpundercontrol-git/

CruiseControl (yang merupakan server CI), dapat menggunakan Hosted SVN / GIT sebagai sumber. Jadi Anda bahkan dapat menggunakannya dengan GitHub atau Beanstalk atau yang lainnya.

Kemudian Anda dapat mengintegrasikannya dengan jenis perangkat lunak berikut:

  • PHPUnit
  • php-codesniffer
  • phpdocumentor
  • PHP Gcov
  • PHPXref
  • Yasca
  • dll.

Anda juga dapat mencoba CI yang dihosting ini: http://www.php-ci.net/hosting/create-project

Perlu diingat, bahwa alat-alat itu membutuhkan dukungan khusus jika Anda mengintegrasikannya sendiri.

Sudahkah Anda juga memikirkan manajemen proyek dan manajemen tambalan?

Anda dapat menggunakan Redmine untuk manajemen proyek. Ini memiliki dukungan integrasi terus menerus yang terintegrasi, tetapi hanya sebagai sisi klien (bukan sebagai server CI).

Coba gunakan SVN / GIT / etc yang di-host. solusi, karena mereka akan menutupi cadangan Anda dan menjaga server mereka berjalan, sehingga Anda dapat fokus pada pengembangan.

Untuk tutorial tentang cara mengatur Hudson, lihat: http://toptopic.wordpress.com/2009/02/26/php-and-hudson/


2
Terima kasih untuk tautannya. Produk yang saya kenal, yang saya harapkan adalah langkah-langkah tutorial yang lebih seperti yang Anda berikan.
Pekka

Hai, per Oktober 2012, apakah php-ci.net down atau ditarik dari layanan? Sepertinya saya tidak dapat terhubung ke alamat itu, juga tidak dapat menemukan informasi baru dari tahun lalu.
Ryan

@Ryan, saya tidak tahu apa yang terjadi. Saya tahu, bahwa Anda dapat mencoba yang lain. Mungkin Anda bisa mencoba: CircleCI atau Anda bisa memeriksa topik ini: Hosted Continuous Integration for PHP?
Michiel

@Ryan, tidak itu tidak turun, saya telah menggunakannya untuk sementara waktu sekarang. Mereka telah pindah ke phptesting.org
omrakhur

6

Saya menggunakan server integrasi berkelanjutan Atlassian dari Bambu untuk proyek PHP utama saya (bersama dengan produk mereka yang lain seperti fisheye (penjelajahan repositori), jira (pelacak masalah) dan semanggi (cakupan kode)).

Ini mendukung SVN dan sekarang mendukung Git dan memiliki antarmuka pengguna yang hebat. Ini tersedia untuk linux, windows dan mac dan dapat menjalankan standalone pada server tomcat sendiri yang sangat bagus untuk orang-orang (seperti saya) yang tidak suka menghabiskan waktu berhari-hari untuk mengatur alat mereka). Meskipun mungkin terlihat mahal, sebagai pengembang sendiri saya membeli lisensi starter kit untuk $ 10 ($ 10 oleh perangkat lunak). Ini bagus untuk tim kecil dan layak untuk dilihat.


Bagaimana Anda dapat mengkonfigurasi bambu untuk mendukung phing? Saat ini saya menggunakan semut, tetapi tampaknya phing lebih tepat untuk digunakan untuk depooyment php. Terima kasih
Vincent

5

PHPTesting PHPCI Ini bagus, server integrasi berkelanjutan yang dibangun di php.

Plus, ini gratis dan open source. :)

ini memiliki sejumlah plugin ..

PHPCI termasuk plugin integrasi untuk:

  • Atoum
  • Behat
  • Api unggun
  • Codeception
  • Komposer
  • Surel
  • Mendengus
  • IRC
  • PHP
  • Lint
  • MySQL
  • Tergantung
  • PostgreSQL
  • Pelacak Kode PHP
  • PHP Copy / Paste Detector
  • PHP Spec
  • Unit PHP
  • Perintah Shell
  • Tar / Zip

Meskipun saya suka PHPCI, saya tidak merekomendasikannya. Ini sangat buggy dan tidak dapat diandalkan. Sangat menyedihkan bahwa fungsi dasar umum tidak sedang diuji unit dengan benar sehingga hal mendasar seperti menambahkan URL proyek menjadi sulit tanpa membuatnya berantakan.
Tek

@Tek apa strategi CI Anda untuk PHP?
omrakhur

1
@ Tomrakhur Saya terjebak dengan PHPCI sayangnya. Semua perangkat lunak lain jauh lebih besar dan membutuhkan banyak pengaturan. Semuanya memiliki pro dan kontra. Anda hanya harus pergi dengan yang terbaik untuk Anda.
Tek

3

Saya sebagian besar admin sistem tetapi kadang-kadang saya kode PHP juga. Sebagai proyek sampingan saya membuat beberapa skrip yang akan membuatnya sederhana dan tidak menyakitkan untuk membuat lingkungan PHP CI yang penuh sesak menggunakan Jenkins. Itu juga menjalankan proyek sampel untuk Anda sehingga Anda dapat melihat bagaimana setiap langkah pembangunan dikonfigurasi.

Jika Anda ingin mencobanya, Anda hanya perlu akses kotak dan shell Debian / Ubuntu.

http://yauh.de/articles/379/setting-up-a-ci-environment-for-php-projects-using-jenkins-ci

Perbarui Untuk menambahkan beberapa konten ke jawaban saya:

Anda cukup mengatur CI Jenkins untuk PHP menggunakan Ansible. Karena v1.4 mendukung peran yang dapat Anda unduh dari situs komunitas galaxy.ansibleworks.com mereka dan itu akan sangat membantu Anda. Ini disebut jenkins-php .


3

Saya sarankan menggunakan Jenkins http://jenkins-ci.org/ gratis dan bersifat open source.

Ini cukup mudah untuk setup, bekerja pada berbagai platform dan terintegrasi dengan baik dengan alat integrasi berkelanjutan lainnya seperti SonarQube (+ SQUALE) untuk mengukur utang teknis dan Thucydides untuk pengujian otomasi.

Saya akan sangat menyarankan menggunakan GIT atau GIT Hub untuk kontrol versi daripada SVN. Dari sudut pandang saya, ini hanya sistem kontrol versi yang lebih baik yang akan membantu Anda meningkatkan upaya pengembangan Anda nanti.

Karena Anda bekerja sebagian besar dengan proyek PHP, ada beberapa alat lain yang dapat Anda gunakan.

PHPUnit - Untuk pengujian unit

PHP CodeSniffer - Periksa standar pengkodean

PHP Depend - Menunjukkan dependensi kode PHP Anda

XDEBUG - Untuk pengujian kinerja

Semua alat ini dan dipicu dengan pekerjaan Jenkins dan membantu dengan kualitas dan kinerja kode Anda.

Semoga Sukses dan Selamat Menikmati!


3

Saya tidak menggunakan banyak produk, atau bahkan jenis produk yang Anda gunakan, tetapi saya akan memberi Anda pengalaman saya.

Saya menjalankan lingkungan TEST bersamaan dengan lingkungan PROD saya. Saya tidak punya pengujian lokal sendiri. Jika terlalu sulit untuk mendapatkan soemthing menjadi lingkungan TEST nyata, maka saya memperbaiki proses pembuatan saya. Saya tidak melihat gunanya menguji secara lokal, karena lingkungannya berbeda. UPDATE: Satu-satunya hal yang saya lakukan secara lokal adalah menjalankan "php -l" sebelum saya mengunggah apa pun. Menghentikan kesalahan bodoh.

Proses build bekerja dengan apa pun yang ada di ruang kerja saat ini, yang mencakup kode yang tidak dikomit. Ini bukan secangkir teh untuk semua orang, tapi aku akan sering ke TEST. Semuanya berkomitmen sebelum pergi ke PROD.

Bagian dari proses pembuatan saya (mirip dengan Anda) membuat dua file META. Satu berisi 100 perubahan terakhir (biasanya) dan juga memberi saya nomor daftar perubahan saat ini. Menunjukkan kepada saya perubahan apa yang diinstal. Yang lainnya berisi CLIENTSPEC (dalam istilah Perforce) yang menunjukkan kepada saya cabang apa yang digunakan dalam pembangunan ini. Bersama-sama ini memberi saya bangunan yang dapat direproduksi.

Saya tidak membangun langsung ke lingkungan target, tetapi ke area pementasan di server. Saya menggunakan SSH jadi ini masuk akal. Ini memberi saya beberapa keuntungan. Paling penting itu menghindari sekarat setengah jalan melalui unggahan besar. Ini juga memberi saya tempat untuk menyimpan file META, dan semua file build secara otomatis diarsipkan (jadi saya bisa langsung kembali ke build apa saja). Script juga mencatat pembaruan (jadi ada entri dalam aliran log dan saya bisa melihat pra dan pasca) dan menendang semua daemon (saya menggunakan daemontools jadi "svc -t"). Semua ini lebih baik pada mesin target.

Satu masalah lain adalah perubahan DB. Saya menyimpan skrip master skema DB, yang saya perbarui setiap kali skema berubah. Setiap perubahan juga masuk ke skrip changes.sql, yang diunggah bersama build ke area pementasan. Skrip dijalankan sebagai bagian dari skrip instal.


Terima kasih atas masukan Anda Phil, ini adalah pengaturan yang sangat, sangat menarik dan saya pikir saya dapat menggunakan bagian ini. Namun dalam kasus saya, saya akan sering tidak memiliki akses SSH ke ujung jarak jauh, jadi saya perlu banyak "kecerdasan" secara lokal, itulah sebabnya saya pikir saya akan membutuhkan produk CI seperti Hudson.
Pekka

2

Saya baru-baru ini memulai proses yang sama, dan saya menggunakan Beanstalk untuk svn hosting.

Ada dua fitur bagus di akun berbayar (mulai dari $ 15 saya pikir):

  • penyebaran memungkinkan pengguna untuk membuat target ftp untuk staging dan server produksi, yang dapat digunakan dengan mengklik tombol (termasuk menentukan revisi dan cabang)
  • webhooks memungkinkan pengguna untuk mengatur url yang dipanggil pada setiap komit / penyebaran, melewati hal-hal seperti nomor revisi, deskripsi dan pengguna. Ini dapat digunakan untuk memperbarui dokumen, menjalankan pengujian unit, dan memperbarui changelogs.

Saya yakin ada server svn lain yang di-host atau self-hosting dengan dua fitur ini, tetapi beanstalk adalah salah satu yang saya punya pengalaman dan berfungsi sangat, sangat baik

Ada juga API, yang saya bayangkan dapat digunakan untuk mengintegrasikan penyebaran lebih lanjut ke proses Anda.


Cheers @adam. Saya tidak mencari layanan yang di-host untuk ini, karena saya khawatir mereka akan selalu terlalu terbatas untuk apa yang saya butuhkan. Tetapi apa yang Anda katakan terdengar menarik, dan API mungkin menjadi titik penghubung untuk yang lain. Saya akan lihat ini.
Pekka

Jangan khawatir, pikir Anda mungkin mengatakan itu. Itu cocok untuk saya saat ini, karena saya belum mengerti kepala saya (dan saya satu tim), ditambah mereka menawarkan ekspor repo penuh jika Anda ingin pindah.
Adam Hopkinson

2

Pertimbangkan fazend.com , platform CI yang dihosting gratis, yang mengotomatiskan konfigurasi dan prosedur pemasangan. Anda tidak perlu mengatur kontrol versi, pelacakan bug, server CI, lingkungan pengujian, dll. Semuanya dilakukan sesuai permintaan.


Mmm, ini terlihat sangat menarik! Tetapi bagaimana mereka bisa bertahan? Melihat semuanya gratis? Bagaimana mereka membayar server, dan biaya E3?
Pekka

@Pekka Proyek ini disponsori oleh perusahaan pengembang perangkat lunak, itu sebabnya layanan ini gratis
yegor256
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.