Bir ekip haftada 1 kez yayın yaparken, başka bir ekip günde 5 dağıtım gerçekleştirebiliyor. Aradaki fark çoğu zaman yalnızca geliştirici sayısı değildir; teslim sürecinin ne kadar otomatik, ölçülebilir ve tekrarlanabilir kurulduğudur. CI/CD pipeline nedir sorusu da tam bu noktada önem kazanır. Çünkü modern yazılım geliştirmede hız, sadece daha fazla kod yazmakla değil; kodu güvenli biçimde test edip ortama almakla ortaya çıkar.
CI/CD pipeline; kod değişikliğinin depoya gönderilmesinin ardından derleme, test, kalite kontrol, paketleme ve dağıtım adımlarının otomatik olarak çalıştığı teslim hattıdır. Basit bir projede 4-5 adımdan oluşabilir. Kurumsal bir üründe ise farklı ortamlar, güvenlik taramaları, onay adımları ve geri alma mekanizmalarıyla 10’dan fazla aşamaya çıkabilir. Yapı karmaşık görünebilir, ancak hedef nettir: insan hatasını azaltmak, çevrim süresini kısaltmak ve sürüm kalitesini görünür kılmak.
CI/CD pipeline nedir? Temel mantığı 1 commit ile başlar
CI, Continuous Integration; CD ise bağlama göre Continuous Delivery veya Continuous Deployment anlamına gelir. Süreç, çoğu ekipte tek bir git push ile tetiklenir. Örneğin geliştirici yeni bir özellik için 12 dosyada değişiklik yapar ve kodu ana dala birleştirir. Sonrasında sistem otomatik olarak şu kontrolleri başlatır:
- Uygulamanın derlenmesi
- Birim testlerinin çalıştırılması
- Statik kod analizi
- Güvenlik veya bağımlılık taraması
- Container image üretimi
- Test ya da staging ortamına dağıtım
Bu hattın asıl değeri, her sürümde aynı sırayı ve aynı kuralları uygulamasıdır. Elle yürütülen teslimlerde bir adımın atlanması oldukça yaygındır. Mesela veritabanı migration dosyası hazırlanır ama staging’de denenmez. Ya da testler lokal makinede geçer, build sunucusunda sürüm farkı nedeniyle patlar. Pipeline bu tür farkları erken aşamada yakalar.
CI, Delivery ve Deployment farkı
Karışıklık genelde burada başlar. Continuous Integration, küçük değişiklikleri sık sık birleştirmeyi ve her birleşimde otomatik doğrulama yapmayı ifade eder. Continuous Delivery, üretim ortamına çıkmaya hazır bir paket oluşturur; ancak son adım insan onayıyla ilerleyebilir. Continuous Deployment ise testleri geçen sürümün üretime otomatik çıkmasını hedefler. SaaS ürünlerinde bu yaklaşım yaygındır; regülasyonlu sektörlerde ise manuel onay noktaları korunabilir.
Pipeline hangi adımlardan oluşur? 6 aşamalı pratik bir örnek
Her projede aynı şablon kullanılmaz. Yine de orta ölçekli bir web uygulamasında sık görülen akış 6 temel aşamada açıklanabilir:
- Source: Kod deposuna commit veya merge yapılır.
- Build: Uygulama derlenir, bağımlılıklar yüklenir.
- Test: Unit ve integration testleri koşar.
- Quality Gate: Lint, statik analiz, coverage eşiği kontrol edilir.
- Package: Docker image ya da deploy paketi oluşturulur.
- Deploy: Staging veya production ortamına aktarılır.
Örneğin bir Node.js API projesinde build süresi 2 dakika, test süresi 4 dakika, container oluşturma 1 dakika sürebilir. Toplam 7 dakikalık bir pipeline, manuel 30-45 dakikalık teslim işini ciddi ölçüde sadeleştirir. Süreler projeye göre değişebilir; burada kritik nokta, hattın her çalıştırmada ölçülebilir sonuç üretmesidir.
Basit bir YAML örneği
Aşağıdaki örnek yalnızca mantığı göstermek içindir:
stages:
- build
- test
- deploy
build:
script:
- npm ci
- npm run build
test:
script:
- npm run test
deploy_staging:
script:
- docker build -t app:staging .
- kubectl apply -f k8s/staging.yamlGerçek sistemlerde buna cache, secret yönetimi, rollback ve ortam bazlı değişkenler eklenir. Yine de özünde mantık değişmez: her adım otomatik ve izlenebilir şekilde çalışır.
Yazılım teslim süreçleri neden yavaşlar? Sorun çoğu zaman kodda değil akıştadır
Teslim sürecindeki gecikme yalnızca geliştirme hızından kaynaklanmaz. Sık görülen darboğazlardan biri, tek bir yayının 8-10 manuel kontrol gerektirmesidir. Bir ekip düşünün: geliştirici kodu bitiriyor, QA elle test ediyor, operasyon ekibi sunucuya bağlanıyor, konfigürasyon dosyası düzenleniyor, ardından loglar izleniyor. Zincirin herhangi bir halkasında 15 dakikalık gecikme yaşansa, toplam süre saatlere uzayabiliyor.
Yavaşlığa yol açan başlıca pratikler şunlardır:
- Uzun yaşayan feature branch’ler
- Ortamlar arasında sürüm farkı bulunması
- Elle çalışan test senaryolarının fazla olması
- Dağıtım adımlarının kişiye bağımlı kalması
- Rollback planının yazılı olmaması
Burada kritik metriklerden biri lead time for changes, yani kod değişikliğinin canlıya çıkma süresidir. Örneğin küçük bir düzeltme için 3 gün bekleniyorsa, sorun çoğu zaman “geliştirici yavaşlığı” değildir; akış yeterince otomatik değildir. Pipeline yaklaşımı, görünmeyen bekleme alanlarını azaltmayı hedefler.
Teslim süreçleri nasıl hızlandırılır? 5 somut uygulama
Hızı artırmak için tek bir araç seçmek yeterli olmaz. Akışı parçalara ayırıp ölçmek gerekir. Uygulamada etkisi net biçimde görülen yöntemler şunlardır:
1. Küçük ve sık commit yaklaşımı
500 satırlık tek bir değişiklik yerine 50-100 satırlık küçük commit’ler daha hızlı incelenir ve daha az çakışma üretir. Bu yaklaşım, pipeline hatası olduğunda problemin kaynağını da hızlıca buldurur. Özellikle trunk-based development kullanan ekiplerde çevrim süresi belirgin şekilde düşer.
2. Test piramidini gerçekçi kurmak
Her şeyi uçtan uca test etmek pahalıdır. 300 unit test 90 saniyede biterken, 40 adet UI testi 20 dakikayı bulabilir. Bu nedenle hızlı geri bildirim için unit testler ana güvenlik katmanı olmalı; integration ve e2e testleri ise seçici kullanılmalıdır. Amaç test sayısını şişirmek değil, riskli alanları erken yakalamaktır.
3. Paralel çalışan pipeline job’ları
Lint, unit test ve güvenlik taraması sırayla değil de paralel koşarsa toplam süre ciddi biçimde kısalır. 3 işin her biri 4 dakika sürüyorsa seri çalışmada 12 dakika gerekir; paralel düzende ise darboğaz 4-5 dakika bandına iner. Bunun için CI altyapısının runner kapasitesi planlanmalıdır.
4. Ortam standardizasyonu ve container kullanımı
“Bende çalışıyordu” cümlesi çoğu zaman ortam farkından doğar. Docker gibi container tabanlı paketleme, geliştirici makinesi ile CI sunucusu arasındaki tutarsızlığı azaltır. Aynı image’ın staging ve production’da kullanılması da sürüm güvenini artırır.
5. Otomatik rollback ve health check
Hız yalnızca dağıtım süresiyle ilgili değildir; sorun çıktığında güvenle geri dönebilmeyi de kapsar. Örneğin yeni sürüm dağıtıldıktan sonra ilk 60 saniyede sağlık kontrolü başarısız olursa, sistemin önceki sürüme dönmesi planlanabilir. Bu yaklaşım, özellikle müşteri trafiği yüksek platformlarda riski azaltır.
Kurumsal projelerde CI/CD nasıl kurgulanmalı? Tek araçtan çok mimari önemlidir
KOBİ ölçeğindeki bir uygulama ile çoklu servis içeren kurumsal bir sistem aynı teslim modelini kullanmaz. ERP entegrasyonu olan, mobil istemcisi bulunan veya B2B portal işleten yapılarda pipeline tek bir repo ile sınırlı kalmayabilir. 20 mikroservisli bir mimaride her servis için ayrı build hattı, ortak güvenlik politikası ve sürümleme standardı gerekir.
Bu noktada iyi bir kurgu genelde şu bileşenleri içerir:
- Branch stratejisi ve merge kuralları
- Artifact repository kullanımı
- Secret yönetimi
- Staging ile production arasında konfigürasyon disiplini
- Log, metric ve alert entegrasyonu
Örneğin Kubernetes kullanan bir yapıda deployment yalnızca kubectl apply komutundan ibaret değildir. Readiness probe, liveness probe, replica sayısı, kaynak limitleri ve rollout stratejisi de teslim kalitesinin bir parçasıdır. Mavi-yeşil dağıtım ya da canary release gibi yöntemler burada devreye girer. Canary modelinde trafiğin önce yüzde 5’lik kısmı yeni sürüme yönlendirilir, hata gözlenmezse oran artırılır. Bu teknik, büyük kullanıcı tabanında kontrollü geçiş sağlar.
Hangi metrikler izlenmeli? İyileştirme ölçülmeden kalıcı olmaz
Pipeline kurmak başlangıçtır. Asıl değer, hattın ne kadar verimli çalıştığını sayılarla görebilmektir. Ekiplerin düzenli olarak izlemesi gereken birkaç temel metrik vardır:
- Deployment frequency: Belirli sürede kaç canlı dağıtım yapıldığı
- Lead time for changes: Commit’ten production’a geçiş süresi
- Change failure rate: Yayın sonrası sorun çıkaran değişiklik oranı
- MTTR: Arıza sonrası ortalama toparlanma süresi
Örnek verelim: Haftada 2 kez dağıtım yapan bir ekip, pipeline optimizasyonu sonrası haftada 8 dağıtıma çıktıysa bu tek başına başarı sayılmaz. Eğer hata oranı da aynı dönemde yükseldiyse süreç yalnızca hızlanmış, olgunlaşmamıştır. İyi bir teslim hattı; hız, kalite ve geri alınabilirlik arasında denge kurar.
Sık yapılan hatalar: Hız uğruna kırılgan bir hat kurmamak gerekir
Pratikte en sık görülen hatalardan biri, otomasyonu yalnızca deploy adımı sanmaktır. Oysa test edilmeyen kodu hızlı dağıtmak, problemi sadece daha erken üretime taşır. Bir diğer hata da tüm kontrolleri tek aşamada toplamaktır. 18 dakikanın sonunda hata veren bir pipeline yerine, 2. dakikada fail eden bir kalite kapısı çok daha değerlidir.
Bir başka sorun da gizli bilgilerin yönetimidir. API anahtarlarının YAML dosyalarına düz metin olarak yazılması hâlâ rastlanan bir risk. Secret vault kullanımı, erişim yetkilerinin sınırlandırılması ve audit kaydı tutulması kurumsal tarafta temel gereksinimler arasındadır. Ayrıca pipeline yalnızca geliştirmenin değil, operasyonun da konusudur; bu nedenle DevOps sorumluluklarının net tanımlanması gerekir.
Sonuç: CI/CD bir araç değil, teslim disiplinidir
CI/CD pipeline nedir sorusunun kısa cevabı şudur: Kod değişikliğini güvenli, hızlı ve tekrarlanabilir biçimde canlı ortama taşıyan otomasyon hattıdır. Ancak etkisi yalnızca dakikaları kısaltmakla sınırlı değildir. Sürüm kalitesini görünür kılar, ekipler arası bağımlılığı azaltır, müşteri tarafındaki kesinti riskini düşürür. Özellikle büyüyen ürünlerde manuel teslim modeli bir noktadan sonra ölçeklenmez.
İyi tasarlanmış bir pipeline, ekiplerin daha fazla toplantı yapmasını değil, daha az belirsizlik yaşamasını sağlar. Nerede hata çıktığı bellidir. Hangi sürümün ne zaman geçtiği kayıt altındadır. Geri dönüş planı hazırdır. Teslim hızını kalıcı biçimde artıran yapı da tam olarak budur.