Ana içeriğe geç

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ı oku

Sü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ı oku

Sürekli Entegrasyon ve Sürekli Teslimat karşılaştırması

ÖzellikSürekli EntegrasyonSürekli Teslimat
AmaçBirleşen her değişikliğin derlendiğini ve testleri geçtiğini kanıtlamakDoğrulanmış her değişikliği canlıya çıkmaya hazır tutmak
Başlangıç noktasıPaylaşılan depoya gelen bir push ya da pull requestAna branch'te CI'dan geçmiş bir build
Bitiş noktasıAna branch'te doğrulanmış kodTek bir rutin adımla yayına girebilecek, test edilmiş bir çıktı
Tipik adımlarKurulum, derleme, lint, birim ve entegrasyon testleriStaging'e dağıtım; kabul, performans ve güvenlik kontrolleri
Geri bildirim süresiDakikalar; yaklaşık on dakika yaygın bir hedeftirDaha uzun; çıktı her ortamdan sırayla geçer
Yayın kararıYok: CI hiçbir şeyi dağıtmazBir kişi onaylar; sürekli dağıtımda ise pipeline karar verir
Temel alışkanlıklarKüçük, sık birleştirmeler ve kırmızı build'i önce düzeltmekBir kez derlemek, aynı çıktıyı ilerletmek, her ortamı otomatikleştirmek
GerektirdikleriOtomatik 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ışı

Sürekli Entegrasyonyaml
# 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
Sürekli Teslimatyaml
# 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.

Daha fazla

Ayarlar