PHP projeleri için bir dağıtım / derleme / CI döngüsü kurma


200

Zamanımın çoğunda yalnız bir geliştiriciyim, çoğunlukla büyük PHP tabanlı projeler üzerinde çalışıyorum. Kod tabanındaki değişikliklerin nasıl işlendiğini profesyonelleştirmek ve otomatikleştirmek ve temel değişiklikler yapmak zorunda kalmadan bir ekipte çalışmaya geçişi mümkün kılan bir Sürekli Entegrasyon süreci oluşturmak istiyorum.

Şu anda yaptığım şey, her proje için yerel bir test ortamım var; Her proje için SVN kullanıyorum; değişiklikler yerel olarak test edilir ve daha sonra genellikle FTP aracılığıyla çevrimiçi sürüme aktarılır. API belgeleri kaynak koddan manuel olarak oluşturulur; Birim testleri yavaş yavaş içine girdiğim bir şey ve henüz günlük rutinimin bir parçası değil.

Düşündüğüm "yapı döngüsü" aşağıdakileri yapacaktır:

  • Bir değişiklik kümesi yerel olarak test edildikten sonra SVN'ye kontrol edilir.

  • İnşa sürecine başlıyorum. SVN HEAD revizyonu kontrol edilir, gerekirse değiştirilir ve yüklenmeye hazır hale getirilir.

  • API Belgeleri otomatik olarak oluşturulur - henüz ayrıntılı olarak ayarlamadıysam, varsayılan bir şablon kullanarak tüm kod tabanını tarar.

  • Yeni gözden geçirme, FTP aracılığıyla uzak konuma dağıtılır (Bazı dizin yeniden adlandırma, chmodding, veritabanlarını içe aktarma ve benzerleri dahil.) Bu zaten phing'i çok sevdiğim bir şey, ama elbette alternatiflere açıkım .

  • Önceden tanımlanmış bir yerde bulunan birim testleri yapılır. Bir web sayfasına koyabileceğim E-Posta, RSS veya (tercihen) HTML çıktısını kullanarak başarısızlıkları veya başarıları hakkında bilgilendirildim.

  • (isteğe bağlı olarak) önceden tanımlanmış bir konumdaki son kullanıcı "changelog" metin dosyası, yürütme mesajının önceden tanımlanmış bir bölümü ile güncellenir ("Artık" foo "hem de" bar "için aynı anda filtre uygulamak mümkündür Bu mesaj, muhtemelen daha fazla dahili bilgi içeren SVN taahhüt mesajıyla aynı olmayabilir.

  • Kod metrikleri, kod stili denetimi ve benzeri şeyler şu anda birincil odak noktam değil, uzun vadede kesinlikle yapacaklar. Kutudan çıkar çıkaran çözümler çok nazik bir şekilde inceleniyor.

Bakıyorum

  • Geri bildirim ve deneyimlerBenzer bir durumda olan veya bu durumda olan ve bunun için başarıyla bir çözüm uygulayan kişilerden

  • Özellikle, adım adım iyi eğitimler ve izlenecek yollar bunu nasıl ayarlayacağınızla ilgili

  • Mümkün olduğunca fazla otomasyon sağlayan çözümler, örneğin her yeni proje için bir iskelet API'sı, test senaryoları vb.

ve ayrıca

  • Ürün önerileri . Şimdiye kadar bildiğim bina için phing / ant ve phpUnderControl veya Hudson ve raporlama bölümü için . Hepsini görebildiğim kadar çok seviyorum ama elbette onlarla ilgili detaylı bir deneyimim yok.

Ben am gömülmek Basit çözümlere doğru güçlü bir eğilim var ve bu yüzden, iş ile. Öte yandan, bir özellik eksikse, çok sınırlı olduğundan ağlayacağım. :) İşaretle ve tıkla çözümleri de kabul edilir. Ayrıca PHP projeleri ile çalışabilir ticari ürün önerileri için duyuyorum.

Kurulumum

Ben yerel olarak Windows üzerinde çalışıyorum (7, kesin olarak) ve çoğu istemci projeleri genellikle paylaşılan barındırma (= uzak SSH) bir LAMP yığını üzerinde çalışır. Kendi çevremde çalıştırabileceğim çözümler arıyorum. Bunun için bir Linux VM kurmaya hazırım, sorun değil. Barındırılan çözümler, yalnızca açıklanan tüm yönleri sağlarsa veya sürecin diğer bölümleriyle etkileşime girecek kadar esnekse benim için ilginçtir.

