Jenkins ile Geliştirici-Sunucu Entegrasyonu
Doruk Fişek (dfisek@ozguryazilim.com.tr)
Geliştiriciler ve Sunucular
Geliştiriciler kendi bilgisayarlarında yazılım geliştirirler
O yazılımlar sunucularda çalışır
Sunucuya yazılımın yerleştirilmesi/güncellenmesi gerekir
Geliştiricinin sorun çözebilmek için yazılımın çalıştığı ortama ve çalışırken ürettiği verilere (veritabanı, dosya, vb) ihtiyacı olur.
Geliştiricilerin Sunucuya Az Erişmesi Sorunları
Geliştiricilerin körebe oynar hale gelmeleri
Sunucuda ne olduğuna emin olamama
Tam sorunun kaynağını çözmekte zorlanmaları
Ortaya çıkan her sorunda topu sisteme atmaları
Sistem yöneticisinin peşinde sürekli gezmeleri
Yavaşlayan geliştirme ve çözüm süreci
Geliştiricinin Sunucuya "Fazla" Erişmesinin Sorunları
"Yeter ki çalışsın" stili sunucuda kirli çözüm üretme
Elle yapılan ve belgelenmeyen işlerin artması
Olası dosya sahiplik/yetki sorunları
Geliştiricilerin birbirinin ayağına basma riski
Ne kadar yetki sahibi, o kadar güvenlik riski
Jenkins - 1
Tam anlamıyla bir uşak!
"Birileri" uşağa çeşitli işler tanımlıyor.
"Bir başkaları" tanımlanan işi buyurduğunda, uşak kendisine tanımlanan işleri harfiyen yerine getiriyor.
Jenkins - 2
Uşağa emir yağdırmak için bir web arayüzü var, işler oradan tanımlanabiliyor ve başlatılabiliyor.
Kullanıcı/grup/iş yetkilendirme sistemi var. Kimin iş tanımlayabileceği, başlatabileceği kısıtlanabiliyor.
Uşak yaptıklarını sürekli not alıyor, sorunları iletiyor, yaptığı işleri saklıyor.
Java ile yazılmış, Java dünyası ile çok haşır-neşir.
Hemen her dil ve araçla entegrasyon için 800'ün üzerinde eklentisi var.
Amaç: Sürekli entegrasyon!
Jenkins Arayüzü - 1
Jenkins Arayüzü - 2
Jenkins Arayüzü - 3
Geliştirici-Sunucu Entegrasyonu
Geliştiricilerin sunucuda yapmak istedikleri işlemler sistem yöneticileri tarafından Jenkins'te tanımlanıyor (betik, eklenti, vb şekilde).
Geliştiriciler, web arayüzünden tıklayarak önceden tanımlanmış işlemleri uygulayabiliyorlar.
Uygulanan işlemlerin loglarını web üzerinden inceleyebiliyorlar.
İşlem sonucu elde edilen bir ürün varsa (bir tarball, derlenmiş kod, vs), bunu Jenkins'ten indirebiliyorlar.
Sistem yöneticileri yan gelip yatabiliyor.
Jenkins ile Yapmanın Elle Yapmaktan Farkı Ne?
İşler önceden tanımlanıyor, bir nevi belgeleme gerçekleşiyor.
İşlerin tanımının değiştirilmesinin de kaydı tutuluyor.
Bir işin gerçekleşip gerçekleşmediği, doğru yapılıp yapılmadığına ilişkin bir soru işareti kalmıyor.
İnsan hata yapar, uşak hata yapmaz!
Jenkins ile Yapmanın Konsoldan Betik Çalıştırmaktan Farkı Ne?
Geliştiriciye konsol erişimi vermek gerekmiyor.
Geliştiricinin konsol bilmesi gerekmiyor.
Geliştiricinin yapabileceği adımlar tanımlanıyor, bunun dışına çıkamıyor.
Adımlar kısıtlandığından, sistemde yetki gerektiren işlemlerde bir geliştirici yerine Jenkins'e yetki verirken daha bonkör davranılabiliyor.
Uşak asla unutmaz! (log/build tutar)
Kullanım Örnekleri
Sürüm takip sisteminden (Git, vb) kodun çekilerek el değmeden şişelenmesi
Üretilen şişelerin ilgili bir(kaç) sunucuya yerleştirilmesi (deployment)
Farklı branchlerin farklı yerlere yerleştirilebilmesi
Bir sunucudan diğerine veritabanı aktarımı (production -> test)
Kod kalitesi ölçüm uygulamasının tetiklenmesi
Uygulama sunucusunun tekrar başlatılması
Sadece geliştiriciler için değil, sistem yöneticilerine kısıtlı yaptırılacak işler de tanımlanabilir
Jenkins de Nereden Çıktı?
2004'te Sun, Hudson'ı geliştirmeye başlıyor.
2009'da Oracle Sun'ı satın alınca Hudson da Oracle'a geçiyor.
2010'da Oracle'la Hudson'ın geliştirici topluluğu kapışıyor. Hudson'ın ismini koklatmam diyor.
2011'de topluluk Hudson'ın adını Jenkins olarak değiştirip yoluna devam ediyor.
Oracle ben kendim geliştirmeye devam edeceğim diyor.
2012'de Oracle projeyi Eclipse Vakfı'na devrediyor.
Hudson vs Jenkins
Jenkins: 431 üye, 890 depo; 1 ayda 250 hata açılmış, 170 hata düzeltilmiş
Hudson: 33 üye, 82 depo; 1 ayda 0 hata açılmış, 6 hata düzeltilmiş
Diğer Benzer Araçlar
Atlassian Bamboo
Buildbot
Cruise Control
Microsoft Team Foundation Server (TFS)
Travis CI
...