Yazılım şirketleri geliştirme süreçlerini iyileştirmek ve daha verimli hale getirmek için kıyasıya bir yarış içindeler. Şirketler, rekabet avantajı sağlamak için sürekli yeni gelişmelere adapte olmak zorundalar. Bu hızlı gelişme ve adaptasyon ihtiyacı, sürekli entegrasyon (CI), sürekli teslimat (CD) derken daha bütüncül bir yaklaşım olan DevOps kültürü ve felsefesini ortaya çıkarmıştır.
DevOps felsefesi öncü teknoloji şirketleri tarafından yoğun bir şekilde kullanılmaktadır. Bu yaklaşımların merkezinde de bazı araçların kullanımı önem taşımaktadır. Jenkins bu araçlar içerisinde en çok kullanılan ve popüler olanıdır.
Yazının sonunda Jenkins’i anlamak için öğrenmemiz gereken kavramlarla birlikte küçük bir demo da yapmış olacağım. Hepsinden önemlisi Jenkins büyük resim içerisinde nereye düşüyor, nasıl bir yer işgal ediyor onu anlamış olacaksın.
Jenkins Nedir?
Jenkins java ile yazılmış açık kaynak kodlu bir otomasyon sunucusudur. Yazılım geliştirme süreçlerini otomatize etmenize yarar.
2005 yılında Sun Microsystems’te çalışan bir geliştirici olan Kohsuke Kawaguchi tarafından Hudson isimli bir CI aracı geliştiriliyor. 2009 yılında Oracle’ın Sun’ı satın almasıyla birlikte, geliştiriciler ve Oracle arasında çıkan anlaşmazlıklar neticesinde, geliştiriciler, Hudson kodunu alarak farklı bir proje oluşturuyorlar. Böylece Jenkins ortaya çıkmış oldu.
Kodu yazarız, tamam olduğunu düşündüğümüzde, commit ederiz. Jenkins bu noktada devreye girerek, kodu otomatik olarak derler, varsa testleri çalıştırır. Kod ile ilgili problemler varsa en basitinden derlenmiyorsa, kod standartlarına aykırı bir durum varsa veya yazdığımız testler hata veriyorsa bize sonucunu gösterir ve mail atması sağlanır.
Bahsettiğim şey aslında sürekli entegrasyon (continuous integration) mevzusudur. Bu kavramı sıklıkla duyuyoruz. İngilizce kısaltması CI olan sürekli entegrasyon yabancı kaynaklarda karşılaşılan ve sürekli gündemde olan bir konu olması itibariyle bahsetmekte fayda var.
Sürekli Entegrasyon (Continuous Integration – CI)
Sürekli entegrasyon, geliştiricilerin kodlarını periodik olarak ortak bir yere (depo – repository) işlemesi, bununla birlikte bir araç tarafından otomatik olarak derlenmesi ve kalitesinin denetlenmesidir. Böylece hatalı bir durum varsa hemen ortaya çıkarılmasıdır.
Unutmamanız gereken en önemli şey, sürekli entegrasyonun en büyük amacının hataların hızlı bir şekilde ortaya çıkarılmasıdır.
Hatalar içerisinde derleme hataları olabilir, başarısız (birim, arayüz, entegrasyon) testler olabilir veya statik kod analizinde ortaya çıkan eksiklikler olabilir.
Referans: https://www.thoughtworks.com/continuous-integration
Jenkins, dünyada en çok kullanılan CI aracıdır.
Başlıklar halinde ifade etmem gerekirse, Jenkins’i şu sebeplerle kullanırız:
- Projenizi derlemek için
- Otomatik olarak testlerin çalışmasını sağlamak, böylece hataları en kısa zamanda teşhis edip, zamanında müdahale etmek
- Statik kod analizi yapmak
- Teslimat (Deployment) için
Jenkins’in asıl kullanım amacı sürekli entegrasyondur. Fakat başlıklar içerisinde belirttiğim teslimat (delivery) işi için de kullanabiliriz.
Bu durumda Sürekli Teslimat (Continuous Delivery – CD) mevzusuna dokunmuş oluruz.
Sürekli Teslimat (Continuous Delivery – CD)
Kodun her an kurulumunun yapılabilir halde olmasını sağlamak diye tarif edebiliriz.
Bu pratiği uygulamak için, canlı ortama benzer bir staging ortamına, yazılımın periyodik olarak sürekli dağıtımının yapılması gerekmektedir.
Sürekli teslimat pratiğini, kodun sağlıklı, çalışabilir bir düzeyde olduğunun sağlanması olarak görebiliriz. CD sürecinin, sürekli entegrasyondan daha kapsamlı testlerden ve adımlardan oluştuğunu görebiliriz.
Jenkins Hangi Geliştirme Ortamlarını ve Dillerini Destekliyor
Aklınıza gelebilecek her geliştirme dilini ve ortamını destekliyor.
Peki bu kadar geniş bir desteği nasıl verebiliyor?
Jenkins’te bulunan binlerce eklenti sayesinde, dilediğiniz geliştirme ortamı için CI sürecini kurgulayabilirsiniz.
Örnek Kod Oluşturma Biçimlerinden Bahsetmek Gerekirse:
- Java Projesini maven ile oluşturma
- NodeJs üzerinde çalışan bir react uygulaması oluşturmak
- Python dili ile yazılmış bir projeyi pyinstaller ile oluşturmak
- dotnet core projesini komut satırı aracılığıyla derleyip yayınlamak
Jenkins Hangi Ortamlarda Çalışıyor?
Jenkins sunucusu, windows, linux ve macOS bilgisayarlarda sorunsuz bir şekilde çalışmaktadır.
Unix türevi bilgisayarlarda da çalışması ile ilgili herhangi bir problem yok.
Jenkins Dünyasında Geçen Temel Kavramlar
Node
Node, jenkins prosesinin üzerinde çalıştığı sunucuyu ifade ediyor.
Pipeline
Pipeline ise, işlerin ardışık bir sırada yapılması, bir işlemin çıktısının sonraki gelen işlemin girdisi olması anlamına gelmektedir.
Fabrikadaki üretim bantlarını aklımıza getirelim. Üretilen eşya, hattın içerisinde farklı duraklara gelir. Her durakta bir işlem görür ve sonraki aşamaya geçer.
Stage
Pipeline içerisinde yer alan fazları ifade eder. Örneğin standart bir yazılım projesinde build -> test -> deploy adımlarından her birisi bir fazı ifade eder.
Step
Stage içerisinde yer alan adımları ifade eder.
Jenkins üzerinde kodumuzun geçtiği aşamaları düşünelim:
Build -> Test -> Deployment
Build (derleme) aşamasını bir evre (stage) olarak düşünelim. Test evresi de sonraki evre. Deployment evresi de en son çalışacak evre olarak düşünelim. Bu işlemler Jenkins üzerinde ardışık bir sırada çalışmaktadır.
Build işlemi hatalı olursa, yani kodumuz derlenmez ise, sonraki evreye geçmeyecektir. Aynı şekilde test safhasında hata oluşursa, deployment işlemi gerçekleşmeyecektir.
Pipeline mantığı bu şekilde çalışmaktadır.
Pipeline Nasıl Tanımlanır?
Jenkins Pipeline tanımı JenkinsFile isminde bir dosyaya yazılır.
İki türlü tanımlama şekli var: Declarative, Scripted
Bu iki tür pipeline yazım şeklinden declarative olanı sonradan gelmiş ve daha gelişmiş olanıdır.
Resmi Jenkins dokümanlarında tavsiye edilen yöntem declarative tanımlamadır.
Scripted tanımlamada groovy kullanılarak yapılır. Declarative tanımlama tavsiye edilmesine rağmen, scripted tanımlama ile herhangi bir kısıtlama olmadan herşeyi yapabiliyorsunuz.
Scripted tanımlama bize daha esnek bir tanımlama imkanı sunuyor. İkisini de tercih edebilirsiniz.
Başlangıç düzeyindeki kişiler için ise, declarative tanımlama daha basit ve uygun olacaktır.
Kurulumu
Jenkins servisini setup dosyasını indirerek kurabilirsiniz. Jenkins servisini docker image üzerinden çalıştırabilirsiniz. İki türlü şekilde de servisi kurup çalıştırabilirsiniz.
Windows için olan kurulum dosyasını (zip) açıp çalıştıralım, kurulum tamamlandıktan sonra tarayıcımız ile localhost:8080 adresine bağlanarak, ayarları yapalım:
Jenkins’in kilidini açmak için gösterdiği adresten şifreyi kopyalayıp girişini yapın. Jenkins’in onlarca geliştirme ortamını desteklemesi, eklentiler sayesinde olduğunu söylemiştik.
Önerilen eklentileri tercih edebilir ya da hangi eklentilerin kurulacağına kendimiz karar verebiliriz.
İkincisini tercih edelim:
Uygun gördüğümüz eklentileri kurduktan sonra, artık install düğmesine tıklayabiliriz.
Eklentiler kurulduktan sonra yönetici tanımlama ekranı karşımıza gelecektir:
Kaydedip devam edin ve yönetim paneli ile ilgili url ayarını yapın:
Bu işlem ile birlikte artık Jenkins kurulum ve ayarları tamamlanmış oldu.
Jenkins Docker Desteği
Jenkins’in gelişen container teknolojinerine de adapte olduğunu görebilirsin. Sürekli entegrasyon sürecini tamamen docker üzerinden de geliştirebilirsiniz. Güzel olan haber, Jenkins’in docker teknolojisine tam desteği var.
Yönetim Paneli
Kurulum tamamlandıktan sonra Jenkins ile ilgili ayarlarınızı yönetim paneli üzerinden yapabilirsin.
http://localhost:8080 adresinden Jenkins yönetim paneline bağlanabilirsiniz.
Jenkins iki farklı yönetim paneli ile birlikte kullanılabilir. Classic UI ve Blue Ocean.
Classic UI: Eskiden beri aktif olarak kullanılan arayüz. Demode ve eski bir tasarıma sahip olduğunu söyleyelim.
Blue Ocean ise daha sonra geliştirilmiş, daha modern ve kullanışlı bir tasarıma sahip arayüz. Blue ocean kurulumla birlikte otomatik olarak gelmiyor. Eklenti olarak kurulması gerekiyor.
Kurulduktan sonra, blue ocean menüsü görünecektir.
Tıklayarak Blue Ocean Panelini açın.
Blue Ocean paneli gördüğünüz görsellik ve kullanım kolaylığı açısından eski klasik arayüzden daha gelişmiş. Ben kendi projelerimde klasik arayüzü kullanıyorum. Bazı arkadaşlar yeni arayüzün stabil olmadığını söylüyorlar. Kendiniz deneyerek görebilirsiniz.
Örnek bir pipeline
Örnek bir job oluşturalım şimdi de Jenkins üzerinde. Yeni Item diyerek tanımlamaya başlayalım:
My Echo Job ismini veriyorum ve Pipeline seçeneğine tıklıyorum ardından OK düğmesine tıklıyorum:
Ardından gelen ekranda Pipeline kısmına gidip aşağıdaki pipeline tanımını yapın:
pipeline {
agent any
stages {
stage('build') {
steps {
echo 'testing'
}
}
}
}
Script’ın yaptığı tek şey, çıktıya testing diye bir ifade göndermek. Şimdi Yapılandır diyerek işlemi başlatalım:
Biraz bekledikten sonra Yapılandırma Geçmişi kısmında job’ın bir nolu çalışmasını göreceğiz:
Bir nolu linke tıklayınca çalışmanın detayına gideriz. Konsol çıktısına tıklayalım:
Gördüğünüz gibi testing ifadesini konsola yazdırmış olduk.
Bu basit örneği yaptıktan sonra daha kapsamlı bir pipeline örneğine geçelim.
Gelişmiş Bir Build Örneği (Önerilen Yöntem)
Örneğimizde bir dotnet core projesi var. Bir asp.net core web uygulaması. Kodlarına github üzerinden bakabilirsiniz.
https://github.com/ttufekci/JenkinsDotnetSampleProject
Senaryomuzu şu şekilde düşünelim:
Geliştirici ekip kodlarını github’a commit ediyor. Jenkins taskımız, otomatik olarak bu kodu çekiyor, derliyor, testlerini çalıştırıyor, sonunda da bir sunucuya deploy ediyor.
Pipeline tanımını da github projesine commit edilen JenkinsFile dosyasından alsın. Jenkins resmi dokümanlarında tavsiye edilen yöntem de aslında budur.
Yukardaki github adresindeki projeyi siz de denemek için kullanabilirsiniz.
Demonun Sizin Bilgisayarda Çalışması İçin Gerekenler
Demo İçin Jenkins servisinin çalıştığı bilgisayarda dotnet core kurulu olması gerekiyor.
Ayrıca bilgisayarınızda C:/tmp/dotnetweb isimli bir dizin oluşturmanız gerekiyor. Dotnet publish bu dizine uygulamayı kopyalayacak.
Eğer başka bir dizine kurulumunu istiyorsanız, Jenkinsfile dosyasını ona göre değiştirebilirsiniz.
Son olarak proje IIS üzerinde çalışacağı için, IIS üzerinde bir web uygulaması oluşturmanız gerekiyor.
Demo Item Oluşturalım
Jenkins yönetim paneli üzerinde Yeni Item komutu ile tanımlama işlemine başlayalım:
İstediğimiz bir isim verelim. Pipeline’ı seçip OK düğmesine tıklayalım:
Gelen ekranda pipeline kısmına geçip aşağıdaki gibi ayarlarını yapalım:
SCM olarak git seçiyoruz. Repository olarak github üzerinde bulunan projenin adresini giriyorum.
Şimdi Yapılandır diyerek çalıştıralım.
Uygulamamız gördüğünüz gibi çalışmış oldu. Pipeline tanımı github üzerinde bulunan projenin kök dizininde tanımlı.
Jenkinsfile tanımına bakacak olursak, üç farklı stage tanımladık: Build, Test ve Deploy
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Build Starts!'
bat "\"C:/Program Files/dotnet/dotnet.exe\" restore \"${workspace}/JenkinsDotnetSampleProject.sln\""
bat "\"C:/Program Files/dotnet/dotnet.exe\" build \"${workspace}/JenkinsDotnetSampleProject.sln\""
echo 'Build Ends'
}
}
stage('Test') {
steps {
echo 'Test Starts!'
bat "\"C:/Program Files/dotnet/dotnet.exe\" test \"${workspace}/RazorPageTests\""
echo 'Test Ends'
}
}
stage('Deploy') {
steps {
echo 'Deploy Starts!'
bat "\"C:/Program Files/dotnet/dotnet.exe\" publish \"${workspace}/SampleWebProject\" --output \"C:/tmp/dotnetweb\""
echo 'Deploy Ends'
}
}
}
}
Jenkins Job Nasıl Tetiklenir
Jenkins işini tetiklemenin pek çok yöntemi var.
Birincisi, bizim yaptığımız gibi Şimdi Yapılandır komutu ile.
Periodik olarak çalıştırabilirsiniz. Yani haftanın, günün istediğiniz saatlerinde. Bu konuda oldukça fazla esnekliği var.
Diğer bir tetikleme şekli ise, kod commitlenir commitlenmez, çalıştırabilirsiniz. Github kullanıyorsanız bir webhook tanımlayarak build tetikleyebilirsiniz.
Jenkins Alternatifleri
- TeamCity: On-Premise çalışıyor. Kendi sunucularınıza kurulum yaparak kullanabilirsiniz. Jenkins yerine kullanabileceğiniz en güçlü alternatiflerden birisidir.
- Bamboo: Atlassian firması tarafından çıkarılmış, sürekli entegrasyon aracıdır. On-Premise çalışıyor.
- Travis CI: Bulut tabanlı bir CI aracıdır. Github ortamı ve diğer sürüm kontrol servislerine otomatik olarak bağlanarak, kodlarınızı commit eder etmez build etmenize imkan sağlar. Bulut üzerinde çalışan bir servis olduğu için herhangi bir kurulum gerektirmez.
- CircleCI: Travis CI gibi bulut tabanlı bir CI aracıdır. Hook (çengel) mekanizması sayesinde, github üzerinden otomatik olarak kodları çekip, build işlemini yapar.
Sonuç
Yazıda anlattıklarım, buzdağının sadece görünen ucu. Eklenti mekanizması sayesinde Jenkins’i istediğiniz her tür yazılım projesi için rahatlıkla kullanabilirsiniz.
Yazılım projelerinde, Jenkins olması şart değil fakat bir sürekli entegrasyon aracı kullanmıyorsanız, yanlış yaptığınızı söylemeliyim. Kullandıkça, felsefesini daha iyi kavrayacaksınız. Böylece Kod tabanınızı daha sağlıklı ve çalışır bir vaziyette tutmuş olacaksınız.
Geri bildirim: Dotnet Projelerinizi Jenkins ile Entegre Edin - Onbirkod
güzel yazı
teşekkürler