CI/CD Nedir?
CI/CD, yazılım geliştirme süreçlerinde kod değişikliklerinin otomatik olarak derlenmesi, test edilmesi ve dağıtılmasını sağlayan bir metodoloji ve uygulama kümesidir. CI (Continuous Integration - Sürekli Entegrasyon) ve CD (Continuous Delivery/Deployment - Sürekli Teslimat/Dağıtım) olmak üzere iki temel bileşenden oluşur. Bu yaklaşım, yazılım teslimat süreçlerini hızlandırır, hata oranını düşürür ve ekip verimliliğini artırır.
Geleneksel yazılım geliştirme süreçlerinde, kod değişiklikleri haftalarca veya aylarca birikerek büyük "Big Bang" dağıtımları yapılırdı. Bu yaklaşım genellikle entegrasyon sorunlarına, uzun hata ayıklama sürelerine ve stresli dağıtım gecelerine yol açardı. CI/CD, bu sorunları küçük ve sık dağıtımlar yaparak çözer.
Sürekli Entegrasyon (CI) Kavramı
Sürekli Entegrasyon, geliştiricilerin kod değişikliklerini sık ve düzenli olarak paylaşılan bir ana dal ile birleştirmesini ve her birleştirme sonrasında otomatik derleme ve test süreçlerinin çalıştırılmasını ifade eder. CI'ın temel amacı, entegrasyon sorunlarını erken aşamada tespit etmek ve düzeltmektir.
CI'ın Temel İlkeleri
- Tek kaynak kod deposu: Tüm ekip üyeleri aynı kod deposu üzerinde çalışır
- Otomatik derleme: Her kod değişikliği otomatik olarak derlenir
- Otomatik test: Birim testleri, entegrasyon testleri ve diğer testler otomatik çalıştırılır
- Sık entegrasyon: Geliştiriciler günde en az bir kez kodlarını birleştirir
- Hızlı geri bildirim: Derleme ve test sonuçları hızlıca geliştiricilere bildirilir
- Şeffaf süreç: Herkes derleme durumunu ve test sonuçlarını görebilir
CI Sürecinin Adımları
Tipik bir CI süreci şu adımlardan oluşur:
- Geliştirici kodu yerel ortamda yazar ve test eder
- Değişiklikler sürüm kontrol sistemine gönderilir (git push)
- CI sunucusu değişikliği algılar ve pipeline'ı tetikler
- Kaynak kod derlenir
- Birim testleri çalıştırılır
- Kod kalite analizi yapılır (linting, statik analiz)
- Entegrasyon testleri çalıştırılır
- Sonuçlar raporlanır ve ekip bilgilendirilir
Sürekli Teslimat ve Sürekli Dağıtım Arasındaki Fark
Sürekli Teslimat (Continuous Delivery) ve Sürekli Dağıtım (Continuous Deployment) kavramları sıklıkla karıştırılır ancak aralarında önemli bir fark vardır.
Sürekli Teslimat: Kod değişiklikleri otomatik olarak derlenir, test edilir ve üretime dağıtıma hazır hale getirilir. Ancak üretim ortamına dağıtım manuel onay gerektirir. Bu yaklaşım, ekiplerin dağıtım zamanlamasını kontrol etmesini sağlar.
Sürekli Dağıtım: Sürekli Teslimat'ın bir adım ötesidir. Tüm testlerden başarıyla geçen her değişiklik otomatik olarak üretim ortamına dağıtılır. Manuel onay adımı yoktur. Bu yaklaşım, en üst düzey otomasyon ve güven gerektirir.
| Özellik | Sürekli Teslimat | Sürekli Dağıtım |
|---|---|---|
| Manuel onay | Gerekli | Gerekli değil |
| Otomasyon seviyesi | Yüksek | Tam |
| Dağıtım sıklığı | Ekip kararı | Her başarılı değişiklik |
| Risk seviyesi | Düşük-Orta | Düşük (kapsamlı test gerektirir) |
| Uygunluk | Çoğu organizasyon | Olgun DevOps ekipleri |
Pipeline Aşamaları
Bir CI/CD pipeline'ı, kod değişikliğinin üretim ortamına ulaşana kadar geçtiği tüm aşamaları tanımlar. İyi tasarlanmış bir pipeline, hızlı geri bildirim sağlarken kapsamlı kalite kontrolü de gerçekleştirir.
Kaynak Aşaması (Source)
Pipeline, sürüm kontrol sistemindeki bir değişiklikle tetiklenir. Git push, pull request oluşturma veya dal birleştirme gibi olaylar pipeline'ı başlatabilir. Bu aşamada kaynak kod indirilir ve sonraki aşamalar için hazırlanır.
Derleme Aşaması (Build)
Kaynak kod derlenir, bağımlılıklar çözülür ve uygulama artefaktları oluşturulur. Docker kullanılan projelerde bu aşamada konteyner imajı da oluşturulabilir.
Test Aşaması (Test)
Bu aşama genellikle birden fazla test türünü içerir:
- Birim Testleri: Bireysel bileşenlerin doğru çalıştığını kontrol eder
- Entegrasyon Testleri: Bileşenler arası etkileşimleri doğrular
- Fonksiyonel Testler: İş gereksinimlerinin karşılandığını test eder
- Güvenlik Testleri: Güvenlik açıklarını tarar (SAST, DAST)
- Performans Testleri: Yük ve stres testleri çalıştırır
Dağıtım Aşaması (Deploy)
Tüm testlerden geçen artefakt, hedef ortama dağıtılır. Bu aşama genellikle staging ve üretim olmak üzere birden fazla ortamı içerir.
Popüler CI/CD Araçları
CI/CD pipeline'ları oluşturmak için birçok araç mevcuttur. Her birinin kendine özgü avantajları ve kullanım senaryoları vardır.
GitHub Actions
GitHub Actions, GitHub ile tamamen entegre çalışan bir CI/CD platformudur. YAML tabanlı iş akışları ile pipeline'lar tanımlanır ve GitHub Marketplace'teki binlerce hazır action ile genişletilebilir.
name: .NET CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore --configuration Release
- name: Test
run: dotnet test --no-build --configuration Release --verbosity normal
- name: Publish
run: dotnet publish --no-build --configuration Release --output ./publish
- name: Deploy to Azure
if: github.ref == 'refs/heads/main'
uses: azure/webapps-deploy@v2
with:
app-name: 'my-web-app'
publish-profile: ${{ secrets.AZURE_PUBLISH_PROFILE }}
package: ./publish
Jenkins
Jenkins, en eski ve en yaygın kullanılan açık kaynaklı CI/CD sunucusudur. Binlerce eklentisi ile neredeyse her teknoloji ve araçla entegre çalışabilir. Jenkinsfile ile pipeline tanımları kod olarak saklanabilir.
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'dotnet build --configuration Release'
}
}
stage('Test') {
steps {
sh 'dotnet test --configuration Release'
}
}
stage('Deploy to Staging') {
when { branch 'develop' }
steps {
sh './deploy.sh staging'
}
}
stage('Deploy to Production') {
when { branch 'main' }
steps {
input message: 'Deploy to production?'
sh './deploy.sh production'
}
}
}
post {
failure {
mail to: '[email protected]',
subject: "Pipeline Failed: ${currentBuild.fullDisplayName}",
body: "Check: ${env.BUILD_URL}"
}
}
}
GitLab CI/CD
GitLab CI/CD, GitLab platformuyla yerleşik olarak gelen bir CI/CD çözümüdür. .gitlab-ci.yml dosyası ile pipeline'lar tanımlanır. Auto DevOps özelliği ile sıfır yapılandırma ile otomatik pipeline'lar oluşturulabilir.
Azure DevOps
Azure DevOps, Microsoft'un sunduğu kapsamlı bir DevOps platformudur. Azure Pipelines, YAML veya görsel tasarımcı ile pipeline oluşturmayı destekler. Azure bulut hizmetleri ile derin entegrasyona sahiptir ve .NET projeler için özellikle güçlü bir tercihtir.
Test Stratejileri
Etkili bir CI/CD pipeline'ı, kapsamlı ve hızlı test stratejileri gerektirir. Test piramidi kavramı, farklı test türlerinin oranını ve önceliğini belirler.
Test Piramidi
Test piramidi, en altta çok sayıda hızlı birim testinin, ortada daha az sayıda entegrasyon testinin ve en üstte az sayıda uçtan uca testin bulunması gerektiğini önerir:
- Birim Testleri (çok sayıda): Milisaniyeler içinde çalışır, tek bir birimi test eder
- Entegrasyon Testleri (orta sayıda): Saniyeler içinde çalışır, bileşenler arası etkileşimi test eder
- E2E Testleri (az sayıda): Dakikalar sürebilir, kullanıcı senaryolarını test eder
Pipeline'da Test Paralelleştirme
Test süresini kısaltmak için testler paralel olarak çalıştırılabilir. Birçok CI/CD aracı, test setlerini otomatik olarak birden fazla çalıştırıcıya bölebilir. Bu sayede binlerce test dakikalar yerine saniyeler içinde tamamlanabilir.
Dağıtım Stratejileri
Üretim ortamına dağıtım yaparken riskleri minimize etmek için çeşitli stratejiler kullanılabilir. Her stratejinin kendine özgü avantajları ve kullanım senaryoları vardır.
Blue-Green Dağıtım
Blue-Green dağıtımda iki özdeş üretim ortamı bulunur: biri aktif (Blue), diğeri pasif (Green). Yeni sürüm pasif ortama dağıtılır ve test edilir. Sorun yoksa trafik yeni ortama yönlendirilir. Sorun olursa anında eski ortama geri dönülebilir.
Blue-Green dağıtım, sıfır kesinti süresi sağlar ve geri dönüş işlemi saniyeler içinde gerçekleştirilebilir. Ancak iki kat altyapı maliyeti gerektirir.
Canary Dağıtım
Canary dağıtımda yeni sürüm, önce trafiğin küçük bir yüzdesi (örneğin %5) ile test edilir. Metriklere göre yeni sürüm sorunsuz çalışıyorsa trafik yüzdesi kademeli olarak artırılır. Sorun tespit edilirse trafik eski sürüme yeniden yönlendirilir.
Rolling (Kademeli) Dağıtım
Rolling dağıtımda, eski sürüm örnekleri kademeli olarak yeni sürüm ile değiştirilir. Kubernetes'in varsayılan dağıtım stratejisidir. Ek altyapı gerektirmez ancak geri dönüş süresi diğer stratejilere göre daha uzundur.
| Strateji | Kesinti Süresi | Geri Dönüş Hızı | Kaynak Kullanımı | Risk Seviyesi |
|---|---|---|---|---|
| Blue-Green | Sıfır | Çok hızlı | 2x kaynak | Düşük |
| Canary | Sıfır | Hızlı | Az ek kaynak | Çok düşük |
| Rolling | Sıfır | Orta | Ek kaynak yok | Orta |
| Recreate | Kısa kesinti | Yavaş | Ek kaynak yok | Yüksek |
Altyapı Kodlaması (Infrastructure as Code)
CI/CD pipeline'ları ile birlikte altyapının da kod olarak yönetilmesi modern DevOps pratiklerinin temelini oluşturur. Terraform, Pulumi ve CloudFormation gibi araçlar, altyapı kaynaklarını bildirimsel olarak tanımlamanızı ve sürüm kontrolü altında tutmanızı sağlar.
IaC'nin CI/CD pipeline'ına entegrasyonu, altyapı değişikliklerinin de aynı kalite kontrollerinden geçmesini sağlar. Bu sayede altyapı değişiklikleri güvenli, tekrarlanabilir ve denetlenebilir hale gelir.
Pipeline İzleme ve Optimizasyon
CI/CD pipeline'larının sürekli izlenmesi ve optimize edilmesi, geliştirici deneyimini iyileştirir ve yazılım teslimat hızını artırır.
Önemli Metrikler
- Pipeline çalışma süresi: Pipeline'ın baştan sona ne kadar sürdüğü
- Başarı oranı: Pipeline çalışmalarının başarıyla tamamlanma yüzdesi
- Hata tespit süresi: Bir hatanın pipeline'da ne kadar çabuk tespit edildiği
- Dağıtım sıklığı: Belirli bir sürede kaç dağıtım yapıldığı
- Kurtarma süresi (MTTR): Bir hatadan kurtulma süresi
Pipeline Optimizasyon Teknikleri
- Bağımlılık önbelleğe alma (dependency caching) kullanarak indirme sürelerini azaltın
- Paralel adımlar ile toplam süreyi kısaltın
- Artımlı derleme ile yalnızca değişen bileşenleri derleyin
- Test paralelleştirme ile test süresini düşürün
- Gereksiz adımları kaldırarak pipeline'ı sadeleştirin
CI/CD En İyi Uygulamaları
Başarılı bir CI/CD implementasyonu için aşağıdaki en iyi uygulamaları göz önünde bulundurun:
- Her şeyi kod olarak tanımlayın: Pipeline tanımlarını, altyapıyı ve yapılandırmaları sürüm kontrolünde tutun
- Hızlı geri bildirim sağlayın: Pipeline süresini 10 dakikanın altında tutmaya çalışın
- Ana dalı her zaman dağıtılabilir tutun: Bozuk testlerle birleştirme yapmayın
- Güvenliği pipeline'a entegre edin (DevSecOps): Güvenlik taramalarını otomatikleştirin
- Gizli bilgileri güvenli saklayın: Parolaları ve anahtarları secret manager'da tutun
- Pipeline'ı aşamalı olarak geliştirin: Küçük başlayın ve zaman içinde olgunlaştırın
- Geri dönüş planı hazırlayın: Her dağıtım için otomatik geri dönüş mekanizması kurun
- Metrikleri takip edin: DORA metriklerini izleyerek sürekli iyileştirme yapın
Sonuç
CI/CD, modern yazılım geliştirme süreçlerinin vazgeçilmez bir parçasıdır. Doğru uygulandığında dağıtım sıklığını artırır, hata oranını düşürür, kurtarma süresini kısaltır ve ekip moralini yükseltir. İster GitHub Actions, ister Jenkins, ister Azure DevOps kullanın; önemli olan tutarlı, güvenilir ve otomatik bir pipeline oluşturmaktır.
CI/CD yolculuğunuza basit bir pipeline ile başlayarak zaman içinde test kapsamını genişletin, dağıtım stratejilerinizi olgunlaştırın ve izleme yeteneklerinizi güçlendirin. Sürekli iyileştirme yaklaşımı, CI/CD'nin kendisi gibi bir yolculuktur; hedef bir son noktaya ulaşmak değil, sürekli olarak daha iyi olmaktır.