Ödül Bana en fazla kilometre sağlayacağını düşündüğüm cevabı kabul ediyorum. Burada çok sayıda mükemmel girdi var, keşke birden fazla cevabı kabul edebilsem. Herkese teşekkürler!

Yanıtlar:


76

Başıma BuildBot'ın , CruiseControl.Net , CruiseControl ve Hudson . Her ne kadar CruiseControl * gerçekten sevdim, gerçekten karmaşık bağımlılık vakaları ile çok fazla güçlük oldu. buildbot kurulumu kolay değil, ama güzel bir havası var (sadece python'u seviyorum, hepsi bu). Ama Hudson ilk üçünü kazandı çünkü:

  1. Kurulumu kolaydır
  2. Özelleştirmek kolaydır
  3. İyi görünüyor ve güzel bir genel bakış işlevselliği var
  4. Kendisi ve yüklü tüm eklentiler için nokta ve tıklama güncellemeleri aldı. Bu gerçekten hoş bir özellik, daha fazla takdir ediyorum

Uyarı: Linux'u sadece yukarıda belirtilen yapı sunucuları için temel olarak kullandım (CC.net mono üzerinde çalıştı ), ancak hepsi - belgelere göre - çapraz platform çalıştırmalıdır.

Hudson sunucusu kurma

Ön şartlar:

  • Java (1.5 size iyi hizmet edecek)
  • Subversion sunucusuna okuma erişimi (hudson kullanıcısı için ayrı bir hesabım var)

Buradan, sadece:

java -jar hudson.war

Bu, konsolunuzdan hemen küçük bir sunucu örneği http://localhost:8080çalıştıracaktır ve önceden bu bağlantı noktasında çalışan başka bir şey yoksa yüklemeye göz atmanız gerekir ( --httpPort=ANOTHER_HTTP_PORTseçeneği bağlantı noktasına geçirerek başka bir bağlantı noktası belirtebilirsiniz . yukarıdaki komut) ve her şey 'kurulum' sürecinde iyi gitti.

Kullanılabilir eklentiler dizinine ( http://localhost:8080/pluginManager/available) giderseniz, yukarıda belirtilen görevlerinizi desteklemek için eklentiler bulacaksınız (varsayılan olarak alt sürüm desteği yüklenir).

Eğer iştah açarsanız, tomcat veya iskelesi gibi bir java uygulama sunucusu kurmalısınız . Yükleme talimatları tüm büyük uygulama sunucuları için mevcuttur

Güncelleme : Kohsuke Kawaguchi hudson için bir windows servis yükleyicisi oluşturdu

Hudson'da bir proje oluşturma

Aşağıdaki açıklamadaki bağlantılar, adresinde bulunan hudson'un çalışan bir örneğini varsayar. http://localhost:8080

  1. http://localhost:8080/view/All/newJobSoldaki menüden yeni İş ( ) seçin
  2. İşe bir ad verin Build a free-style software projectve listeyi işaretleyin
  3. 'Tamam'a basmak sizi işin yapılandırma sayfasına götürür. Tüm seçeneklerin yanında küçük bir soru işareti vardır. Buna basmak, seçenekle ilgili bir yardım metni getirecektir.
  4. 'Kaynak Kod Yönetimi' seçenek grubu altında Subversion kullanıyorsunuz. Hudson hem URL erişimini hem de yerel modül erişimini kabul eder
  5. 'Derleme Tetikleyicileri' seçenek grubu altında 'Anket SCM'yi kullanırsınız. Burada kullanılan sözdizimi cron'dur, bu yüzden yıkım havuzunu her 5 dakikada bir sorgulamak*/5 * * * *
  6. Projeyi oluşturma süreci 'Oluştur' seçenek grubu altında belirtilmiştir. Zaten ihtiyacınız olan tüm hedefleri içeren bir karınca inşa dosyanız varsa, şanslısınız demektir. 'Karınca çağır'ı seçin ve hedefin adını yazın. Seçenek grubu, maven ve shell komutlarını kutunun dışında da destekler, ancak phing için bir eklenti de vardır .
  7. E-posta bildirimleri veya derleme eserlerinin arşivlenmesi gibi 'Derleme İşlemleri Sonrası' bölümünde ek derleme eylemlerini işaretleyin.

Hudson'ın eklentisi olmayan süreçleri ayarlamak için, bunları doğrudan derleme kurulumundan bir kabuk komut dosyası aracılığıyla çağırabilir veya kendi eklentinizi yazabilirsiniz

tuzaklar:

  • Yapı yapıları oluşturduysanız, düzenli aralıklarla hudson'u temizlemeyi unutmayın.
  • 20'den fazla proje kurduysanız, düşünün değil on Hudson varsayılan ana sayfa olarak kendi inşa durumunu gösteren

İyi şanslar!


2
Sanırım cron sözdiziminde bir hata var. Bu her saatin beşinci dakikasında gerçekleşir. Repoyu her 5 dakikada bir anket yapmak isterseniz * / 5
Brian Wigginton

2
@BrianWigginton: Tamamen haklısın. Gönderiyi düzeltmeye bile çalıştım, ancak kaydedemiyorum çünkü "geçersiz bir ana bilgisayar adına referans", yani 'localhost' var. Umarım insanlar düzeltme için buraya bakarlar.
Steen

22

Aradığınız terim "sürekli entegrasyon" dur.

İşte GIT + phpundercontrol kullanan birine bir örnek: http://maff.ailoo.net/2009/09/continuous-integration-phpundercontrol-git/

CruiseControl (CI sunucusu), Hosted SVN / GIT'i kaynak olarak kullanabilir. Böylece GitHub veya Beanstalk veya başka bir şeyle bile kullanabilirsiniz.

Daha sonra bunu aşağıdaki tür yazılımlarla entegre edebilirsiniz:

  • PHPUnit
  • php-codesniffer
  • phpDocumentor
  • PHP Gcov
  • PHPXref
  • Yasca
  • vb.

Bu barındırılan CI'yı da deneyebilirsiniz: http://www.php-ci.net/hosting/create-project

Ancak, bunları kendiniz entegre ederseniz bu araçların özel desteğe ihtiyacı olduğunu unutmayın.

Ayrıca proje yönetimi ve yama yönetimi hakkında da düşündünüz mü?

Redmine'ı proje yönetimi için kullanabilirsiniz. Entegre sürekli entegrasyon desteğine sahiptir, ancak yalnızca istemci tarafı (CI sunucusu olarak değil).

Barındırılan bir SVN / GIT / vb. Kullanmayı deneyin. çünkü yedeklerinizi kapatacak ve sunucularını çalışır durumda tutacaklardır, böylece geliştirmeye odaklanabilirsiniz.

Hudson'ın nasıl kurulacağı hakkında bir eğitim için bkz: http://toptopic.wordpress.com/2009/02/26/php-and-hudson/


2
Bağlantı için teşekkürler. Bildiğim ürünler, umduğum şey, sağladığınız gibi daha öğretici tarzı izlenecek yollardır.
Pekka

Merhaba, Ekim 2012 itibariyle, php-ci.net aşağı veya zaten hizmetten çekilmiş? Bu adrese bağlanamıyorum ve geçen yıldan yeni bilgiler bulamıyorum.
Ryan

@Ryan, ne olduğunu bilmiyorum. Başkalarını deneyebileceğinizi biliyorum. Belki deneyebilirsiniz: CircleCI ya da bu konuyu kontrol edebilirsiniz: PHP için Hosted Continuous Integration?
Michiel

@Ryan, hayır aşağı değil, bir süredir kullanıyorum. Phptesting.org adresine taşındılar
omrakhur

6

Ana PHP projem için Atlassian'ın Bamboo sürekli entegrasyon sunucusunu kullanıyorum ( balık gözü (depo göz atma), jira (sayı izleyici) ve yonca (kod kapsamı) gibi diğer ürünlerle birlikte ).

SVN'yi destekliyor ve şimdi Git'i destekliyor ve harika bir kullanıcı arayüzüne sahip. Linux, windows ve mac için kullanılabilir ve kendi tomcat sunucusunda bağımsız olarak çalışabilir, bu da kendi araçlarını kurmak için gün almak istemeyen insanlar (benim gibi) için harika. Pahalı görünse de, yalnız bir geliştirici olarak başlangıç ​​kiti lisansını 10 $ (yazılımla 10 $) satın aldım. Bu küçük takımlar için harika ve göz atmaya değer.


Bambu phing'i destekleyecek şekilde nasıl yapılandırabilirsiniz? Şu anda karınca kullanıyorum, ama phing depooyment için kullanmak daha uygun görünüyor. Teşekkürler
Vincent

5

PHPTesting PHPCI Bu php yerleşik güzel, sürekli entegrasyon sunucusudur.

Artı, özgür ve açık kaynak. :)

