Sunday, August 12, 2007

Hudson ile Sürekli Entegrasyon

Sürekli Entegrasyon (Continuous Integration) konusu herkesin dikkatlice üzerinde durması gereken hayati bir konudur. Geliştirdiğiniz proje eğer Agile Development tarzında bir proje ise sürekli entegrasyon daha bir önemli hale gelir. Çünkü bulunduğu yer, developer ile client arasında, proje için olmazsa olmaz bir pozisyon olacaktır.

Sürekli entegrasyonu sağlamak adına en çok kullanılan araç CruiseControl'dür... Biz de açıkçası projemizde yaklaşık 3 yıldır CruiseControl kullanıyoruz. Ama bu yazıda size birçok açıdan daha avantajlı, kullanımı kolay başka bir araç olan Hudson'dan bahsedeceğim.

Hudson'ın en göze çarpan ve beni bu yazıyı yazmaya iten özelliği kurulumunun ve hayata geçirilmesinin çok kolay olması. Yani sadece bir web server üzerine deploy etmeniz çalışmaya başlamanız için yeterli. Bu yazıda basitçe hudson'ı Tomcat üzerinde nasıl hayata geçireceğimizi ve yapılabilecek bazı ayarları anlatmaya çalışacağım.

Kurulum

Çalışan bir Tomcat'e (5.0 ve üstü) sahip olduğunuza emin olduktan sonra, hudson'ı bu linke tıklayarak indirmeniz gerekiyor. Aynı Tomcat üzerine birden fazla hudson çalıştırmak isteyebilirsiniz, farklı iş türlerini gruplamak için olabilir, her ne kadar hudson'ın tab sistemi buna benzer bir yapıya sahip olsa da, gruplamanın dışında CI Server'ı restart, redeploy etmeniz gerekebilir. Bu durumda yapmanız gereken iki iş var

  • hudson.war dosyasının ismini değiştirmeniz,
  • Değiştirdiğiniz war dosyasının web.xml'ini açıp HUDSON_HOME değişkenine bir değer atamanız gerekiyor.
Bu şekilde birden fazla hudson'ı aynı Tomcat üzerinde çalıştırabilirsiniz.

Konfigürasyon ve Püf Noktaları

Eğer hudson'ı kapsamlı bir projede kullanacaksanız, Tomcat üzerine hudson'dan başka bir uygulama deploy etmeyin, böylece Tomcat'in JVM ayarlarını hudson için özel olarak ayarlayabilirsiniz.

Güvenlik : Hudson ile ilgili yapabileceğiniz önemli konfigürasyon ayarlarından bir tanesi de güvenlik ile ilgili olan ayardır. Her ne kadar çok gelişmiş bir güvenlik sistemi olmasa da, hudson'a yapacağınız birkaç ayar ile developer'ların job'ları (Hudson içerisinde iş için kullanılan kavram) sadece görebilme ya da konfigüre edebilme yetkisine sahip olabilmesini sağlayabilirsiniz. Bunun için sırasıyla

  • Tomcat üzerinde hudson'ı yönetebilmesini istediğiniz kullanıcıları tanımlayın ve bunları "admin" rolü ile bağlayın
  • Son olarak hudson'ın web sayfasını kullanarak Manage Hudson >> System Configuration linkini kullanın ve Enable Security kısmını tikleyin.
Hudson default olarak güvenlik opsiyonu açık bir şekilde gelir (herkes herşeyi yapabilir), yukarıdaki ayarları yaptığınızda sadece sizin hudson rolüne uygun görüp tanımladığınız kullanıcılar job'ları çalıştırabilir/konfigüre edebilir veya hudson'ı konfigüre edebilir, diğerleri sadece job'ların ne durumda olduğunu görebilir. Daha çok bilgi için buraya tıklayın.

Yedekleme : Hudson'ı yedeklemek istiyorsanız yapmanız gereken sadece web.xml içerisinde HUDSON_HOME klasörü için belirlediğiniz klasörü yedeklemektir. HUDSON_HOME>jobs klasörü altında bulunan tüm klasörler birer job'dır, bu job'ları kopyala/yapıştır ile başka hudson'lara aktarabilirsiniz.

