dağıtım stratejimizi geliştirmek


12

Şirketimizde geliştirdiğimiz bir e-ticaret uygulamamız var. Yaklaşık 3 yıldır açık ve kapalı olarak geliştirdiğimiz makul standart bir LAMBA uygulamasıdır. Uygulamayı bir test alanında geliştiriyoruz, burada yeni özellikler ekliyoruz ve hataları düzeltiriz. Hata izleme ve özellik geliştirmemiz barındırılan bir alt çözüm çözümü (unfuddle.com) içinde yönetilir. Hata bildirildiği gibi biz bu düzeltmeleri test etki alanı üzerinde yapmak ve sonra biz mutluyuz svn değişiklikleri düzeltildi hata düzeltildi. Aynı prosedürü yeni özelliklerin eklenmesiyle takip ediyoruz.

Sunucularımızın genelindeki sistemimizin ve uygulamamızın genel mimarisine dikkat çekmeye değer. Her yeni özellik geliştirildiğinde, bu güncellemeyi uygulamamızı (her zaman kontrol ettiğimiz bir sunucu) kullanarak tüm sitelere sunuyoruz. Sistemimizi kullanan her site, kod tabanının% 95'i için tamamen aynı dosyaları kullanır. Her site içinde o siteye özel dosyalar içeren birkaç klasör var - css dosyaları / resimler vb. Bunun dışında, her site arasındaki farklar her site veritabanındaki çeşitli yapılandırma ayarları ile tanımlanır.

Bu, gerçek dağıtımın kendisine geçer. Bir tür güncellemeyi kullanıma sunmaya hazır olduğumuzda ve test sitesinde bulunduğu sunucuda bir komut çalıştırıyoruz. Bu, bir kopyalama komutu (cp -fru / testsite / / othersite /) gerçekleştirir ve dosyaları değiştirilen tarihe göre güncelleyen her vhost kuvvetinden geçer. Barındırdığımız her ek sunucunun üretim kod tabanını yeniden senkronize ettiğimiz bir hayaleti var ve daha sonra kopyalama işlemini bu sunucudaki tüm sitelerde tekrarlıyoruz. Bu işlem sırasında üzerine yazmak istemediğimiz dosyaları, kopya tamamlandığında geri taşıyoruz. Açılış komut dosyamız, her veritabanını değiştirmek için SQL komutları uygulamak, alanlar / yeni tablolar eklemek vb. Gibi bir dizi başka işlevi yerine getirir.

İşlemimizin yeterince kararlı olmadığı, hataya dayanıklı olmadığı ve aynı zamanda bir kaba kuvvet yöntemi olduğu konusunda giderek daha fazla endişe duyduk. Ayrıca, yeni bir özellik üzerinde çalışmanın, dallardan veya etiketlerden faydalanmadığımız için önemli bir hata düzeltmesini önleyeceğimiz bir konuma sahip olduğumuz için yıkımı en iyi şekilde kullanmadığımızın farkındayız. Ayrıca, sunucularımız arasında çok fazla dosya çoğaltmamız olduğu da yanlış görünüyor. Ayrıca, daha yeni sunduklarımız için kolayca geri alma gerçekleştiremiyoruz. Her bir sunumdan önce bir fark yapıyoruz, böylece değiştirilecek dosyaların bir listesini alabiliriz, böylece neyin sonra değiştirildiğini biliyoruz, ancak geri alma işlemi hala sorunlu olacaktır. Veritabanı açısından potansiyel bir çözüm olarak dbdeploy içine bakmaya başladım. Gerçekten istediğimiz şey, dosya yönetimimizi ve dağıtımımızı nasıl geliştirebileceğimiz hakkında bazı genel rehberliktir. İdeal olarak, dosya yönetiminin depomuza daha yakından bağlanmasını istiyoruz, böylece bir geri alma / geri alma svn'ye daha fazla bağlı olacaktır. Site dosyalarının repo dosyalarıyla aynı olduğundan emin olmak için export komutunu kullanmak gibi bir şey. Çözüm de sunucularımızdaki dosya çoğaltmasını durdurabilirse de iyi olurdu.

Mevcut yöntemlerimizi göz ardı etmek, diğer insanların aynı soruna nasıl yaklaştığını duymak gerçekten iyi olurdu.

özetle ...

  • Birden fazla sunucudaki dosyaları svn ile senkronize halde tutmanın en iyi yolu nedir?
  • Dosya çoğaltmayı nasıl engellemeliyiz? sembolik bağlar / başka bir şey?
  • Yeni özellikleri geliştirip eski özellikleri düzeltebilmemiz için repoumuzu nasıl yapılandırmalıyız?
  • Rollouts / rollback'leri nasıl tetiklemeliyiz?

Şimdiden teşekkürler

DÜZENLE:

Son zamanlarda bu tür görevler için Phing ve Capistrano'yu kullanma hakkında çok iyi şeyler okudum . Herkes onlar hakkında daha fazla bilgi verebilir ve bu tür bir görev için ne kadar iyi olurdu?

Yanıtlar:


6

Sürüm yayınlama konusunda tavsiyem Özellik Sürümleri ve Bakım Sürümleri'ne sahip olmaktır. Özellik Sürümleri, yeni özellikler alan sürümler olacaktır. Bunlar yıkım bagajınıza eklenir. Bunların özelliklerin tamamlandığını düşündüğünüzde, bunları bir serbest bırakma dalına yönlendirirsiniz. KG süreciniz bu sürümden memnun olduğunda, sürümü etiketlersiniz ve kodu sunucularınıza dağıtırsınız.

Şimdi, bir hata raporu aldığınızda, bu düzeltmeyi şubeye bağlar ve gövdeye taşırsınız. Düzeltilen hata sayısından memnun olduğunuzda, bir Bakım Sürümünü etiketleyebilir ve dağıtabilirsiniz.

Geliştirme kodunuzdan ayrı olan canlı kod tabanınızın bir dalına sahip olmanız (veya canlı revizyonu bilerek bir tane oluşturma yeteneğine sahip olmanız) önemlidir, böylece canlı kodunuza düzeltmeleri dağıtmanıza gerek kalmaz. yeni özellikler veya test edilmemiş kod dağıtın.

Yeni kod dağıtmak için dağıtımınızın yerel paketleme sistemini kullanmanızı öneririm. Tüm kod tabanınızı içeren bir paketiniz varsa, tüm kodunuzun bir tür atomik işlemde konuşlandırıldığını bilirsiniz, bir bakışta hangi sürümün yüklendiğini görebilir, paketler kontrol toplamınızı kullanarak kod tabanınızı doğrulayabilir. Geri alma yalnızca paketin önceden yüklenmiş sürümünü yüklemektir.

Bunu uygularken görebildiğim tek barikat, tek bir sunucuda çalışan farklı müşteriler için kod tabanının birden fazla kopyasına sahip olduğunuz gibi görünüyor. Kodunuzu, tüm müşterilerin aynı dosyaları tükettiği ve kopya kullanmaması için düzenlemeye çalışırım. Bunun sizin için ne kadar kolay olacağını bilmiyorum, ancak uğraşmanız gereken kopya sayısını azaltmak baş ağrınızı büyük ölçüde azaltacaktır.

LAMP'den bahsettiğiniz gibi, bir derleme işlemi gerektirmeyen PHP veya başka bir komut dosyası dili kullandığınızı varsayıyorum. Bu, Sürekli Entegrasyon adı verilen harika bir işlemi kaçırdığınız anlamına gelir. Bunun temel olarak anlamı, kodunuzun hala serbest bırakılabilir durumda olduğundan emin olmak için sürekli olarak test edilmesidir. Birisi yeni kodu her kontrol ettiğinde, bir işlem kodu alır ve oluşturma ve test işlemini çalıştırır. Derlenmiş bir dilde, kodun hala derlendiğinden emin olmak için genellikle bunu kullanırsınız. Her dilde, birim testleri (kodunuz test edilebilir birimlerdedir?) Ve entegrasyon testleri yapma fırsatını kullanmalısınız. Web siteleri için entegrasyon testlerini test etmek için iyi bir araç Selenyum'dur. Java sürümlerimizde, zaman içinde nasıl ilerlediğimizi görmek için kod kapsamını ve kod metriklerini de ölçüyoruz. Java için bulduğumuz en iyi CI sunucusu Hudson'dır, ancak buildbot gibi bir şey diğer diller için daha iyi çalışabilir. CI sunucunuzu kullanarak paketler oluşturabilirsiniz.


Teşekkürler. evet PHP kullanıyoruz. İtiraf etmeliyim ki, sürekli entegrasyon konusunda çok fazla değilim, ünite testine çok benzediğini biliyorum, ancak bundan daha fazlasını bilmiyorum. Birim testine meraklıyız, ancak kod tabanımızın hala birim testlere gerçekten borç vermeyen çok sayıda eski prosedür kodu var. bazı ilginç fikirler olsa da, çoğaltmayı önlemek için kodumuzun nasıl daha iyi organize edilebileceğine dair fikirlerinizi duymak iyi olur.
robjmills

sürekli entegrasyon, kelimenin tam anlamıyla her check-in'de, her saatte veya her gün otomatik test gerçekleştiriyor. Düzenli ve otomatik yaptığınız sürece, bu hemen hemen CI.
David Pashley

bugün PHP ve Phing ile birlikte hudson kullanma hakkında bu makaleyi gördüm - toptopic.wordpress.com/2009/02/26/php-and-hudson
robjmills

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.