Jenkins nedir? Mac OS X’de Jenkins Kurulumu ve Yapılandırma

continuous integrationContinuous Integration (kısaltması CI) Türkçe manası ile “Sürekli Entegrasyon” anlamına gelmektedir. CI araçlarının esas amacı bir yazılım projesine birden fazla developer geliştirme yapıyorsa; geliştirilen iş paketlerinin belli aralıklarla ana projeye entegre olmasını sağlamaktır.

Daha açık ve somut bir örnekle şöyle açıklayabiliriz:
Bir yazılım projesi üzerine kod yazan bir ekibiniz var. Projenizde bir versiyon kontrol sistemi (VCS) kullanıyorsunuz (Github, Bitbucket, vs.). Yazılım ekibi iş paketlerini tamamladıkça  çalışmalarını versiyon kontrol sistemi sunucusuna gönderiyor (commit, push). Bu versiyon kontrol sistemi ile senkron çalışan bir CI aracınız var. Yazılım ekibi tarafından VCS sunucularına yeni bir paket geldiği anda CI sunucunuz tetiklenir ve sizin belirlediğiniz bir takım işlevleri yerine getirir. Ne gibi? Tamamlanmış iş paketlerini çek (pull), derle (build), bildirim gönder (notification) ve yayınla (deploy). Tamamen hayal gücünüz ile sınırlı!

 

jenkins-logo

 Jenkins nedir?

Jenkins Java dili geliştirilmiş, açık kaynak kodlu (open source) bir CI aracıdır ve Jenkins için yazılmış yüzlerce eklenti (plug-in) vardır. Jenkins’i bir otomasyon (automation) yazılımı olarak düşünebiliriz.

Jenkins Kurulumu (Mac OS X)

Jenkins kurulum dosyasını (pkg) indirelim ve kuralım:
https://jenkins-ci.org/content/thank-you-downloading-os-x-installer/

Diğer işletim sistemlerinde kurulum için bağlantıyı inceleyebilirsiniz:

https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins

Kurulum tamamlandıktan sonra http://localhost:8080/ adresine tıklayarak Jenkins anasayfasına (dashboard) erişebilirsiniz.

Jenkins Güvenliği

Kurulumdan sonra ilk adım olarak:

bölümünden kullanıcı ekleyin. Ekleyeceğiniz ilk kullanıcı tam yetkili olsun. Dilerseniz sonraki ekleyeceğiniz kullanıcılar için özel izinler belirleyebilirsiniz (ACL). Kullanıcı tanımlama işlemini tamamladıktan sonra oturum güvenliğini aktifleştirin:

 Not: Jenkins otomatik olarak tarayıcının diline göre arayüzünü sunar. Türkçe dil desteği çok iyi olmadığı için; ingilizce kullanmanızı tavsiye ediyorum. Bunun için Chrome’un varsayılan (birincil) dilini ingilizce yapmanız yeterlidir.

Jenkins Bitbucket Plug-in Eklentisi Kurmak

Jenkins için geliştirilmiş yüzlerce plug-in’den birisi olan Bitbucket eklentimizi kuralım.

