Jenkins

Merhabalar, bugün sizlere Jenkins’ten bahsedeceğim. Jenkins, uygulamalarımızı sürekli güncellediğimiz için CI/CD (Sürekli Entegrasyon ve Sürekli Dağıtım) süreçlerini otomatikleştiren, Java ile yazılmış açık kaynaklı bir otomasyon sunucusudur. Örneğin, GitHub repolarına yaptığımız commit’ler Jenkins üzerindeki pipeline’ları tetikler ve uygulamayı otomatik olarak çalıştırır. Böylece eklediğimiz kodun doğru şekilde çalışıp çalışmadığını görebilir ve olası hataları erken aşamada tespit edebiliriz.


Jenkins’e alternatif olarak GitLab CI/CD var, GitHub’da github actions, AWS’de CodePipeline var, Azure’da Azure DevOps var bunlar da alternatif olarak önümüze çıkmaktadır.

Terimler

Job: Jenkins’in çalıştırdığı görevdir. Derleme, test veya script tetikler.

Node: İşlerin çalıştığı makineler. Master yönetir, agent çalıştırır.

Pipeline: CI/CD sürecinin kodla tanımlanmış hâli. Jenkinsfile ile kullanılır.

Plugin: Jenkins’e yeni özellik ekleyen modüller.

Jenkinsfile: Pipeline’ın kod olarak yazıldığı dosya.

Workspace: Job çalışırken oluşturulan geçici çalışma dizini.

Build: Bir job’ın çalıştırılmış örneği.

Stage: Pipeline içindeki ana adım bölümleri (Build/Test/Deploy gibi).

Step: Stage içindeki küçük işlemler (komutlar).

Executor: Node üzerinde aynı anda kaç job çalışabileceğini belirleyen slotlar.

Label: Node’ları etiketleyip pipeline’da hedef seçmeye yarar.

Artifact: Build sonucunda üretilen dosyalar (bu çıktılar sonra başka yerlerde kullanılabilir yani aslında artifact terimi bir çıktıyı başka yerde kullanma gibi diyebiliriz.)

Jenkins Master – Slaves

Master-slave ilişkisine bakacak olursak, aslında bir düğümün dallanarak işi daha kolay şekilde, ana düğümü yormadan farklı yerlerde çalıştırarak ürün elde etme yöntemi olarak tanımlayabiliriz.

Burada amaçlanan, işi tek bir noktadan yürütmek yerine parçalara ayırarak daha verimli bir şekilde tamamlamaktır. Slave sunucumuza SSH ile ya da farklı yöntemlerle bağlanarak Jenkins üzerindeki işlemleri gerçekleştirebiliriz.

Kurulum

Jenkins’i herhangi bir işletim sistemine doğrudan kurmak yerine, Docker konteyneri üzerinden VS Code içinde çalıştıracağım. En güncel sürümü kullanmak için Jenkins Docker Hub sayfasından görüntüyü çekebiliriz ve docker pull komutuyla Jenkins’i kolayca ayağa kaldırabiliriz.

https://hub.docker.com/r/jenkins/jenkins

Ardından sol panelden aşağıdaki resimde paylaştığım gibi jenkinsi run edeceğiz


Başarılı bir şekilde kurulumun ardından Jenkins kullanmaya başlayabiliriz. Jenkins, varsayılan olarak 8080 portunda çalışmaktadır; bu porta giriş yaparak arayüzünü görüntüleyebilirsiniz

localhost:8080 adresine gittiğimizde bizden şifre isteyecektin bu şifrenin yerini de zaten kendisi sayfa üzerinde belirtiyor /var/jenkins_home/secrets/initialAdminPassword adresinde tutuluyor şifre. Buradan alarak sisteme girelim.





Sisteme giriş yaptıktan sonra karşımıza yukarıdaki gibi bir ekran çıkıyor. Burada ihtiyacımız olan eklentileri seçebilir veya Jenkins’in önerdiği eklentilerle devam edebiliriz. Ardından bizden kullanıcı adı ve şifre isteyecek; bunları girerek kurulumu tamamlıyoruz.

Jenkins Containerı Oluşturma

Öncelikle işlemleri VS Code üzerinden gerçekleştireceğiz. Öncelikle bir Dockerfile yazmalıyız; bunu aşağıda gösterdiğim ve açıkladığım şekilde basitçe oluşturabiliriz. Ardından IDE’nin yardımıyla Docker imajını build edip çalıştırabiliriz


Bu işlemleri tamamladıktan sonra artık image olarak geldiğini görebiliriz ve artık çalışır haldedir. Şimdi biraz içerisi kurcalayalım.

Uygulama

Şimdi bir master node oluşturacağız ve GitHub üzerinden yaptığımız commit’lerde tetiklenecek bir task yapısı inşa edeceğiz. Bunun için AWS üzerinden bir sunucu oluşturdum. Sunucumuzu Docker ile ayağa kaldırdıktan sonra işlemlere başlayabiliriz.

Jenkins yönet kısmında jenkins’in içeriklerini daha net görebilirsini eklenti kısmından pluginlerinizi kolayca ekleyebilirsiniz.

Şimdi adımları sırayla gerçekleştirelim. Yukarıda gördüğünüz gibi, tek bir task için serbest stil (Freestyle) kullanıyoruz; birden fazla stage içeren işlemler için ise pipeline tercih ediliyor. Şimdi tek bir task ile devam edelim.

GitHub eklentimizi yükledikten sonra karşımıza aşağıdaki gibi bir sayfa gelecek. Burada açıklama ve yapılandırma alanlarının yanı sıra trigger kısmını da görebilirsiniz; işlemi nasıl tetikleyeceğimizi buradan belirleyebiliriz. Ben alt kısma bir shell script ekledim ve script’in date çıktısını görmeyi bekliyorum

GitHub tarafına geçtiğimizde ise yukarıdaki gibi bir sayfa karşılıyor bizi burada nasıl bir şekilde yönlendirme yapacağımızı https://plugins.jenkins.io/github/ plugin sayfasında aşağıdaki gibi bize açıklamayı veriyor.

GitHub’da bir commit giriyoruz ve aşağıda göreceğiniz gibi bize çıktımızı vermiş oluyor.

Bu şekilde Jenkins’te nasıl bir otomasyon sistemi kuracağımızı görmüş olduk. Jenkins ile ilgili ikinci bir blog yazısı daha hazırlayacağım; burada ise pipeline oluşturmayı ele alacağım. Yazımı okuduğunuz için teşekkür ederim.

https://github.com/enableroot

Yunus Emre
Yunus Emre
Articles: 4