Ana içeriğe geç

CI/CD Dokümantasyonu

İçindekiler


Genel Bakış

SERENDER Banking servisi, kod doğrulamadan production deployment'a kadar tüm yazılım teslim sürecini otomatikleştiren GitHub Actions ile inşa edilmiş kapsamlı bir CI/CD pipeline kullanır. Pipeline iki ana workflow'dan oluşur:

  1. PR Doğrulama Pipeline'ı (pr.yml) - Build, test ve kod kalitesi kontrolleri ile pull request'leri doğrular
  2. CI/CD Pipeline'ı (ci.yml) - Semantic versioning ve Kubernetes deployment ile otomatik deployment'ı yönetir

Pull Request Doğrulama Pipeline'ı (pr.yml)

Tetikleme Koşulları

PR doğrulama pipeline'ı aşağıdaki branch'leri hedefleyen pull request'lerde tetiklenir: - develop - test - main

Pipeline Job'ları

1. Build & Test Job'ı

Amaç: Otomatik testler yoluyla kod kalitesi ve fonksiyonalitesini doğrular

Adımlar: 1. Kod Checkout: Pull request branch'inden en güncel kodu alır 2. .NET Ortam Kurulumu: .NET 9.0.x SDK'sını yapılandırır 3. Dependency Restore: Tüm NuGet paketlerini indirir ve restore eder

dotnet restore Serender.Banking.sln
4. Solution Build: Tüm solution'ı Release konfigürasyonunda derler
dotnet build Serender.Banking.sln --configuration Release --no-restore
5. Test Çalıştırma: Kod coverage toplama ile tüm test türlerini çalıştırır
dotnet test Serender.Banking.sln \
  --configuration Release \
  --no-build \
  /p:CollectCoverage=true \
  /p:CoverletOutputFormat=opencover
6. Artifact Upload: Test sonuçları ve coverage raporlarını sonraki analiz için saklar

Kapsanan Test Türleri: - Unit Test'ler: Bireysel bileşen testleri - Integration Test'ler: Servis etkileşim testleri - Contract Test'ler: Pact ile API contract doğrulaması

2. SonarQube Analiz Job'ı

Amaç: Kod kalitesi, güvenlik açıkları ve sürdürülebilirlik için statik kod analizi yapar

Bağımlılık: Build & Test job'ının başarılı tamamlanmasını gerektirir

Adımlar: 1. Kod Checkout: Doğru analiz için tüm git geçmişini alır 2. Coverage Raporları İndirme: Önceki job'dan test coverage verilerini alır 3. Java Ortam Kurulumu: JDK 17'yi yapılandırır (SonarQube scanner için gerekli) 4. .NET SDK Kurulumu: Kod analizi için .NET 9.0.x'i yapılandırır 5. SonarScanner Kurulumu: Global .NET SonarQube scanner aracını kurar 6. Analiz Çalıştırma: Kapsamlı kod analizi gerçekleştirir

dotnet-sonarscanner begin \
  /k:"Serender-fixedassets" \
  /d:sonar.host.url="${{ secrets.SONAR_HOST_URL }}" \
  /d:sonar.login="$SONAR_TOKEN" \
  /d:sonar.cs.opencover.reportsPaths="**/*.opencover.xml"

dotnet build Serender.Banking.sln --configuration Release

dotnet-sonarscanner end /d:sonar.login="$SONAR_TOKEN"

Analiz İçeriği: - Kod duplikasyonu tespiti - Güvenlik açığı taraması - Kod karmaşıklığı analizi - Test coverage entegrasyonu - Teknik borç değerlendirmesi

CI/CD Pipeline'ı (ci.yml)

Tetikleme Koşulları

CI/CD pipeline'ı aşağıdaki branch'lere push'larda tetiklenir: - develop - Development ortamı - test - Test ortamı - main - Production ortamı

Pipeline Job'ları

1. Docker Build & Push Job'ı

Amaç: Docker image'ları oluşturur ve semantic versioning'i yönetir

Temel Özellikler: - Multi-architecture desteği (ARM64, AMD64) - Branch adlandırma konvansiyonlarına dayalı semantic versioning - Çift registry push (Docker Hub + GitHub Container Registry)

Adımlar:

  1. Kod Checkout: Versiyon analizi için tüm git geçmişini alır
  2. Semantic Versiyon Üretimi:
  3. Git tag'leri ve branch adlarını analiz eder
  4. Uygun versiyon artırma stratejisini belirler
  5. Yeni semantic versiyon oluşturur

  6. Docker Ortam Kurulumu:

  7. QEMU Kurulumu: Multi-architecture build'leri etkinleştirir
  8. Buildx Kurulumu: Gelişmiş Docker build özelliklerini yapılandırır

  9. Registry Kimlik Doğrulama:

  10. GitHub Container Registry: Yerleşik GITHUB_TOKEN kullanır
  11. Docker Hub: Organizasyon secret'larını kullanır (DOCKERHUB_USERNAME, DOCKERHUB_TOKEN)

  12. Image Build & Push:

    docker buildx build \
      --context . \
      --file Bootstrap/Serender.Bootstrap/Dockerfile \
      --platform linux/amd64,linux/arm64 \
      --push \
      --tag teknosol/banking:${NEW_VERSION} \
      --tag teknosol/banking:latest
    

  13. Git Tag Oluşturma: Repository'ye versiyon tag'leri oluşturur ve push'lar