Öncelikle yukarıdaki menüye ulaşıp, üst bölümdeki “Filter” kutusuna “Bitbucket” yazalım ve çıkan sonuçlardan “Bitbucket Plugin” i seçip kuralım. (Wiki sayfası: https://wiki.jenkins-ci.org/display/JENKINS/BitBucket+Plugin)

 Jenkins Görevi Oluşturmak

Jenkins’de yeni kullanıcımız ile oturum açtıktan sonra anasayfada iken sol menüden New Item’ı tıklayınız. Gelen ekranda “Item name” bir isim yazıp aşağıdaki seçeneklerden “Freestyle project” i seçip, ilerleyin. Sonraki ekranda karşınıza konfigürasyon ekranı gelecek.

Sırasıyla:

kutucuklarını işaretleyelim.

Ayrıca “Trigger builds remotely” kutucuğunu işaretledikten sonra açılan “Authentication Token” kutusuna bir token bilgisi girelim. Bu, eklemiş olduğumuz görevin özel Token’ı olacak ve örnek gösterilen URL’ye manuel yapılan istekle de dilersek trigger yapabileceğiz.

Build Triggers seçeneğinden anlaşılacağı üzere BitBucket’a bir değişiklik gönderildiğinde (push yapıldığında) bu görevin çalışmasını istiyoruz.

Ve en önemli 2 bölüm: Build ve Post-build Actions.

Build
Bu görev çalıştığı zaman neler yapılacağını içerir ve aşağıdaki “Execute shell” başlığı altındaki “command” bölümüne konsol komutlarınızı yazmanız gerekmektedir.

Yukarıdaki örneğimizden yola çıkacak olursak, yeni bir paket geldiğinde (push), ilgili proje değişiklikleri çeksin (pull).

Command:

Görmüş olduğunuz gibi “Command” kutusuna dilediğiniz işlevleri gerçekleştirecek komutları yazabilir, daha önceden hazırlamış olduğunuz bash script’lerinizi çalıştırabilirsiniz. Tamamen hayal gücü ve kabiliyetinizle sınırlı diyebilirim. İhtiyacınız ne ise; ona özgü bir çözüm üretmeniz için Jenkins hazır kıta bekliyor olacak.

Post-Build Actions
Bu bölümde ise üstteki “Build” çalıştıktan sonra yapılması istenen sonraki görevi seçiyorsunuz: Örneğin e-posta gönder, ayrıntılı log dosyasını kaydet ya da bir sonraki projeye geç ve onu paketle, gibi…

Tüm konfigürasyonlar tamamsa Save‘e tıklayın ve kaydedin.

Atlassian_Bitbucket_Logo
Bitbucket Ayarları ve Trigger

Jenkins’e görevi verdik. Artık tetiklendiği anda ilgili klasöre gidip, önceden tanımlanmış olan (init) Bitbucket repository’sini çekmeye hazır. Şimdi sırada Bitbucket’a bir gönderim geldiğinde (push), Bitbucket’in Jenkins’e bildirimde bulunmasını yapmasını sağlamak.

Jenkins User API Token
Öncelikle Jenkins kullanıcımız için bir API Token almamız gerekiyor. Bunun için:

bölümüne erişip; API TOKEN başlığı altında “Show API Token” a tıklayarak User ID ve API Token bilgilerini not edin. (API Token yok ise “Change API Token” butonu ile oluşturabilirsiniz.) Save edip, ana ekrana dönebilirsiniz.

Bitbucket Repository Services (Hook)
Bitbucket’da repository’imizi seçip; “Settings” bölümünden “Services” a tıklayalım.

“Select a Service”  a tıklayıp Jenkins’i seçin ve “Add service” tuşuna basın.

Açılan kutucukta “Csrf Enabled” işaretsiz kalıyor. Ve sırasıyla:

 Modem Port Yönlendirmesi
Bir router arkasındaysanız internete çıktığınız ip adresinin 8080 portuna gelen istekleri, modem kontrol panelinden Jenkins’in kurulu olduğu sunucuya yönlendirmeyi unutmayın.

Uçuşa Hazır

Artık Bitbucket ile entegre çalışan Jenkins CI sunucumuz hazır. İlgili repository’e bir commit push edin ve Jenkins dashboard’unda Build’i izleyin. :) Bir hata ile karşılaşılırsa “Console Output” dan log kaydına bakabilirsiniz.

Önemli Notlar

  • Jenkins kurulduktan sonra Mac OS’da “jenkins” isminde ve “everyone” kullanıcı grubuna ait bir kullanıcı eklenir. Buradan çıkan sonuç, yeni oluşturulan “jenkins” kullanıcısı mevcut Mac OS oturumunuzdaki admin hesabınızla erişebildiğiniz tüm servislere doğrudan erişemeyebilir. (git, gem, vs.) Bunun için gerekli izinleri kurgulamak biraz vaktinizi alabilir.
  • Jenkins ile command kutucuğundan “git” işlemleri yapmak için jenkins kullanıcısının home dizininde (/Users/Shared/Jenkins/Home/) bir ssh-key oluşturup; bitbucket’daki kullanıcınıza bu key’i eklemeniz gerekmektedir. Ayrıca .git/config dosyası içerisindeki https repository’yi, ssh modeline çevirmelisiniz.Örnek config dosyası:
  • Güvenlik için jenkins kullanıcısının tüm sistem işlevlerini rahatlıkla kullanması için “admin” grubuna terfi ettirmeyip, izinleri mutlaka kontrollü bir şekilde belirlemelisiniz.
  • Jenkins’in kurulu olduğu sunucunun bulunduğu ağda bir güvenlik duvarınız varsa Bitbucket bildirim sunucularının ip adreslerini white list’e ekleyebilirsiniz.
    Ip Adresleri:
  • Bitbucket’da SSH ile çalışma modeli için aşağıdaki bağlantıları inceleyebilirsiniz:
    https://confluence.atlassian.com/bitbucket/set-up-ssh-for-git-728138079.html
    https://confluence.atlassian.com/bitbucket/troubleshoot-ssh-issues-271943403.html
  • Bitbucket’dan gelen her commit ve push için trigger etmeyebilirsiniz. Dilerseniz bitbucket’tan yanlızca approved pull request’lerden sonra tetikle vs. gibi özel işlevler hazırlayabilirsiniz. Kurgu tamamen size kalmış.
  • Jenkins Plug-in Listesi için:
    https://wiki.jenkins-ci.org/display/JENKINS/Plugins
  • İhtiyaç duyulabilecek olan Mac OS Terminal Komutları

    Son Söz
    Ana hatları Continuous Integration ve Jenkins kurgusundan bahsetmeye çalıştım. Tüm başlıkları daha detaylı bir şekilde anlatmak isterdim; fakat kısa zamana ancak bu kadarını sığdırabildim. Belki yakın zamanda bu konuyla ilgili bir webinar hazırlayabilirim.

    Faydalı olması dileklerimle… :)

    Kaynaklar

  • https://jenkins-ci.org/
  • https://wiki.jenkins-ci.org/display/JENKINS/Meet+Jenkins