Bu yazıda kısaca sürekli entegrasyon sürecini büyük kod tabanına ve yaklaşık 80 yazılımcının çalıştığı bir projede nasıl uygulandığını aktarmaya çalışacağım.
Bu tür büyük projelerde entegrasyon problemlerinin ortaya çıkma riski daha fazla. Hergün yüzlerce satır yeni kod ekleniyor . Bu eklenen kodların mevcut özelliklerde hiçbirşeyi bozmadığını ve problemlerin ortaya çıkmadığını maliyetsiz biçimde doğrulamak gerekiyor. Bu nedenle sürekli entegrasyon süreci daha fazla önem kazanıyor. Fakat bu konuda yaşanan ana sıkıntılardan biri sürekli entegrasyon kurulumlarının kod tabanının büyüklüğünden dolayı uzun sürmesi. Prensip olarak bu kurulumun azami 10 dk sınırında tutulması gerekiyor. Aksi halde insanlar kurulumun durumuna bakmadan kodları versiyon kontrole ekleyip entegrasyon problemlerine neden olabiliyorlar. Bizim projede uyguladığımız yöntem şu şekilde işliyor.
Sürekli entegrasyon kurulumunu 3 seviyede yapıyoruz.
- Hızlı kurulum
- Entegrasyon kurulumu
- Gecelik kurulum
Hızlı kurulum:
Herhangi bir kod değişikliği yapıp versiyon kontrole eklediğimizde bu değişiklik Hızlı kurulum sunucusu tarafından tespit ediliyor ve Ant script vasıtasıyla hızlı kurulum başlatılıyor. Bu kurulumun kapsamı tüm kodların derlenmesi, veritabanına değişikliklerin uygulanması(dbdeploy) ve yaklaşık 40 bin birim testinin çalıştırılması olarak özetlenebilir. Bu kurulum yaklaşık 7 dk sürüyor. Yeni bir Checkin işlemi yapmadan önce mutlaka son hızlı kurulumun sonucunun başarılı olmuş olması gerekiyor.
Eğer Hızlı kurulum başarısız olursa herkesin bilgisayarında Windows Taskbar da çalışan CCTray uygulamasındaki ikon kırmızıya dönüyor ve tüm ekip bir problem olduğunu anlıyor. Başarısız kuruluma neden olan checkin işlemini yapan kişi yaptığı değişikliği geri alıyor ve bir önceki başarılı kuruluma dönülüyor. Bu sayede diğer insanlarin checkin işlemlerini bloke etmekten kaçınılıyor.
Hızlı kurulum sonucu başarılı ise Entegrasyon kurulumu tetikleniyor.
Entegrasyon kurulumu:
Entegrasyon kurulumu Hızlı kurulumun başarılı olduğu durumda çalışmaya başlıyor.
Entegrasyon kurulumunun en büyük özelliği projenin uygulama sunucularına deploy edilmesi ve QA grubu tarafından hazırlanan bir listedeki Kabul Senaryosu testlerini çalıştırması. Bu kabul testleri uygulamayı Selenium aracını kullanarak arayüz düzeyinde test ediyor. Bu listede bulunan kabul senaryoları projenin önemli ve riskli bazı özelliklerini test ediyor.
Entegrasyon kurulumu başarısız ise buna neden olan kod değişikliği analiz edilip düzeltilmeye çalışılıyor . Hızlı kurulumdakinin aksine ekiptekiler checkin işlemi yapılabiliyor. Fakat checkin yapmadan önce başarısızlığı düzeltmeye çalışan kişilere gidip izin almak gerekiyor. Versiyon kontrole eklenecek kod değişikliğinin kurulumu bozan değişiklikten tamamen ayrı olması gerekiyor.
Gecelik kurulum
Her gece yarısı tüm ekip uyurken CruiseControl boş durmuyor. Bu kurulum tüm kodları sıfırdan derliyor, veritabanını sıfırdan oluşturuyor,birim testlerini çalıştırıyor ve uygulamayı deploy ederek binlerce kabul testi senaryosunu çalıştırıyor. Bu kurulum yaklaşık 40 dk kadar sürüyor. Kabul testlerinin çalışması sırasında arayüzde alınan hatalar o anda Desktop un resimlerini alarak kaydediliyor.
Buna ek olarak Sürekli performans denetimi için performans testleri çalıştırılıyor ve rapor oluşturuluyor. Bu sayede uygulamanın saniyede kaç sayfa sunabildiği gibi önemli metrikler güncelleniyor.
Bu pratiğin uygulanması sonucu baş ağrıtan ve çözülmesi zaman alan problemlerin önüne geçilmiş oluyor. Proje her an gerçek ortama kurulmaya hazır halde tutulabiliyor. Bu tür pratikleri uygulamayan projelerde gerçek ortama kurulumlar günler alabilirken , sürekli entegrasyon sayesinde bu süre dakikalarla ölçülüyor.
Konuya ilgi duyanlar için Martin Fowler ‘ in makalesi
http://www.martinfowler.com/articles/continuousIntegration.html
Selamlar,
Genel hatlarıyla sürekli entegrasyon’un nasıl yapılabileceği ile ilgili güzel bilgiler vermişsiniz. Özellikle CI Server’ın yapılan değişikliği algılayıp zamandan bağımsız bir şekilde deployment yapmadan sadece deployment artifact’ları (bir anlamda prebuild) oluşturan bir ant işini çalıştırması, zaten uygulandığında ve düzgün çalıştığında tadına doyulmayacak bir aksiyondur.
Fakat yazınızda üzülerek farkettiğim bir şey ise yazının bir tür case study olduğu fakat kullandığınız araçlar veya işletim sistemleri ile ilgili herhangi bir bilgi vermemiş olmanız..
Herşeye rağmen elinize sağlık, güzel bir yazı olmuş.
Kullandigimiz araclardan bazilari
CruiseControl, Subversion, Ant, JMeter, Junit, Selenium, Grinder,HttpUnit, JMock, EasyMock, HamCrest
Referanslar için teşekkür ediyorum, referanslara baktığımda CruiseControl, Subversion ve Ant’ın dışında diğer yazdıklarınız çoğunlukla “testing” ile ilgili olduğunu görüyorum.
Yazılarınızın Çevik Geliştirme ile ilgili olduğunu okuduğum kadarıyla biliyorum. Ama eğer kurumsal bir şirkette çalışıyorsanız, çoğunlukla çevik geliştirme yapabilme şansınız olmuyor, ama geliştirdiğiniz proje çevik geliştirme ile yapılmasa dahi birim testlerinin muhakkak yazılması ve uygulanması kanaatindeyim.
Cevik sureclerin kurumsal sirketlerde kullanilamadigina katilmiyorum. Dunyanin en buyuk 1000 sirketi icinde bircok cevik yontemleri kullanan sirketler mevcut. Turkiye de bu durum farkli diyorsaniz katiliyorum. Henuz cevik yontemler kabul gormuyor ve dunyayi bir adim geriden takip ediyoruz.
Evet tam olarak söylemek istediğim Türkiye’de Çevik Geliştirmenin kurumsal şirketlerde (ya da bilişim merkezli olmayan şirketlerde) rağbet görmediği. Yani biz arka planda çevik geliştirme ile ilgili birçok şeyi uygulamaya çalışıyoruz. Ama herşeyi kendi insiyatifinizle yapamadığınız zamanlarda bazı şeyleri kabul ettirmek zor oluyor.
Mesela CruiseControl ile sürekli entegrasyon yapıyorsunuz, herşey güzel, kimsenin sesi çıkmıyor. Ama PMD veya CheckStyle ile bazı kurallar getirmek istediğinizde karşınıza geçip binbir türlü bahane ile size burasının aslında bir bilişim şirketi olmadığını, geliştirme yapan arkadaşların odaklanması gereken başka şeyler olduğunu veya bu tür uygulamaların hızınızı etkileyeceğini söylüyorlar.
Son söylediğiniz gibi, henüz bu tür metodları bir adım geriden takip ediyoruz.