Jenkins Nedir?
Bu yazımda “Jenkins nedir? Ne işe yarar? CI/CD nedir? DevOps nedir? Ebebek’te nerelerde kullanıyoruz? Otomasyon için nasıl job oluştururum?” konularından bahsedeceğim.
“Jenkins nedir?” ile başlayalım.
Jenkins, Sürekli Entegrasyon (CI: Continuous Integration) yöntemi için kullanılan java ile yazılmış açık kaynak kodlu bir otomasyon aracıdır.
- Yazılım geliştirme süreçlerini otomatize etmemize yarar.
- Jenkins, belirli bir sunucuda ve portta çalışır, belirlenen kaynaktan projeye ulaşır ve istenen işlemleri gerçekleştirir. Sonuçlarını belirlenen kişilere mail yoluyla iletir.
- Jenkins, manuel olarak yapılan build, test ve deploy gibi işlemleri uygular ve bu süreçte yaşanabilecek tüm aksaklık ve iletişim eksikliğini en aza indirir.
- Bu sayede projemiz sürekli test edildiği için hatalar hızlıca tespit edilir ve çalışır bir durumda tutulur.
CI (Continuous Integration) / CD (Continuous Delivery / Deployment)
Sürekli entegrasyon ve sürekli dağıtım, kod kalitesini iyileştirmek ve hızlı teslimat sağlamak için tasarlanmış yazılım geliştirmeye yönelik iki yaklaşımdır.
Sürekli Entegrasyon (Continuous Integration)
Sürekli entegrasyon, kod üzerinde yapılan her değişikliğin ardından, tüm sistemin çalışır durumda olduğunu, yapılan değişikliğin sistemin bazı bölümlerinde kırılmalara yol açmadığını tespit etmek için kullanılan yöntemdir. Kırılmaları tespit edebilmek için birim testlere ihtiyaç duyulur.
Bu testler, yapılan değişikliğin neticesi olarak yeni bir yapı (build) hazırlandıktan sonra otomatik olarak çalıştırılır.
Yapılan değişiklik yeni yapının bir parçası olduğu için, testlerde oluşan hatalar, yapılan değişikliğin sistemi bozduğu anlamına gelmektedir. Bu durumdan tüm geliştiriciler haberdar edilerek, hatanın bir an önce giderilmesi ve testlerin her zaman olumlu sonuç vermesi sağlanır. Sürekli entegrasyon ile geliştiriciler tarafından kod üzerinde yapılan çalışmalar neticesinde her zaman çalışır bir sürümün oluşması sağlanmış olur.
Sürekli Teslimat / Dağıtım (Continuous Delivery / Deployment)
Sürekli teslimat, sürekli entegrasyonun doğal bir uzantısıdır.
CI/CD’nin faydaları nelerdir?
Verimliliği arttırır (Yeni hizmetler ve artan trafik yönetme daha verimli gerçekleşir.)
Azalan riskler (Yapılandırma hata riskini kaldırır, en son yazılım sürümünü destekleyerek risklere karşı önlem alır.)
Servis çevikliği (Daha kısa teslim süreleri (TTM) sağlar.)
Jenkinste Sık Kullanılan Kavramlar
Node, jenkins prosesinin üzerinde çalıştığı sunucuyu ifade eder.
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 gelir.
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 aşamasını bir stage olarak düşünelim. Test stage de sonraki stage. Deployment stage de en son çalışacak stage 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şmuş olursa, deployment işlemi gerçekleşmeyecektir.
Pipeline mantığı bu şekilde çalışmaktadır.
Kısaca, “DevOps nedir?” konusundan da bahsetmek istiyorum.
DevOps
DevOps, iki temel birimi (Developers and Operations) Geliştiriciler(Yazılım Geliştiriciler, Yazılım Testçileri, vb.), Operasyon (Sistem Mimari ve Altyapı Ekipleri, Güvenlik ve Ağ ekipleri vb.) bir arada etkili bir iletişim içerisinde beraber çalışmalarıdır.
DevOps’u aslında bir felsefe, yaklaşım veya bakış açısı olarak değerlendirebiliriz.Yazılım geliştiricilerin alışık olduğu Scrum, Agile, Kanban ve diğer yöntemler gibidir.
DevOps kuruluşları, her bir ekibi diğerinin becerileri konusunda çapraz eğiterek Operasyonlar ve Mühendislik arasındaki engelleri ortadan kaldırır.
Dev takımı,
- Oluşturulacak uygulamaya ait planları yapmak,
- Uygulamayı oluşturmak(Kodlamak)
- Uygulama release ve publish (versiyonlama ve yayınlama)
- Uygulama iyileştirme (Update)
- Uygulama Test süreçleri
Ops takımı,
- Oluşan uygulamaların barındırılacağı ve kullanılacağı ortamı tasarlamak,
- Uygulamaların çalışması için gereken sistem bileşenleri ile iletişime geçebilmeleri için gerekli ağ ve güvenlik yapılandırmalarının yapılmasını sağlamak,
- Uygulamanın kaynak kullanımını belirlemek,
- Uygulamanın gerekli izleme (Monitoring) araçları ile takibini sağlamak.
Jenkins Job’ı Oluşturma
Kısaca özetleyecek olursak burada oluşturacağım jenkins job’ı projeyi Git’ten alır, build eder, yazılan test adımlarını belirlenen node’larda gerçekleştirir, sonuçlarını belirlenen kişilere iletir. Bunu sürekli hale getirir.
Ebebek’te yapmış olduğumuz örnek bir otomasyon job’ının adımlarını sizlerle paylaşmak istiyorum.
1. İlk olarak aşağıdaki plugin’ler kurulup Jenkins restart edilir:
a. HTML Publish Plugin
b. Maven Integration plugin
2. “New Item” bölümünden job oluşturulur.
3. Job ismi verilerek, maven projesi seçilir.
Not: Maven bir build aracıdır. Build ve sürüm kontrolü süreçlerinde yardımcı olur. Jenkins ise sürekli entegrasyon sistemidir. Jenkins Maven’ı build için kullanır.
4. Job için kısa bir açıklaması yapılıp, GitHub işaretlenerek GitHub’daki repository url yazılır.
5.Source Code Management bölümünden GitHub’daki repository url’i ve kullanıcı bilgileri ilgili alanlara girilir.
6. Build Triggers kısmından, isteğe bağlı olarak projenin ne zaman aralıklarla çalıştırılacağı belirlenir. Bunun için cron expression kullanılır.
Ek olarak cron expression aşağıdaki gibidir;
MINUTE (0–59), HOUR (0–23), DAY (1–31), MONTH (1–12), DAY OF THE WEEK (0–7)
7. Build alanından çalıştırılacak testlerle ilgili komut doldurulur.
Aşağıdaki komutu da kodunuzda kısa bir geliştirme yaptıktan sonra çalıştırabilirsiniz. Hangi ortamda hangi tag’lerle hangi browser’da çalışacağını düzenleyip, Jenkins konfigürasyonu üzerinden aynı projeye bağlı olan açmış olduğunuz job’da kolay bir konfigürasyon sağlayabililirsiniz.
clean verify -Denv=”PROD” -DURL=”https://www.ebebek.com" -Dtags=”api” -Dbrowser=”CHROME_HEADLESS”
8. Post Steps kısmından “Run regardless of build result” kısmı seçilerek, “add post-build step” ‘ten “Execute Shell” kısmından test raporu adımlarıyla ilgili düzenleme yapılır.
9. “Post-build Actions” kısmında proje çalıştıktan sonraki rapor işlemi için öncelikle “Add post-build action” kısmından “Publish Html reports” seçilerek aşağıdaki alanlar doldurulur.
10. Tekrar “Post-build Actions” kısmından proje çalıştıktan sonra ilgili kişilere rapor ile ilgili bilgilendirme maili için “Add post-build action” kısmından “Editable Email Notification” seçilerek aşağıdaki alanlar doldurulur.
11. Jenkins sayfasından aşağıdaki adımlar takip edilerek JDK, Maven kurulumları yapılır.
12. Son olarak html rapor düzgün görünmezse sırasıyla aşağıdaki adımlar yapılır.
a)Manage Jenkins->
b)Manages Nodes->
c)Click settings(gear icon)->
d)click Script console on left and type the following command;
System.setProperty(“hudson.model.DirectoryBrowserSupport.CSP”, “”)
@ebebek