eklentileri vardır ..

PHPCI aşağıdakiler için entegrasyon eklentileri içerir:

  • Atoum
  • Behat
  • Kamp ateşi
  • Codeception
  • Besteci
  • E-posta
  • Homurtu
  • IRC
  • PHP
  • keten tiftiği
  • MySQL
  • PDepend
  • PostgreSQL
  • PHP Kod Sniffer'ı
  • PHP Kopyala / Yapıştır Dedektörü
  • PHP Özellikleri
  • PHP Birimi
  • Kabuk Komutları
  • Tar / Zip

PHPCI'yi sevmeme rağmen tavsiye etmiyorum. İnanılmaz derecede buggy ve güvenilir değil. Ortak temel işlevlerin düzgün bir şekilde birim testinden geçirilmemesi üzücüdür, bu nedenle proje URL'si eklemek gibi temel şeyler uğraşmadan zordur.
Tek

@Tek PHP için CI stratejiniz nedir?
omrakhur

1
@omrakhur Maalesef PHPCI ile sıkışıp kaldım. Diğer tüm yazılımlar çok daha hantaldır ve kurulumu çok zaman alır. Her şeyin artıları ve eksileri vardır. Sadece sizin için en uygun olanla gitmek zorundasınız.
Tek

3

Ben çoğunlukla bir sys admin değilim ama bazen PHP de kod. Bir yan proje olarak Jenkins'i kullanarak tam bir PHP CI ortamı kurmayı basit ve ağrısız hale getirecek bazı komut dosyaları oluşturdum. Ayrıca, sizin için örnek bir proje çalıştırır, böylece her oluşturma adımının nasıl yapılandırıldığını görebilirsiniz.

Eğer denemek istiyorsanız tek ihtiyacınız olan bir Debian / Ubuntu kutusu ve kabuk erişimi.

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

Güncelle Cevabıma içerik eklemek için:

Ansible kullanarak PHP için bir Jenkins CI kurabilirsiniz. V1.4 sürümünden bu yana, galaxy.ansibleworks.com topluluk sitesinden indirebileceğiniz rolleri destekliyor ve sizin için ağır kaldırmayı yapacak. Buna jenkins-php denir .


3

Jenkins'i http://jenkins-ci.org/ kullanmanızı öneririm , ücretsiz ve açık kaynak.

Kurulumu oldukça kolaydır, çoklu platformlarda çalışır ve teknik borcu ölçmek için SonarQube (+ SQUALE) gibi diğer sürekli entegrasyon araçlarıyla iyi entegre olur ve test otomasyonu için Thucydides.

SVN yerine sürüm kontrolü için GIT veya GIT Hub kullanmanızı öneririm. Benim açımdan, daha sonra geliştirme çabalarınızı ölçeklendirmenize yardımcı olacak daha iyi bir sürüm kontrol sistemi.

Çoğunlukla PHP projesiyle çalıştığınız için kullanabileceğiniz başka araçlar da var.

PHPUnit - Birim testi için

PHP CodeSniffer - Kodlama standartlarını kontrol edin

PHP Depend - PHP kod bağımlılıklarınızı gösterir

XDEBUG - Performans testi için

Tüm bu araçlar ve bir Jenkins işi ile tetiklenir ve kodunuzun kalitesi ve performansı ile yardımcı olur.

İyi şanslar ve tadını çıkarın!


3

Kullandığınız ürünlerin çoğunu ve hatta ürün türlerini kullanmıyorum, ancak size deneyimimi sunacağım.

PROD ortamımla paralel olarak bir TEST ortamı yürütüyorum. Yerel testlerim yok. Gerçek bir TEST ortamına girmek için çok zor olursam, yapım sürecimi düzeltirim. Ortamlar farklı olduğu için yerel olarak test etme noktasını görmüyorum. GÜNCELLEME: Herhangi bir şey yüklemeden önce yerel olarak yaptığım tek şey "php -l" komutunu çalıştırmak. Aptalca hataları durdurur.

Derleme işlemi, yürürlükteki çalışma alanında varolmayan kod içeren her şeyle çalışır. Bu herkesin çayı değil, ama çok sık test edeceğim. PROD'a gitmeden önce her şey işlenir.

