Bir subversion deposundan PHP uygulamaları dağıtmak Nasıl başlamak için?

9 Cevap php

Ben tek bir sunucuya dosya değiştirildi yükleyerek daha iyi / daha kolay / daha güvenilir geliyor "uygulamaları dağıtma" ifade duydum, ama ben nereden başlayacağımı bilmiyorum.

Ben (bir Subversion depo) sürüm kontrolü altında olan bir Zend Framework uygulama var. Başvurumu nasıl "dağıtma" hakkında nasıl gidiyor? Ben üzerine yazmak istemiyorum bir "yüklenenler" dizin varsa ne yapmalıyım?

Ben üçüncü bir taraf aracılığıyla benim uygulama barındırmak, bu yüzden FTP daha başka bilmiyorum. Bu benim herhangi bir sunucuya günlüğü içeriyorsa, süreci açıklayınız.

9 Cevap

Bir hazırlama sunucusuna otomatik açılma + testleri çalıştırmak sürekli entegrasyon olarak bilinir. Fikir testleri kırar şey kontrol ederseniz, hemen haberdar olduğunu ifade etti. PHP için, içine bakmak isteyebilirsiniz Xinc veya phpUnderControl

Genellikle not otomatik olsa üretime dağıtmak isterdim. Yapmak normal bir şey görevi otomatikleştiren bazı komut dosyaları yazmak için, ama hala elle başlatmak gerekir. Bu tür Phing veya bu diğer yapı-araçlar (popüler bir seçimdir Capistrano) olarak çerçeveler kullanabilirsiniz, ama aynı zamanda sadece birlikte bir kaç kabuk-komut fırçalamak. Şahsen ben sonuncusunu tercih ederim.

Komut kendilerini, uygulama ve kurulum bağlı olarak, farklı şeyler yapabilirdi, ama tipik bir süreç olacaktır:

  • üretim sunucusuna ssh. Komutların kalanı ssh'dan, üretim sunucuda çalıştırılır.
  • run svn export svn://path/to/repository/tags/RELEASE_VERSION /usr/local/application/releases/TIMESTAMP
  • durdurmak hizmetleri (Apache, cinleri)
  • run unlink /usr/local/application/current && ln -s /usr/local/application/releases/TIMESTAMP /usr/local/application/current
  • run ln -s /usr/local/application/var /usr/local/application/releases/TIMESTAMP/var
  • run /usr/local/application/current/scripts/migrate.php
  • hizmetlerini başlatın

(Eğer /usr/local/application/current daki uygulama var varsayarsak)

Ben otomatik güncelleştirme tavsiye etmem. Sadece ünite testleri geçmek çünkü uygulama% 100 çalışma olduğu anlamına gelmez. Birisi herhangi bir yeni ünite testleri olmadan rastgele bir yeni özellik denetler ve özellik işe yaramazsa ne olur? Mevcut birim testleri geçmek olabilir, ama özellik zaten kırılmış olabilir. Kullanıcıların half-done var şey görebilirsiniz. Bir şey bu olmamalıdır yaşamak yaptıysanız bir check-in otomatik dağıtım ile, birkaç saat boyunca fark edemeyebilirsiniz.

Her neyse, bir otomatik dağıtım gerçekten isteseydi olacak almak için bu zor olmayacaktır. Sen bir post-check-in kanca gerekiyordu ve gerçekten adımlar olacaktır:

1) Do an export from the latest check-in 2) Upload export to production server 3) Unpack/config the newly uploaded export

Ben her zaman el son adımları gerçekleştirdiğiniz. Genellikle SVN ihracat, zip, yükleme, unzip, yapılandırma, ve ben sadece bash bir çift takma gerçekleştirmek için bir araya komutlarını son iki adım kadar basit. Sonra ben bir yedek olarak eski bir etrafında tutmak sağlanması, yenisi ile kök app dizini takas, ve gitmek için iyi.

Onlar otomatik olarak canlı giderdim önce hataları yakalamak için yeteneğine güvenen iseniz, o zaman bu işlemi otomatik bakmak olabilir. Ama bana jibbly-jibblies verir.

Burada web projeleri dağıtmak için Subversion kullanarak mükemmel bir makale - bu sorularınızın çoğuna cevap.

