Custom Jenkins Library & Helm Store ile DevOps Süreci Optimizasyonu
Bu yazıda yazılım geliştirme süreçlerimizin bir parçası olan CI/CD süreçlerini optimize etmek için geliştirdiğimiz bir DevOps çözümünü anlatacağım. Ortak Jenkins kütüphaneleri ve Helm Store sayesinde yazılım geliştirme süreçlerinde tekrarlayan işlerin nasıl ortadan kaldırıldığını adım adım anlatacağım. Projelerimizin geliştirme hızına ve konfigürasyon yönetimine olan katkılarından bahsedeceğim.
Gelin çözüm bileşenlerini ayrı ayrı inceleyelim;
Aşağıdaki şemada gözüktüğü gibi çözümümüz üç temel bileşenden oluşuyor.
1. Jenkins Library & Jenkins Config Repo;
Jenkins Library ve Jenkins Config Repo, geliştirdiğimiz pipeline’ların temelini oluşturan Groovy dosyalarının ve uygulamalarımıza özel environment değişkenlerinin saklandığı kilit alanlardır. Jenkins Library, tekrar eden görevleri ve işlemleri bir araya getiren özel bir kütüphaneyi içerir. Bu sayede, projeleriniz arasında ortak olan işlemleri merkezi bir konumda yönetmek ve güncellemek daha kolay hale gelir.
2. Helm Store ;
Helm Store, kendi mimari çözümümüzde Openshift kullanıyoruz ve bu bağlamda ilgili Openshift cluster’ındaki projelerimize ait Kubernetes konfigürasyonlarını depoladığımız kritik bir bileşenimizdir. Bu store, projelerimizde kullanılan temel Kubernetes objelerini içerir; Deployment’lar, Route’lar, Service’ler, ConfigMap’ler vb. gibi. Helm template sayesinde, Openshift konfigürasyonlarımızı daha hızlı bir şekilde yapılandırabiliyoruz.
Openshift üzerinde Helm Store’un sunduğu avantajlardan biri, Kubernetes manifestolarını merkezi bir konumda depolayarak ve yöneterek projeler arasında konsistansı ve tekrar kullanılabilirliği artırmaktır. Bu, yeni bir uygulama dağıtımı için hızlı ve tutarlı bir başlangıç sağlar. Helm, konfigürasyonlarımızı paketleyip dağıtmamıza olanak tanıyan güçlü bir araçtır ve Helm Store üzerinden bu paketlere hızla erişebilme avantajı sunar.
3. Applications ;
Applications bölümü, diyagramımızda temsil edilen kısımda, uygulamalarımızın source kodlarına ve Jenkins Library’mizi tetikleyen Jenkinsfile’lara ev sahipliği yapmaktadır. Bu alan, projelerimizin temel yapı taşlarını içerir ve geliştirme sürecinde kritik bir rol oynar.
Uygulamaklarımızın source kodları, bu bölümde düzenli bir şekilde depolanır ve Jenkins Library ile entegre olan Jenkinsfile’lar sayesinde süreç otomatize edilir.
Örnek JenkinsFile:
Esnek ve Etkili Entegrasyon;
Jenkins library içerisindeki bileşenler, CI/CD sürecinde ihtiyaç duyulan tüm adımları merkezileştirmemizi sağlayarak süreçlerimizi daha etkili hale getiriyor. Bu çerçevede, elde ettiğimiz kazançlara ek olarak Helm Template’lerimizi de entegre ederek tüm deployment sürecini dinamik bir hale getiriyoruz. Yapının çalışma şekli şu adımları içerir:
1. Jenkins Jobları & Applications Jenkins Envariment:
- Jenkinsfile, uygulama geliştirme sürecini adım adım yöneten bir betik dosyasıdır.
- Jenkins jobları, Applications içerisindeki Jenkinsfile sayesinde tetiklenir.
- İlgili repomuzda bulunan .properties dosyaları jenkins joblarının ihtiyaç duyacağı uygulamaya özel bilgileri barındırmaktadır (java version, openshift cluster , credentials, artifactory path etc. )
Örnek:
2. Build, Test ve Diğer Adımlar:
- Jenkins job’ları, ilgili build, test vb. adımları içeren job stepleriyle adım adım ilerler.
- Bu adımlar, Jenkins library içindeki özelleştirilmiş bileşenler sayesinde yönetilir.
3. Helm Package Stage:
- Bu süreçteki kritik nokta, Helm Package Stage’dir.
- İlgili image üretme adımından sonra, Helm Package Stage’de uygulamanın image’ı ve Helm template ile helm paketi üretilir.
4. Image ve Helm Paketi Üretimi:
- Helm Package Stage, uygulamanın image’ını ve Helm paketini üretir.
- Bu aşamada, OpenShift konfigürasyonları ile source kod paketi birleştirilir ve değiştirilemez bir yapı oluşturulur.
5. Helm Store Ağaç Yapısı:
- Helm Config Store üzerinden Template ve values.yml nasıl çarpıştırılır:
dir("helm"){
sh "cp ./env/${profile}/Chart.yaml . 2>/dev/null || :"
sh "cp ./env/${profile}/values.yaml . 2>/dev/null || :"
sh "find ./env/${profile} -name '*.yaml' -not -name 'Chart.yaml' -not -name 'values.yaml' -exec ls -l {} ';' || :"
sh "find ./env/${profile} -name '*.yaml' -not -name 'Chart.yaml' -not -name 'values.yaml' -exec cp {} ./templates/ ';' || :"
sh "cp ./charts/${moduleName}/Chart.yaml . 2>/dev/null || :"
sh "cp ./charts/${moduleName}/values.yaml . 2>/dev/null || :"
sh "find ./charts/${moduleName} -name '*.yaml' -not -name 'Chart.yaml' -not -name 'values.yaml' -exec ls -l {} ';' || :"
sh "find ./charts/${moduleName} -name '*.yaml' -not -name 'Chart.yaml' -not -name 'values.yaml' -exec cp {} ./templates/ ';' || :"
sh "cp ./charts/${moduleName}/${profile}/Chart.yaml . 2>/dev/null || :"
sh "cp ./charts/${moduleName}/${profile}/values.yaml . 2>/dev/null || :"
sh "find ./charts/${moduleName}/${profile} -name '*.yaml' -not -name 'Chart.yaml' -not -name 'values.yaml' -exec ls -l {} ';' || :"
sh "find ./charts/${moduleName}/${profile} -name '*.yaml' -not -name 'Chart.yaml' -not -name 'values.yaml' -exec cp {} ./templates/ ';' || :"
sh "rm -rf ./charts"
}
- Helm Store içinde, her bir takım ve altında her bir uygulama için özelleştirilmiş konfigürasyonları barındıran bir ağaç yapısı bulunur.
- Bu yapı, her uygulamamızın özelleştirilmiş konfigürasyonlarını OpenShift’e başarıyla ulaştırmamızı sağlar.
- Helm Store sayesinde bulut configürasyonumuz repomuzda tutulmuş olup, GitOps dinamikleri desteklenmiş olur.
Bu entegre süreç, Jenkins library ve Helm Store ile bir araya gelerek, her bir uygulama için özelleştirilmiş konfigürasyonları hızlı ve güvenilir bir şekilde yönetmemize olanak tanır.
Sonuç diyagramımız aşağıdaki gibidir;