GitLab CI/CD pipeline yazmak: temel yapıdan dağıtıma
.gitlab-ci.yml yapısı, stages, rules, needs ve cache: GitLab CI/CD ile ilk pipeline'ı yazmanın ve hızlandırmanın adım adım yolu.
GitLab CI/CD nasıl çalışır?
GitLab CI/CD, deponuzun kök dizinindeki .gitlab-ci.yml dosyasını okuyarak bir pipeline kurar. Pipeline; aşamalardan (stages) ve her aşamada çalışan işlerden (jobs) oluşur. Her iş, bir runner üzerinde, çoğunlukla belirli bir Docker imajı içinde çalıştırılan betik komutlarından ibarettir. Bir commit veya birleştirme isteği tetiklendiğinde GitLab dosyayı değerlendirir, hangi işlerin oluşacağına karar verir ve sırayla çalıştırır.
Temel kavramlar şunlardır: stages, aşamaların sırasını tanımlar; script, işin çalıştıracağı komutları listeler; image, işin içinde çalışacağı konteyner imajını belirtir; artifacts, bir işin ürettiği dosyaları sonraki işlere taşır; cache ise bağımlılık indirmeleri gibi tekrar kullanılabilir dosyaları işler arasında saklar. Bu kavramlar anlaşıldığında çoğu pipeline okunabilir hale gelir.
İlk pipeline: derle, sına, yayına al
En yalın pipeline, aşamaları tanımlayıp her aşamaya bir iş koymaktır. Dosyanın iskeleti şöyle görünür:
stages: - build - test - deploy
build-job: stage: build image: node:lts script: - npm ci - npm run build artifacts: paths: - dist/
test-job: stage: test image: node:lts script: - npm test
Burada derleme çıktısı artifacts ile saklanır, test işi ise kendi aşamasında çalışır. Dağıtım işini ekleyip yalnızca ana dalda çalışacak şekilde kısıtlamak sonraki adımdır. Önce yerel bir depoda bu iskeleti çalıştırıp pipeline ekranında işlerin nasıl göründüğünü izlemek, YAML söz diziminden daha çok şey öğretir.
Koşullar: rules, needs ve variables
Pipeline büyüdükçe "her işi her commit'te çalıştırma" yaklaşımı yavaşlar ve gürültü yaratır. rules anahtar sözcüğü, bir işin hangi koşulda oluşacağını belirler: yalnızca birleştirme isteğinde, yalnızca ana dalda, yalnızca belirli dosyalar değiştiğinde gibi. Eski only ve except kullanımı yerine rules tercih edilir.
needs, aşama sırasını beklemeden bir işin yalnızca gerçekten bağımlı olduğu işleri beklemesini sağlar; böylece bağımsız işler paralel ilerler ve toplam süre kısalır. variables ise ortam değişkenlerini tanımlar; gizli değerler (parola, erişim belirteci) dosyaya yazılmaz, proje ayarlarındaki korumalı CI/CD değişkenlerinde tutulur. extends ve include ile ortak yapılandırma şablonlara ayrılır; birden çok projede aynı kuralları tekrar yazmak yerine paylaşılan şablon kullanılır.
YAML hatalarını yakalamak için GitLab arayüzündeki pipeline düzenleyicisinin doğrulama (lint) özelliğinden yararlanın; commit etmeden önce söz dizimi hatasını görürsünüz. Bir iş kırmızıya döndüğünde ise iş günlüğünü baştan sona okuyun: hata çoğunlukla son satırda değil, ilk anormal çıktının hemen sonrasındadır. Hatanın kaynağı genellikle eksik bir bağımlılık, yanlış imaj, eksik değişken ya da yetersiz izindir.
Test, kalite kapıları ve güvenlik taramaları
Pipeline'ın değeri yalnızca derlemekte değil, hatalı değişikliği erken durdurmasındadır. Birim testleri ve statik analiz ilk kapıdır; test sonuçları ve kapsam raporları artifacts olarak saklanıp birleştirme isteğinde görünür hale getirilir. Başarısız kapı, birleştirmeyi engelleyecek şekilde yapılandırılır.
GitLab'ın güvenlik tarama şablonları (bağımlılık, konteyner imajı, statik kod ve gizli bilgi taraması gibi) include ile pipeline'a eklenebilir. Hangi taramaların hangi lisans katmanında bulunduğu zamanla değişir; güncel kapsam için GitLab belgelerini kontrol edin. Taramaları ilk günden "engelleyici" yapmak yerine önce raporlayıcı modda çalıştırıp mevcut borcu görmek, ardından kritik bulgular için engelleyici hale getirmek ekip direncini azaltır.
Runner'lar ve hız optimizasyonu
İşleri runner'lar çalıştırır. Paylaşılan runner'lar kolaydır; özel kaynak, ağ erişimi ya da güvenlik gereksinimi olduğunda kendi runner'ınızı kurarsınız. Runner'ı seçerken yürütücü türünü (kabuk, Docker, Kubernetes) ve eşzamanlı iş kapasitesini düşünün; etiketlerle (tags) hangi işin hangi runner'a gideceğini belirlersiniz.
Hız için başlıca yöntemler: cache anahtarını bağımlılık dosyasına bağlamak, küçük ve önceden hazırlanmış imajlar kullanmak, bağımsız işleri needs ile paralel çalıştırmak, değişmeyen kısımlar için rules ile işi atlamak, gereksiz artifacts boyutunu sınırlamak. Önce pipeline süresinin hangi işte harcandığını ölçün; tahmine dayalı optimizasyon çoğu zaman yanlış yeri iyileştirir.
Dağıtım ve ortam yönetimi
Dağıtım işlerinde environment anahtar sözcüğü, işin hangi ortama (test, hazırlık, canlı) dağıttığını GitLab'a bildirir; böylece ortamlar ve dağıtım geçmişi arayüzde izlenir. Canlı ortama dağıtımı elle onaya bağlamak, yalnızca etiketli sürümlerde çalıştırmak ve korumalı dallar ile korumalı ortamlar kullanmak güvenli bir başlangıçtır.
Birleştirme isteği başına geçici inceleme ortamı açmak, değişikliği birleştirmeden önce gerçek ortamda görmeyi sağlar. Olgunluk arttıkça dağıtım tanımları da koda taşınır ve GitOps yaklaşımıyla ortamın istenen durumu depoda tutulur.
Sık yapılan hatalar
- Gizli bilgiyi YAML'a yazmak: Parola ve belirteçler korumalı değişkenlerde olmalı, depo geçmişine girmemeli.
- Her şeyi tek dev işte toplamak: Hata ayıklaması ve paralelleşme zorlaşır.
- Cache ile artifacts'i karıştırmak: Cache hızlandırma amaçlıdır ve garanti edilmez; işler arası ürün aktarımı artifacts ile yapılır.
- Belirsiz imaj sürümü: Sürüm sabitlenmezse pipeline bir gün sebepsiz kırılabilir.
- Aşırı kopya YAML: Ortak parçalar extends ve include ile şablonlaştırılmalı.
- Kırık pipeline'a alışmak: Sürekli kırmızı bir pipeline, kalite kapısını anlamsız kılar; kırıkları öncelikle düzeltin.
- Yerelde denemeden gönderip beklemek: Küçük adımlarla ilerleyin, her değişikliği kısa bir pipeline'da sınayın.
Öğrenme yolu ve Mindset bağlamı
Önce Git ve komut satırı ile birleştirme isteği akışını öğrenin, ardından Docker temellerini edinin; çünkü pipeline'ların çoğu imaj içinde çalışır. Sonra basit bir derleme ve test pipeline'ı yazın, rules ve needs ile akıllandırın, güvenlik taramalarını ekleyin, en sonda dağıtım ve ortam yönetimine geçin.
Mindset'in CI/CD Pipeline Tasarımı (GitLab) programı; GitLab CI/CD mimarisi ve temelleri, gelişmiş pipeline tasarımı, runner yönetimi ve optimizasyon, test ve kalite kapıları, güvenlik tarama araçları, deployment ve ortam yönetimi ile GitOps ve olgunluk başlıklarını kapsar.
İlgili Mindset programı
CI/CD Pipeline Tasarımı (GitLab)
Sık sorulan sorular
GitLab CI/CD için kod bilmek gerekir mi?
Uygulama kodu yazmak şart değildir, ancak komut satırı, Git ve YAML söz diziminde rahat olmak gerekir. Pipeline, çoğunlukla derleme ve test komutlarını sıralamaktan ibarettir; bu komutların ne yaptığını anlamak için projenin teknolojisine temel düzeyde aşinalık yeterlidir. Betik yazma becerisi ilerledikçe daha esnek pipeline'lar kurabilirsiniz.
GitLab CI/CD ile Jenkins arasında temel fark nedir?
GitLab CI/CD, depo, birleştirme isteği ve pipeline'ı tek platformda sunar; yapılandırma deponun içindeki YAML dosyasında yaşar. Jenkins ise ayrı kurulan, eklentilerle genişleyen bağımsız bir otomasyon sunucusudur. Seçim ekibin mevcut altyapısına ve bakım isteğine bağlıdır.
Pipeline neden bazen çok yavaş çalışır?
Genellikle her çalıştırmada bağımlılıkların yeniden indirilmesi, büyük imajların çekilmesi, bağımsız işlerin sırayla koşması ve runner kapasitesinin yetersizliği yavaşlık yaratır. Cache kullanmak, needs ile paralelleştirmek, küçük imajlar seçmek ve süreyi işlere göre ölçmek sık kullanılan çözümlerdir. Önce darboğazı ölçün, sonra o noktayı iyileştirin.
Pipeline'da parola ve anahtarlar nasıl güvenli tutulur?
Parolaları ve belirteçleri YAML dosyasına yazmayın. Proje veya grup ayarlarındaki CI/CD değişkenlerinde, mümkünse maskelenmiş ve korumalı olarak saklayın; böylece yalnızca korumalı dallarda kullanılabilir ve iş günlüklerinde gizlenir. Ayrıca gizli bilgi taramasını pipeline'a ekleyip yanlışlıkla depoya girenleri erken yakalayın.
İlgili rehberler
İlgili eğitimler
Kategori: DevOps ve Bulut Teknolojileri, Yazılım Geliştirme