Haydi işe koyulalım...

Konfigürasyon ayarlarını kurcaladıktan sonra sıra geldi birşeyler üretmeye. Daha önce de belirttiğim gibi hudson kurulumu ve yönetimi kolay bir sürekli entegrasyon aracı. Bunun en iyi örneğini job tanımlama ve yönetme esnasında görebilirsiniz. Hudson ana sayfasında New Job linkine tıkladığınızda 4 değişik job türü yapabilme ve bir tane de varolan bir job'ı kopyalayabilme opsiyonunu göreceksiniz. Bu job türleri kısaca

Maven2 : Maven2 ile geliştirdiğiniz projelerinizi kolayca entegre edebilirsiniz.
Matrix Build : Aynı sürümü birden fazla ortamda birden fazla parametre ile denemek isterseniz.
External Job Monitoring : Sistemde çalışan cron job'ları da takip edebileceğiniz kullanışlı bir job
Free-Style Software : Ayarlarını istediğiniz gibi değiştirebileceğiniz job tipi, benim üzerinde duracağım job da bu.

Free-Style Software'i seçtiğinizde karşınıza bir sürü ayar çıkacak, bunlardan birkaç tanesini anlatmaya çalışacağım, diğerlerini yanlarında bulunan soru işareti ikonuna tıklayarak siz bulabilirsiniz. Build kısmında shell, windows bat, ant build veya maven build'leri çalıştırabilirsiniz. Ant scriptlerini çalıştırmak için Build kısmında invoke top-level Ant targets'ı seçmeniz ve Targets kısmına ant'a girdiğiniz parametreleri yazmanız gerekiyor (mesela ant -f build_deneme.xml için targets kısmına -f build_deneme.xml yazmanız gerekir) Bunu yaptığınız zaman job'ınız bu scriptinizi çalıştıracak durumda beklemeye başlar. Bundan sonra job'lar kısmında bu projenizi göreceksiniz. Yanında "Schedule a build" ikonu ile birlikte.

Sürekli Sürüm (Gecelik, Saatlik)

Ama asıl önemli olan bunu nasıl zamanlanmış iş olarak ayarlayıp, gecelik sürüm, saatlik sürüm haline getirebileceğinizdir. Hudson burada da işimizi çok kolaylaştırıyor. Build Triggers kısmında Build Periodically kısmına tıkladığımızda önümüze free text bir alan açılıyor (Schedule). Buraya yazacağınız syntax ile birlikte bu job'ı zamanlanmış hale getirebilirsiniz. Yan yana yazılan 5 alan bize zamanlama yapma olanağı verir.

MINUTE(Dakika) HOUR(Saat) DOM(Gün) MONTH(Ay) DOW(Haftanın Günü)


Bu alanlar sırasıyla

Dakika : 0-59
Saat : 0-23
Gün : 1-31
Ay : 1-12
Haftanın Günü : 1-7


Mesela her gece saat 21:00'de çalıştır diyebilirsiniz,

0 21 * * *

veya hem gece saat 21:00'de hem de pazartesi-çarşamba öğleden sonra çalıştır diyebilirsiniz,

0 21 * * *
30 12 * * 1,3


Ya da sadece pazartesi akşam 18:00'de çalıştır diyebilirsiniz.

0 18 * * 1

Bahsettiğim ayarları yaptığınızda artık sürekli sürüm sistemine sahip olmuş oluyorsunuz. Bunun yanında isterseniz sürümü manuel de başlatabilirsiniz.

Bunların yanında hudson'ın bize sunduğu daha bir dolu özellik var. Bunlardan biri de plugin ekleyebilme özelliği. Şu anda JIRA, FindBugs gibi önemli olabilecek pluginlerin yanında irili ufaklı bir sürü plugin var ve geliştiriliyor. Pluginleri bu linkte bulabilirsiniz. Bu pluginlerle birlikte sürüm ve entegrasyon sisteminizi daha güçlü ve daha efektif hale getirebilirsiniz.

Ölçek farketmeksizin; eğer sürüm sisteminizi, bir issue tracking tool'u ve file versioning system ile entegre ederseniz , hatırı sayılır bir sisteme sahip olursunuz.

0 comments: