Jenkins Nedir? Jenkins Kurulumu ve CI/CD Süreç Örneği
12 min read

Jenkins Nedir? Jenkins Kurulumu ve CI/CD Süreç Örneği

Jenkins Nedir? Jenkins Kurulumu ve CI/CD Süreç Örneği

Jenkins, Sürekli Entegrasyon (CI / Continuous Integration) ve Sürekli Dağıtım (CD / Continuous Delivery) amacıyla Java ile yazılmış açık kaynaklı bir otomasyon aracıdır. Jenkins, yazılım projelerinizi sürekli olarak oluşturmak ve test etmek için kullanılır, bu da geliştiricilerin değişiklikleri projeye entegre etmesini ve kullanıcıların yeni bir sürüm elde etmesini kolaylaştırır. Ayrıca, çok sayıda test ve dağıtım teknolojisiyle bütünleşerek yazılımınızı sürekli olarak teslim etmenize olanak tanır.

Jenkins ile kuruluşlar, otomasyon yoluyla yazılım geliştirme sürecini hızlandırabilir. Jenkins, derleme, belgeleme, test etme, paketleme, aşama, devreye alma, statik analiz ve çok daha fazlası dahil olmak üzere her türlü geliştirme yaşam döngüsü sürecini entegre eder.

Jenkins, bünyesindeki eklentilerin yardımıyla Sürekli Entegrasyonu da başarır. Eklentiler, Çeşitli DevOps aşamalarının entegrasyonuna izin verir. Belirli bir aracı entegre etmek istiyorsanız, o araç için eklentileri yüklemeniz gerekir. Örneğin Git, Maven projesi, Amazon EC2, HTML yayıncısı vb.

Aşağıdaki resim, Jenkins’in çeşitli DevOps aşamalarını entegre ettiğini açık bir şekilde gösteriyor:

840x613

Jenkins’in avantajları şunlardır;

  • Topluluk desteğine sahip açık kaynaklı bir araçtır.
  • Yüklemek kolaydır.
  • İşinizi kolaylaştırmak için binden fazla eklentiye sahiptir. Bir eklenti yoksa, onu kodlayabilir ve toplulukla paylaşabilirsiniz.
  • Ücretsizdir
  • Java ile oluşturulmuştur ve bu nedenle tüm büyük platformlara taşınabilir.

Jenkins’i diğer Sürekli Entegrasyon aracından ayıran bazı şeyler var. O noktalara bir göz atalım;

  • Benimseme: Jenkins, dünya çapında 147.000’den fazla aktif kurulum ve 1 milyondan fazla kullanıcı ile oldukça yaygındır.
  • Eklentiler: Jenkins, geliştirme, test etme ve dağıtım araçlarının çoğuyla entegre olmasına izin veren 1.000’den fazla eklentiyle birbirine bağlıdır.

Yukarıdaki noktalardan Jenkins’e yönelik küresel olarak çok yüksek bir talebin olduğu açıktır. Jenkins’e dalmadan önce, Sürekli Entegrasyonun ne olduğunu ve neden tanıtıldığını bilmek önemlidir.

Sürekli Entegrasyon (Continuous Integration) Nedir?

Sürekli Entegrasyon, geliştiricilerin günde birkaç kez veya daha sık olarak paylaşılan bir repository’deki kaynak kodda değişiklik yapmasının gerekli olduğu bir geliştirme uygulamasıdır. Depoda yapılan her commit daha sonra build edilir. Bu, ekiplerin sorunları erken tespit etmesini sağlar. Bunun dışında, Sürekli Entegrasyon aracına bağlı olarak, derleme uygulamasını test sunucusunda dağıtmak, ilgili ekiplere derleme ve test sonuçlarını sağlamak vb. gibi başka işlevler de vardır.

Jenkins ile Sürekli Entegrasyon

Uygulamanın tam kaynak kodunun build edildiği ve ardından test için test sunucusuna yerleştirildiği bir senaryo hayal edelim. Yazılım geliştirmek için mükemmel bir yol gibi görünüyor, ancak bu işlemin birçok kusuru var. Bunları tek tek açıklamaya çalışalım:

  • Geliştiriciler, test sonuçları için eksiksiz yazılım geliştirilinceye kadar beklemek zorundadır.
  • Test sonuçlarının birden fazla hata gösterme olasılığı yüksektir. Uygulamanın tüm kaynak kodunu kontrol etmeleri gerektiğinden geliştiricilerin bu hataları bulmaları zordur.
  • Yazılım teslim sürecini yavaşlatır.
  • Yazılım kalitesinin düşebileceği için kodlama veya mimari sorunlar, build hataları, test durumu ve dosya release yüklemeleri gibi şeylerle ilgili sürekli geri bildirim eksikti.
  • Hata yapmak olasılığının yüksek olduğu tüm bu süreç manueldi.

Sadece yazılım teslim sürecinin yavaşladığı değil, yazılımın kalitesinin de düştüğü, yukarıda belirtilen sorunlardan açıkça görülmektedir. Bu da müşteri memnuniyetsizliğine yol açmaktadır. Bu nedenle, böyle bir kaosun üstesinden gelmek için, geliştiricilerin kaynak kodunda yapılan her değişiklik için sürekli olarak bir yapıyı tetikleyebileceği ve test edebileceği bir sistemin var olmasına büyük bir ihtiyaç vardı. CI’nin amacı budur. Jenkins, mevcut en olgun CI aracıdır, bu yüzden Jenkins ile Sürekli Entegrasyonun yukarıdaki eksiklikleri nasıl aştığını görelim.

İlk önce size Jenkins ile Sürekli Entegrasyonun genel bir akış şemasını açıklayacağım ve böyleyce Jenkins’in yukarıdaki eksikliklerin üstesinden nasıl geldiğini göreceğiz. Bu, Jenkins’in nasıl çalıştığını anlamanıza yardımcı olacaktır.

1344x916

Yukarıdaki diyagram aşağıdaki işlevleri göstermektedir:

  • İlk olarak, bir geliştirici kodu repository’e gönderir. Bu arada Jenkins sunucusu, değişiklikler için düzenli aralıklarla repoyu kontrol eder.
  • Bir commit gerçekleştikten kısa bir süre sonra, Jenkins sunucusu kaynak kod deposunda meydana gelen değişiklikleri algılar. Jenkins bu değişiklikleri alacak ve yeni bir build hazırlamaya başlayacak.
  • Build başarısız olursa, ilgili ekip bilgilendirilecektir.
  • Build başarılı olursa, Jenkins yerleşik test sunucusuna dağıtır.
  • Testten sonra Jenkins bir geri bildirim oluşturur ve ardından geliştiricileri derleme ve test sonuçları hakkında bilgilendirir.
  • Kaynak kodda yapılan değişiklikler için repoyu kontrol etmeye devam edecek ve tüm süreç tekrarlanmaya devam edecek.

Artık Jenkins’in geleneksel eksikliklerin üstesinden nasıl geldiğini biliyorsunuz. Aşağıdaki tablo “Jenkins Öncesi ve Sonrası” arasındaki karşılaştırmayı göstermektedir.

Jenkins ÖncesiJenkins Sonrası
Tüm kaynak kodu build alınır ve ardından test edilir. Derleme ve test hatası durumunda hataları bulmak ve düzeltmek zor ve zaman alıcıydı, bu da yazılım teslim sürecini yavaşlatır.Kaynak kodunda yapılan her commit build alınır ve test edilir. Bu nedenle, geliştiricilerin tüm kaynak kodunu kontrol etmek yerine yalnızca belirli bir işleme odaklanması gerekir. Bu, sık sık yeni yazılım sürümlerine yol açar.
Geliştiricilerin test sonuçlarını beklemesi gerekiyor.Geliştiriciler, çalışma sırasında kaynak kodda yapılan her işlemin test sonucunu bilir.
Tüm süreç manueldir.Yalnızca kaynak kodunda değişiklik yapmanız gerekir ve Jenkins sürecin geri kalanını sizin için otomatik hale getirir.

Tüm bu detaylardan sonra Jenkins kurulumu ile başlayalım.

Jenkins Kurulumu

Jenkins sunucusunu güçlü bir makineye kurmanız ileride daha hızlı ve rahat bir CI/CD süreci için iyi olacaktır. Jenkins Download sayfasına gittiğinizde LTS (latest, stabil) veya weekly sürümlerinden işletim sisteminize uygun paketi bilgisayarınıza indiriniz ve kurulumu başlatınız.

1898x884

İndirdiğimiz InstallShield ile kuruluma başlayalım. Kurulum için Java 8 veya 11 gereksinimi vardır. Java 11 SE indirmek için https://www.oracle.com/java/technologies/downloads/#java11 linkini kullanabilirsiniz. Ayrıca “Service Logon Credentials” sayfasında alacağınız “This account either does not have the privilige to logon as a service or the account was unable to be verified” hatası için Jenkins Kurulumu “Invalid Logon” Hatası ve Çözümü isimli yazımızdaki talimatları uygulamanız gerekmektedir.

618x483

Kurulumu tamamladıktan sonra 127.0.0.1:8080 adresi ile kurulumun son aşamalarını tamamlamamız gerekiyor. Öncelikle Unlock Jenkins sayfasında gösterilen dosya yolunu takip ederek ilgili metin belgesini metin editörü ile açınız ve içinde yazan parolayı kutuya yapıştırarak devam ediniz.

1920x907

Önerilen pluginsleri yüklemesini isteyelim.

1920x907

Paketlerin kurulumu kısa sürede tamamlanacaktır.

1920x907

Ardından Jenkins panele girişte kullanacağımız bir admin kullanacısı oluşturalım.

1920x907

Default adresle devam edebiliriz.

1920x907

Kurulumu tamamladık. Artık panele girebiliriz.

1920x907

Jenkins CI Senaryo Örneği Yapılandırma

Jenkins kurulumunun ardından hızlıca CI örneğimizi tanımlayalım ve test edelim. CI senaryomuzda kaynak kodlarımızın olduğu Bitbucket repositoryimize her push yapıldığında branchi locale indirecek ve kodumuzu build ederek hata olup olmadığını test edeceğiz. Hata olup olmadığını ise Bitbucket üzerinde commit’imizin yanında göstereceğiz ve bilgilendirmesini yapmış olacağız. Bu senaryoda çok basit bir Python scripti kullanarak asıl olarak Jenkins CI sürecinin işleyişini anlatmaya çalışacağız.

İlk olarak Yeni Öge bağlantısından süreci oluşturmaya başlayalım.

1885x857

Serbest-stil yazılım projesi yapılandır seçeneği ile bir isim belirleyerek ilerleyelim.

1895x732

General sekmesinde description belirliyoruz.

1899x723

Kaynak Kodu Yönetimi sekmesinde ise VCS (Version Control Sytem) butonlarından Git‘i seçelim ve Bitbucket repository adresimizi ekleyelim. Branches to build alanından build alacağımız branch adını yazalım. Son olarak ise Credentials alanındaki Add butonu ile Bitbucket hesap bilgilerimizi ekleyelim.

1898x1218

Bitbucket kullanıcı adı ve şifremizi yazarak kaydedelim.

1898x1132

Yapılandırma tetikleyiciler sekmesinden repoya her push yapıldığında Jenkinsin CI sürecini başlatacağı kutucuğu işaretleyelim.

1897x512

Yapılandırma ortamı sekmesinde yer alan Yapılandırma adımı ekle diyerek sürece yeni bir iş kaydı oluşturacağız. Bunun için Windows batch komutu çalıştırı seçelim.

1896x795

Yapılandırma ortamına eklenen Windows batch komutu çalıştır kutucuğuna artık çalışmasını istediğimiz komutu yazabiliriz. Burada ben python scriptimi test verisiyle çalıştırarak başarılı bir şekilde sonlanıp sonlanmadığını kontrol etmek istiyorum. Bu adımda istediğiniz kadar yapılandırma adımı ekleyebilirsiniz. Son olarak ise Kaydet butonuyla yapılandırmamızı tamamlayalım.

1887x800

Jenkins ve Bitbucket Entegrasyonu

Jenkins tarafında işi oluşturduktan sonra yine Jenkins üzerinde bir webhook oluşturmamız gerekmektedir. Ardından Bitbucket repomuza giderek her push yapıldığında Jenkins üzerinde açtığımız webhooka haber verdirmeliyiz. Ve son olarakta jenkinsteki sonuçları yine Bitbucket repomuza yansıtacak consumer oluşturmalıyız. öyleyse hemen başlayalım;

İlk olarak Jenkins panelden sol menüde yer alan Jenkins’i Yönet‘e tıklayalım.

1896x470

Açılan sayfadan da Eklentileri Yönet seçeneğine tıklayalım.

1897x359

Kullanılabilir sekmesine gelerek arama kutusuna Bitbucket yazalım ve Bitbucket ile Bitbucket Build Status Notifier Plugin eklentilerini seçtikten sonra Download now and install after restart butonuna tıklayıp kurulumu başlatalım.

1582x658

İndirme ve kurulum başladığında yeniden başlatma sonrası aktif olacak eklentiler için en alttaki kutucuğu seçerek Jenkins’in kurulum sonrası restart olmasını sağlıyoruz.

1584x343

Gerekli eklentileri kurduktan sonra Bitbucket repository sayfamıza gidelim ve Repository Settings menüsüne tıklayalım.

1920x574

Sol menüden Webhooks sayfasına gidelim ve Add Webhook butonuna tıklayalım.

1920x743

Bu sayfada Webhook detaylarını giriyoruz. URL kısmına [Jenkins url adresimiz]+"/bitbucket-hook/" girmeliyiz. "/bitbucket-hook/" kısmı kurduğumuz eklentiden geliyor. Fakat Jenkinsi bilgisayara kurduysanız (benim gibi), Bitbucket web üzerinden localhost adresinizle erişemeyeceğiniz için localhost:8080 adresinizi port forwarding veya tunneling ile internete açmalısınız. Bunu NGROK Kurulumu ve Localhostu İnternete Açmak isimli yazımızdaki yöntemle kolaylıkla halledebilirsiniz. Son olarak ise hangi durumlarda webhook adresine bildirim gitmeliyi seçiyoruz. Ben sadece push yapıldığında seçtim fakat burada özgürsünüz.

1898x907

Şimdi ise Jenkins sonuçlarını Bitbucket’a atacak Consumer’i ayarlayalım. Bunun için Bitbucket üzerinden önce sol alttaki profil fotoğrafınıza, sonra ise All workspaces linkine tıklayınız.

1920x363

Kullanacağınız Workspace için Manage linkine tıklayınız.

1920x365

Sol menüden Oauth consumers sayfasına gittikten sonra Add consumer butonuna tıklayalım.

1920x717

Consumer ayarlarken Callback URL için Jenkins URL adresinizi yazınız ve This is private consumer ile Repositories bölümündeki Read / Write kutucuklarını işaretleyiniz.

1898x1573

Artık consumer için key ve secret textlere sahibiz.

1920x483

Bu keyleri eklemek için Jenkinse dönelim ve Jenkins’i Yönet sayfasından Sistem Konfigürasyonunu Değiştir sayfasına gidelim.

1897x359

Sayfanın en altındaki Bitbucket Build Status Notifier Plugin alanından Add butonuna tıklayalım.

1899x286

Açılan pencereden Username with password seçeneği ile aldığımız key ve secret textlerini girelim.

1920x728

Ardından konfigürasyonu kaydedelim.

Jenkins CI Testi

Gerekli entegrasyonları da tamamladıktan sonra kaynak kodumuzda değişiklik yaparak neler olacağını izleyebiliriz. Bunun için ilk olarak repomuza gidelim ve kodda küçük bir düzenleme yapıp commitleyelim. Ben ünlem sayısını sadece bir artıracağım ve commitleyeceğim.

1920x780

Neler olduğunu görüntülemek için Jenkins panele gidelim ve tanımladığımız iş başlığına tıklayarak içine girelim.

1896x409

Kod çok basit ve küçük olduğu için biz girene kadar tamamlanmış ama siz girdiğinizde halen devam ediyor yazabilir. Sol menüden veya hemen karşımızda duran bağlantılardan birine tıkladığımızda build durumunu detaylarıyla beraber görebileceğiz.

1901x837

Yazan bilgilere göre build başarılı geçmiş ve 2,3sn sürmüş. Build esnasındaki terminal çıktılarınıda kontrol etmek istersek Console Output sayfasına gitmeliyiz.

1920x609

Terminal çıktılarından da gördüğümüz gibi Jenkins önce seçtiğimiz branchi checkout ederek locale indiriyor ve mevcut branch üzerinde verdiğimiz komutu çalıştırıyor ve komut başarılı çalıştığı için Exit 0 döndürüyor. Bu da sürecin SUCCESS olarak işaretlenmesini sağlıyor.

1920x907

Hazır bu aşamadayken bir de FAIL edeceği bir build aldıralım. Bunun için kodumuzda bir hata yapalım ve commitleyeyim.

1920x779

Jenkins’te durumlarına baktığımızda hatalı olduğunu görebiliyoruz. Yapılandırma detayına girelim.

1900x852

Detay sayfasına göz attıktan sonra terminal çıktıları için Console output linkine tıklayalım.

1920x639

Çıktıda göreceğimiz gibi kodumuz hata verdiği için Exit 1 ile FAILED olarak sonlandı ve buildimiz hatalı olarak işaretlendi.

1894x835

Son olarak Bitbucket sayfamıza gidelim ve bu Success ve Failure durumlarını orada da görüp göremediğimizi kontrol edelim. bunun için repositorye girdikten sonra menüden Commits sayfasına gidiniz ve commitlerimizin Builds sütununu kontrol ediniz.

1920x631

Reponun Source sayfasında da güncel build durumunu görebilir ve bağlantıya tıklayarak detaylarına erişebiliriz.

1920x636

Jenkins CD Süreci

Buraya kadar olan bölümde (CI / Continuous Integration) sürecini gördük. Sürekli Dağıtım (CD / Continuous Delivery) sürecini de başarılı bir build sonrası buildimizi test veya istediğimiz bir ortama koymakla elde edilebilir. Bunun için yapılandırma adımı ekleme aşamasında build komutumuzdan sonra başarılı olması durumunda SCP, FTP gibi konsol komutlarıyla veya Docker image alıp local repoya yükleyecek şekilde süreci genişletebiliriz. Bu örneği de yakında sizlere sunmuş olacağız.

Sonuç

Jenkins ile yeni çalışmaya başlayacaklar için oldukça basit bir örnekle iş sürecimizin ne kadar kolaylaştığını, otomatikleştiğini ve hata yapmanın minimize edildiğini göstermek istedik. Sorularınızı ve geri dönüşlerinizi aşağıdaki yorum kutusuna yazabilirsiniz. Bir sonraki yazımızda görüşmek üzere sağlıcakla kalın.