Yapım sürecimin bir kısmı (sizinkine benzer) iki META dosyası oluşturur. Bunlardan biri son (tipik) 100 değişikliği içerir ve ayrıca bana güncel değişiklik listesi sayısını verir. Hangi değişikliklerin yüklendiğini gösterir. Diğeri, bana bu yapıda hangi dalların kullanıldığını tam olarak gösteren CLIENTSPEC'i (Performans açısından) içerir. Bunlar bana yeniden üretilebilir yapılar veriyor.

Doğrudan hedef ortama değil, sunucudaki bir hazırlama alanına inşa ediyorum. SSH kullanıyorum, bu mantıklı. Bu bana birkaç avantaj sağlıyor. En önemlisi, büyük bir yükleme ile yarı yolda ölmekten kaçınır. Ayrıca bana META dosyalarını depolamak için bir yer verir ve tüm yapı dosyaları otomatik olarak arşivlenir (böylece doğrudan herhangi bir yapıya geri dönebilirim). Komut dosyası da güncellemeyi günlüğe kaydeder (bu yüzden günlük akışında bir giriş vardır ve öncesi ve sonrası- görebilirim) ve tüm arka plan programlarını (ben "svc -t" olarak daemontools kullanıyorum) tekme atıyor. Bunların hepsi hedef makinede daha iyi durumda.

Diğer bir sorun da DB değişiklikleri. Şema her değiştiğinde güncellediğim DB şemasının ana komut dosyasını tutuyorum. Değişikliklerin her biri, derleme ile hazırlama alanına yüklenen bir change.sql komut dosyasına da girer. Komut dosyası, kurulum komut dosyasının bir parçası olarak çalıştırılır.


Phil girişiniz için teşekkürler, bu çok, çok ilginç bir kurulum ve sanırım bunun bir kısmını kullanabilirim. Ancak benim durumumda, uzak uca SSH erişimi çok sık olmayacak, bu yüzden yerel olarak çok sayıda "istihbarat" lazım, bu yüzden Hudson gibi bir CI ürününe ihtiyacım olacağını düşünüyorum.
Pekka

2

Geçenlerde aynı tür bir işleme başladım ve svn hosting için Beanstalk kullanıyorum .

Ücretli hesaplarda iki şık özellik vardır (sanırım 15 $ 'dan başlayan):

  • dağıtım, kullanıcının bir düğmeyi tıklatarak dağıtılabilen hazırlama ve üretim sunucuları için ftp hedefleri oluşturmasına olanak tanır (bir düzeltme ve dal belirtme dahil)
  • webhooks kullanıcının revizyon numarası, açıklama ve kullanıcı gibi şeyleri geçerek her bir taahhütte / dağıtımda çağrılan bir url oluşturmasına olanak tanır. Bu, dokümanları güncellemek, birim testlerini çalıştırmak ve değişiklik günlüklerini güncellemek için kullanılabilir.

Bu iki özelliğe sahip diğer barındırılan veya kendi kendini barındıran svn sunucuları olduğundan eminim, ancak beantalk, deneyime sahip olduğum ve çok, çok iyi çalışıyor

Ayrıca, dağıtımı işleminize daha fazla entegre etmek için kullanılabileceğini düşündüğüm bir API var.


Şerefe @adam. Bunun için barındırılan hizmetler için çok fazla değilim, çünkü korktuğum için her zaman ihtiyacım olan şey için çok sınırlı olacaklar. Ancak söyledikleriniz kulağa ilginç geliyor ve API geri kalanı için bir bağlantı noktası olabilir. Buna bir göz atacağım.
Pekka

Endişelenme, bunu söyleyebileceğini düşündüm. Şimdilik bana yakışıyor, çünkü başımı svn (ve tek kişilik bir takımım) tam olarak almadım, ayrıca taşımak istiyorsanız tam bir repo ihracatı sunuyorlar.
Adam Hopkinson

2

Konfigürasyon ve kurulum prosedürlerini otomatik hale getiren ücretsiz barındırılan bir CI platformu olan fazend.com'u düşünün . Sürüm kontrolü, hata izleme, CI sunucusu, test ortamı vb. Ayarlamanıza gerek yoktur. Her şey isteğe bağlı olarak yapılır.


Mmm, bu çok ilginç görünüyor! Fakat nasıl hayatta kalırlar? Herşey bedava mu görüyorsun? Sunucu ve E3 ücretlerini nasıl ödüyorlar?
Pekka

@Pekka Bu proje bir yazılım geliştirme şirketi tarafından desteklenmektedir, bu yüzden hizmet ücretsizdir
yegor256
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.