http://athleticsnyc.com/blog/entry/on-using-subversion-for-web-projects

Benim webdev şirkette son zamanlarda popüler Capistrano aracı bir Web GUI olan Webistrano kullanmaya başladı.

Biz, merkezi bir arayüz ile hızlı dağıtım aracı, hesap verebilirlik (hangi sürümünü dağıtmış kim), önceki sürümlerine geri alma kullanımı kolay ve tercihen ücretsiz istedi. Capistrano Rails uygulamaları üzerinde Ruby için bir dağıtım aracı olarak bilinen, ancak merkezi ve esas Raylar apps hedef değil. Webistrano bir GUI, hesap verebilirlik ile geliştirir, ve PHP dağıtımı için temel destek ('saf dosya' proje türünü kullanın) ekler.

Webistrano bir geliştirme veya hazırlama sunucusunda yüklemeniz, kendisi Rails app üzerinde bir Ruby. Eğer web sitelerinin her biri için bir proje ekleyin. Her bir proje için, bu tür Prod ve Dev gibi aşamaları, ekleyin.

Her aşama dağıtmak için farklı sunucular ve farklı ayarları olabilir. Yazın (veya değiştirmek) capistrano ne yapılacağını söyler bir ruby ​​script bir 'reçete'. Bizim durumumuzda Ben sadece bahsettiğimiz gibi, verilen tarifi kullanılan ve paylaşılan yüklenenler dir bir sembolik bağ oluşturmak için bir komut eklendi.

Eğer uzak sunucu (lar) içine Dağıtma, Webistrano SSHs tıkladığınızda, bir kod svn ödeme, ve bu tür veritabanı göçler, sembolik bağlantılarını veya önceki sürümleri temizleme gibi gerektiren diğer görevleri yapar. Tüm bu dersin tweaked olabilir, tüm sonra, sadece senaryosunu oluyor.

Biz onunla çok mutluyuz, ama ben Ruby ve Rails aşina değildi, özellikle bu yana, öğrenmek ve ayarlamak için bir kaç gün sürdü. Yine de, son derece esnek, çok güvenilir kanıtlanmış ve bize ilk yatırımı birçok kez kurtardı beri, küçük ve orta ölçekli şirketlerde üretim kullanımı için tavsiye ederim. Sadece dağıtımları hızlandırarak, ama aynı zamanda hatalar / kazaları azaltarak.

Bu tür bir şey size "Sürekli Entegrasyon" derim. Atlassian Bambu (maliyet), Güneş Hudson (ücretsiz) ve Cruise Control (ücretsiz) (benim tercih sırasına göre) tüm popüler seçeneklerdir ve PHPUnit çıktı işlemek için destek (PHPUnit destek JUnit çıktı çünkü).

Dağıtım şeyler sonrası bir yapı tetikleyici ile yapılabilir. Bu konuya bazı diğer insanlar gibi, ben tarihi üzerinde otomatikleştirilmiş dağıtımlar yapmadan önce çok dikkatli egzersiz (ve test geçen) olacaktır.

check fredistrano, it's a capistrano clone works great (litle bit confusing installing but after all runs great)

http://code.google.com/p/fredistrano/

Yüklenenler işlemek için, klasik çözüm geri içine (aşağıda komut yapmak gibi), sadece teslim edilecek bir yeni sürümü için bırakarak ve ardından 'Alias' için Apache kullanarak, ana site alanı dışında gerçek dizini taşımak için web sitesinin bir parçası olarak yerleştirin.

Alias /uploads /home/user/uploads/

Eğer ancak sunucunun kadar kontrol yoksa sizin için daha az seçenek vardır.

Ben (her ikisi de aynı sunucu üzerinde çalışan) dev / canlı sitelere verilen bir komut dosyası dağıtmak için kullanabileceğiniz bir script var.

#!/bin/sh

REV=2410
REVDIR=$REV.20090602-1027

REPOSITORY=svn+ssh://topbit@svn.example.com/var/svn/website.com/trunk
IMAGES=$REVDIR/php/i
STATIC1=$REVDIR/anothersite.co.uk

svn export --revision $REV  $REPOSITORY $REVDIR