2. Kubernetes Deployment Job'ı

Amaç: Yeni Docker image'ını Kubernetes cluster'larına deploy eder

Bağımlılık: Başarılı Docker build job'ını gerektirir

Ortam Seçimi: - main branch → serender-prod namespace (Production) - Diğer branch'ler → serender-test namespace (Testing)

Adımlar: 1. Kod Checkout: Deployment konfigürasyonlarını alır 2. Namespace Seçimi: Hedef ortamı belirler 3. Image Güncelleme: Kubernetes deployment'ı yeni image ile günceller

kubectl set image -n ${NAMESPACE} \
  deployment/banking-deployment \
  banking=teknosol/banking:${NEW_VERSION}
4. Rollout İzleme: Başarılı deployment tamamlanmasını bekler
kubectl rollout status deployment/banking-deployment \
  -n ${NAMESPACE} --timeout=180s

Branch Tabanlı Semantic Versioning

Pipeline, branch adlandırma konvansiyonlarına dayalı akıllı semantic versioning uygular:

Versiyon Artırma Kuralları

Branch Deseni Versiyon Artırma Örnek Açıklama
feature!/* Major 2.0.03.0.0 Breaking değişiklikler
feature/* Minor 2.0.02.1.0 Yeni özellikler
bugfix/* Patch 2.0.02.0.1 Hata düzeltmeleri
hotfix/* Patch 2.0.02.0.1 Kritik düzeltmeler
Diğer branch'ler Patch 2.0.02.0.1 Varsayılan artırma

Versiyon Üretim Süreci

  1. En Son Tag Tespiti: En güncel semantic versiyon tag'ini bulur
  2. Branch Analizi: Branch adını veya merge commit mesajını inceler
  3. Versiyon Hesaplama: Uygun artırma kuralını uygular
  4. Tag Oluşturma: Üretilen versiyonla yeni git tag'i oluşturur

Deployment Stratejisi

Ortam Eşleştirme

  • Development: develop branch → serender-test namespace
  • Testing: test branch → serender-test namespace
  • Production: main branch → serender-prod namespace

Deployment Süreci

  1. Image Tag Güncelleme: Kubernetes deployment manifest'ini günceller
  2. Rolling Update: Sıfır kesinti ile deployment gerçekleştirir
  3. Health Check'ler: Pod hazırlığı ve servis erişilebilirliğini izler
  4. Rollback Desteği: Deployment başarısızlığında otomatik geri alma

İzleme ve Loglama

  • Deployment Durumu: Gerçek zamanlı rollout izleme
  • Versiyon Takibi: Git SHA ve versiyon loglaması
  • Namespace Doğrulama: Ortam onaylaması

Ön Gereksinimler

Repository Secret'ları

GitHub repository ayarlarında aşağıdaki secret'ları yapılandırın:

Secret Adı Açıklama Gerekli Olan
DOCKERHUB_USERNAME Docker Hub kullanıcı adı Docker registry push
DOCKERHUB_TOKEN Docker Hub erişim token'ı Docker registry push
SONAR_TOKEN SonarQube kimlik doğrulama token'ı Kod kalitesi analizi
SONAR_HOST_URL SonarQube sunucu URL'si Kod kalitesi analizi

Self-hosted Runner Gereksinimleri

  • Docker Engine Buildx desteği ile
  • kubectl Kubernetes cluster'ları için yapılandırılmış
  • .NET 9.0 SDK
  • Java 17 (SonarQube analizi için)

Kubernetes Cluster Kurulumu

  • Yapılandırılmış namespace'ler (serender-test, serender-prod)
  • Deployment manifest'leri (banking-deployment)
  • Uygun izinlere sahip service account

Sorun Giderme

Yaygın Sorunlar

1. Docker Build Hataları

Belirtiler: Docker image oluşturma sırasında build başarısız oluyor Çözümler: - Dockerfile syntax ve path'leri kontrol edin - Base image erişilebilirliğini doğrulayın - Runner'da yeterli disk alanı olduğundan emin olun

2. Versiyon Üretim Sorunları

Belirtiler: Yanlış versiyon numaraları veya duplike tag'ler Çözümler: - Git tag formatının semver'i takip ettiğini doğrulayın (v1.2.3) - Branch adlandırma konvansiyonlarını kontrol edin - Checkout action'da fetch-depth: 0 olduğundan emin olun

3. Kubernetes Deployment Hataları

Belirtiler: Deployment rollout timeout'ları veya başarısızlıkları Çözümler: - kubectl konfigürasyonu ve izinlerini doğrulayın - Kubernetes cluster sağlığını kontrol edin - Deployment manifest syntax'ini validate edin

4. SonarQube Analiz Hataları

Belirtiler: Kod kalitesi analizi başarısız oluyor veya raporlar eksik Çözümler: - SonarQube sunucu bağlantısını doğrulayın - Kimlik doğrulama token'larını kontrol edin - Test coverage dosyalarının üretildiğinden emin olun