Yan yana
Sürekli EntegrasyonvsSürekli Teslimat
CI ile CD arasındaki fark nedir?
Güncellendi 3 dk okuma8 fark
Kısaca
CI, ana branch'e gelen her değişikliği otomatik olarak derleyip test eder; CD her test edilmiş build'i yayına hazır tutar, sürekli dağıtım ise onu yayınlar.
Sürekli Entegrasyon
Sürekli entegrasyon, kod değişikliklerini ana branch'e en az günde bir kez birleştirip her birleştirmeyi otomatik derleme ve testlerle doğrulama pratiğidir.
Sürekli Entegrasyon sayfasını okuSürekli Teslimat
Sürekli teslimat, her değişikliği otomatik bir pipeline ile derleyip test ederek canlıya hazırlayan ve yazılımı her an yayınlanabilir tutan pratiktir.
Sürekli Teslimat sayfasını okuSürekli Entegrasyon ve Sürekli Teslimat karşılaştırması
| Özellik | Sürekli Entegrasyon | Sürekli Teslimat |
|---|---|---|
| Amaç | Birleşen her değişikliğin derlendiğini ve testleri geçtiğini kanıtlamak | Doğrulanmış her değişikliği canlıya çıkmaya hazır tutmak |
| Başlangıç noktası | Paylaşılan depoya gelen bir push ya da pull request | Ana branch'te CI'dan geçmiş bir build |
| Bitiş noktası | Ana branch'te doğrulanmış kod | Tek bir rutin adımla yayına girebilecek, test edilmiş bir çıktı |
| Tipik adımlar | Kurulum, derleme, lint, birim ve entegrasyon testleri | Staging'e dağıtım; kabul, performans ve güvenlik kontrolleri |
| Geri bildirim süresi | Dakikalar; yaklaşık on dakika yaygın bir hedeftir | Daha uzun; çıktı her ortamdan sırayla geçer |
| Yayın kararı | Yok: CI hiçbir şeyi dağıtmaz | Bir kişi onaylar; sürekli dağıtımda ise pipeline karar verir |
| Temel alışkanlıklar | Küçük, sık birleştirmeler ve kırmızı build'i önce düzeltmek | Bir kez derlemek, aynı çıktıyı ilerletmek, her ortamı otomatikleştirmek |
| Gerektirdikleri | Otomatik testler ve paylaşılan bir ana branch | Çalışan bir CI, otomatik dağıtımlar ve izleme |
Fark, açıklamalı
Sürekli entegrasyon (CI), küçük değişiklikleri en az günde bir kez paylaşılan ana branch'e birleştirme ve her birleştirmeyi otomatik bir derleme ve test çalıştırmasıyla denetleme pratiğidir. Sürekli teslimat (CD) ise CI'ın bittiği yerden devralır: testleri geçen her değişiklik, staging ortamları ve ek testlerle otomatik bir dağıtım hattında (deployment pipeline) ilerlemeye devam eder; böylece yazılım her an canlı ortama çıkarılabilir.
Asıl fark, her birinin yanıtladığı sorudadır. CI, birleşen kodun hâlâ çalışıp çalışmadığını sorar ve ana branch'te doğrulanmış kodla, ideal olarak bir push'tan sonraki yaklaşık on dakika içinde biter. CD ise o kodun güvenle yayına girip giremeyeceğini sorar ve tek bir rutin adımla yayınlanabilecek, test edilmiş bir çıktıyla, örneğin bir konteyner imajıyla biter.
CD harfleri sürekli dağıtım (continuous deployment) anlamına da gelir; o da bir adım daha ileri gidip elle verilen onayı kaldırır: pipeline'ı geçen her değişiklik otomatik olarak, çoğu zaman günde birçok kez canlıya çıkar. Sürekli teslimatta ne zaman yayınlanacağına bir kişi karar verir; sürekli dağıtımda kararı pipeline verir. Bunun için çok güvenilir bir test takımı, iyi bir izleme ve canary dağıtımları, otomatik geri almalar ve feature flag'ler gibi güvenlik ağları gerekir.
İkisi birbirinin alternatifi değil, tek bir hattın aşamalarıdır; bu yüzden birlikte CI/CD diye yazılırlar: CD, CI'ın üzerine kurulur ve CI olmadan teslim edilecek güvenilir bir şey yoktur. Sık yapılan bir yanlış, bir CI aracına sahip olmanın CI yapmak demek olduğunu düşünmektir; oysa haftalarca yaşayan feature branch'lerde build çalıştırmak, küçük değişiklikleri sık sık entegre etme amacını ıskalar. Bir diğeri, sürekli teslimatın durmadan yayın yapmak demek olduğu düşüncesidir: aslında her an yayın yapabilmek demektir; zamanlama ise bir iş kararı olarak kalabilir.
Hangisini kullanmalısınız?
Sürekli Entegrasyon şu durumlarda doğru seçim:
- Yeni başlıyorsunuz: CI, her teslimat hattının ihtiyaç duyduğu temeldir.
- Birleştirmeler sancılı geçiyor ve bozuk build'ler günler sonra fark ediliyor.
- Her pull request için hızlı geri bildirim istiyorsunuz.
- Yayınlar, uygulama mağazası güncellemeleri gibi sabit bir takvimi izliyor ama kodun her gün sağlıklı kalması gerekiyor.
Sürekli Teslimat şu durumlarda doğru seçim:
- CI zaten güvenilir, ama yayınlar hâlâ yavaş, elle yapılıyor ya da riskli.
- Küçük değişiklikleri, iş tarafı ne zaman isterse o zaman yayına almak istiyorsunuz.
- Her ortam otomatik olarak oluşturulup dağıtılabiliyor.
- Testler, izleme ve geri alma mekanizmaları sürekli dağıtıma geçecek kadar güçlü.
GitHub Actions'ta bir CI iş akışı ve bir CD iş akışı
# CI: verify every pull request and every push to main
on:
pull_request:
push: { branches: [main] }
jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- run: npm ci
- run: npm test
- run: npm run build# CD: deploy each verified build to staging, then to production
on: { push: { branches: [main] } }
jobs:
staging:
runs-on: ubuntu-latest
steps: [{ uses: actions/checkout@v5 }, { run: ./deploy.sh staging }]
production:
needs: staging
environment: production # with required reviewers: continuous delivery
runs-on: ubuntu-latest # without them: continuous deployment
steps: [{ uses: actions/checkout@v5 }, { run: ./deploy.sh production }]Sık sorulan sorular
CD, sürekli teslimat mı yoksa sürekli dağıtım mı demek?
İkisi de kullanılır. Sürekli teslimat her değişikliği hazır tutar ve yayını bir kişiye bırakır; sürekli dağıtım ise testleri geçen her değişikliği otomatik olarak yayınlar. Canlıya çıkışlar bir onay gerektiriyorsa bu sürekli teslimattır.
CD olmadan CI olabilir mi?
Evet, birçok ekip de böyle başlar: her değişiklik derlenir ve test edilir, ama yayınlar hâlâ elle hazırlanır. Tersi işlemez, çünkü sürekli teslimat, doğrulanmış build'leri sağlaması için CI'a dayanır.
CI ve CD için hangi araçlar kullanılır?
Genellikle aynı araçlar: GitHub Actions, GitLab CI, Jenkins ve benzeri servisler hem CI kontrollerini hem de dağıtım hattını çalıştırır. Bazı ekipler bunlara Kubernetes için Argo CD gibi ayrı dağıtım araçları ekler.