mkdir -p $REVDIR/tmp/templates_c
chown -R username: $REVDIR
chmod -R 777       $REVDIR/tmp $REVDIR/php/cache/
chown -R nobody:   $REVDIR/tmp $REVDIR/php/cache/ $IMAGES
dos2unix $REVDIR/bin/*sh  $REVDIR/bin/*php
chmod 755 $REVDIR/bin/*sh $REVDIR/bin/*php

# chmod -x all the non-directories in images
find $IMAGES -type f -perm -a+x | xargs -r chmod --quiet -x
find $STATIC1 -type f -perm -a+x | xargs -r chmod --quiet -x

ls -l $IMAGES/* | grep -- "-x"

rm dev && ln -s $REVDIR dev

Ben revizyonla numarasını ve kontrol-çıkış dizin adı için kullanılan tarih / zaman koymak. Onlar da bizim özel görüntü sunucuya sembolik olarak olarak görüntülerde izinleri Tamam sre ortada Chmod en de yapmak.

Olur son şey, eski bir sembolik bağdır ... / web / dev / yeni teslim dizine relinked edilir. Apache yapılandırma sonra ... / web / dev / htdocs / bir doc-kökü vardır

Eşleşen de var ... / web / canlı / htdocs / docroot, ve yine, 'canlı' başka bir sembolik bağdır. Bu canlı sembolik bağ kaldırmak, ve ne olursa olsun dev puan ile yerini alacak benim diğer betik.

#!/bin/sh
# remove live, and copy the dir pointed to by dev, to be the live symlink
rm live && cp -d dev live

Ben sadece sitenin her birkaç dats yeni bir sürümünü itiyorum, böylece bir gün (APC cache etrafında sitenin daha birkaç sürümleri gibi olmaz) bu birkaç kez kullanarak istemeyebilirsiniz, ama benim için Ben bu çok sorunsuz kendi dağıtım için buluyorum.

Bu uygulama ve nasıl katı testlerdir bağlıdır.

Çalıştığım yerde her şeyi inceleme için depoya teslim alır ve daha sonra serbest bırakılır.

Bir deponun üzerinden otomatik güncelleme diğer geliştiriciler bir sonraki sürümü çekin ve orada içeri değişiklikleri birleştirebilirsiniz böylece bazen sadece check-in gibi, bizim için akıllı olmaz

Neden bahsediyorsun sen ne yapmak alanda birincil kontrol geliştiriciler arasında işbirliği sağlamak için dışarı ikincil kontrol çeşit ihtiyaç ve olacaktır. Ben bu konuda ya da hatta mümkünse hiçbir şey bilmiyorum rağmen.

Dallanma ve ele alınması gerekir gibi başka özellikleri ile ilgili sorunlar da vardır.

3 yıl sonra, dağıtım en iyi uygulamalar hakkında biraz öğrendim. Bu kurulumu ve kullanımı kolay, çünkü ben şu anda Capistrano denilen bir aracı kullanmak, ve o güzel varsayılan bir sürü işler.

Bir otomatik dağıtım sürecinin temelleri şöyle:

  1. Sizin kod üretimi için hazır olduğunu, bu nedenle serbest sürümü ile etiketlenmiş: v1.0.0
  2. Zaten dağıtım komut dosyası yapılandırılmış ettik varsayarsak, size sadece oluşturduğunuz etiketi belirterek, komut dosyasını çalıştırın.
  3. Komut SSH en aşağıdaki dizin yapıya sahiptir üretim sunucusuna üzerinde:

    /your-application
        /shared/
            /logs
            /uploads
        /releases/
            /20120917120000
            /20120918120000  <-- latest release of your app
                /app
                /config
                /public
                ...etc
        /current --> symlink to latest release
    
    Your Apache document root should be set to /your-application/current/public
    
  4. Komut mevcut tarih ile bültenleri dizinde yeni bir dizin oluşturur. Dizinde, kod belirttiğiniz etiketi güncellenir.

  5. Sonra orijinal sembolik link kaldırılır ve yeni bir sembolik oluşturulur, son sürümü işaret.

Sürümler arasında tutulması gereken şeyler paylaşılan dizinde gider ve sembolik bağların bu paylaşılan dizinlere oluşturulur.