Modern DevOps ve CI/CD Araçları

Modern yazılım geliştirme süreçlerinde kullanılan CI/CD araçları (GitHub Actions, GitLab CI, Azure DevOps), containerization (Docker), orchestration (Kubernetes), Infrastructure as Code (Terraform, Bicep), monitoring, logging ve otomasyon stratejileri ile .NET ekosisteminde bu araçların nasıl kullanılacağı ele alınır.

Modern DevOps ve CI/CD Araçları

Yazılım Geliştirme Araçları ve Otomasyon: Modern DevOps Toolchain

Günümüzde yazılım geliştirme, yalnızca kod yazmaktan ibaret değildir. Başarılı bir yazılım teslimatı; kodun derlenmesi, test edilmesi, güvenlik taramaları, konteynerleştirilmesi, altyapıya dağıtılması, izlenmesi ve sürekli iyileştirilmesi gibi bir dizi otomasyon sürecini gerektirir. Bu süreçlerin yönetildiği araçlara modern DevOps toolchain adı verilir. Bu yazıda, yazılım geliştirme yaşam döngüsünün her aşamasında kullanılan temel araçları, .NET ekosistemindeki karşılıklarını ve entegrasyon stratejilerini detaylıca ele alacağız.


1. Kaynak Kod Yönetimi ve İş Birliği (Source Control & Collaboration)

Merkezi depo ve sürüm kontrolü, modern yazılım geliştirmenin temelidir.

  • Git: Dağıtık sürüm kontrol sisteminin tartışmasız standardı.

  • GitHub: En popüler Git tabanlı platform. GitHub Actions ile entegre CI/CD, paket yönetimi (GitHub Packages), güvenlik (Dependabot, Secret Scanning) ve proje yönetimi sunar.

  • GitLab: GitHub'a güçlü bir alternatif. Entegre CI/CD, container registry, Kubernetes entegrasyonu ve "Tek bir uygulama" (single application) felsefesiyle tüm DevOps süreçlerini tek bir yerde sunar.

  • Azure DevOps: Microsoft'un uçtan uca DevOps çözümü. Repos, Pipelines, Boards, Test Plans ve Artifacts modülleriyle .NET projeleri için en doğal entegrasyonu sunar.

En İyi Pratikler:

  • Branch Stratejisi: GitHub Flow, GitFlow veya Trunk-Based Development.

  • Pull Request (PR) Süreci: Kod incelemeleri (code review), otomatik CI kontrolleri, güvenlik taramaları.

  • Conventional Commits: Commit mesajlarını standartlaştırmak.


2. CI/CD (Sürekli Entegrasyon ve Sürekli Dağıtım)

CI/CD, yazılım teslimat hızını ve kalitesini artıran otomasyonun kalbidir.

A. CI (Sürekli Entegrasyon): Her kod değişikliğinde (push, PR) otomatik olarak:

  • Kod derlenir (build).

  • Birim testleri (unit tests) ve entegrasyon testleri çalıştırılır.

  • Kod kalitesi (SonarQube) ve güvenlik taramaları (SAST) yapılır.

  • Paket oluşturulur (NuGet, NPM, Docker image).

B. CD (Sürekli Dağıtım): Başarılı CI sonrası:

  • Paketler otomatik olarak farklı ortamlara (dev, test, staging, production) dağıtılır.

  • Deployment stratejileri (Rolling, Blue/Green, Canary) uygulanır.

Popüler CI/CD Araçları ve .NET Entegrasyonu:

Araç Özellikler .NET Entegrasyonu
GitHub Actions YAML tabanlı workflow; 500MB depolama, 2000 dakika/ay ücretsiz. actions/setup-dotnet, dotnet restore, dotnet build, dotnet test, dotnet publish
GitLab CI .gitlab-ci.yml dosyası; built-in container registry. image: mcr.microsoft.com/dotnet/sdk
Azure Pipelines YAML veya klasik editor; Windows/Linux/macOS agent desteği. .NET Core task, DotNetCoreCLI
Jenkins Açık kaynak, eklenti zenginliği. .NET eklentileri, dotnet CLI komutları

GitHub Actions ile .NET Projesi CI/CD Örneği:

yaml

name: .NET CI/CD

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

env:
  DOTNET_VERSION: '8.0.x'

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Setup .NET
      uses: actions/setup-dotnet@v3
      with:
        dotnet-version: ${{ env.DOTNET_VERSION }}
    - name: Restore dependencies
      run: dotnet restore
    - name: Build
      run: dotnet build --no-restore -c Release
    - name: Run Tests
      run: dotnet test --no-build -c Release --verbosity normal

  deploy:
    needs: build-and-test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
    - name: Deploy to Azure Web App
      uses: azure/webapps-deploy@v2
      with:
        app-name: 'myapp'
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        package: './**/*.zip'

3. Konteynerleştirme (Containerization) ve Orchestration

A. Docker: Uygulama ve bağımlılıklarını izole edilmiş bir konteynerda paketleme.

dockerfile

# Dockerfile (.NET 8)
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 8080

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyApp.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]

B. Kubernetes: Konteynerların orkestrasyonu, otomatik ölçeklendirme, yük dengeleme, self-healing.

yaml

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myregistry/myapp:latest
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer

4. Infrastructure as Code (IaC)

Altyapı kaynaklarının (VM, DB, network, load balancer) kod ile tanımlanması ve versiyonlanması.

  • Terraform: Sağlayıcıdan bağımsız (AWS, Azure, GCP) en popüler IaC aracı.

  • Azure Bicep: Azure'a özel, Terraform'dan daha basit ve okunabilir.

  • ARM Templates: Azure Resource Manager şablonları (JSON).

Terraform ile Azure Web App (Özet):

hcl

# main.tf
resource "azurerm_app_service_plan" "asp" {
  name                = "my-asp"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  sku {
    tier = "Standard"
    size = "S1"
  }
}

resource "azurerm_app_service" "app" {
  name                = "my-app"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  app_service_plan_id = azurerm_app_service_plan.asp.id
}

5. Paket Yönetimi (Package Management)

  • NuGet: .NET ekosisteminin resmi paket yöneticisi.

  • NuGet.org: Kamu paket deposu.

  • Azure Artifacts / GitHub Packages: Özel paket depolama.

xml

<!-- .csproj'de paket referansı -->
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />

6. Güvenlik ve Kod Kalitesi Araçları

  • SAST (Static Application Security Testing): SonarQube, Checkmarx, GitHub CodeQL.

  • SCA (Software Composition Analysis): Dependabot, Snyk, WhiteSource.

  • Secret Scanning: GitHub Secret Scanning, GitLeaks, TruffleHog.

yaml

# GitHub CodeQL ile SAST
- name: Initialize CodeQL
  uses: github/codeql-action/init@v2
  with:
    languages: csharp
- name: Autobuild
  uses: github/codeql-action/autobuild@v2
- name: Perform CodeQL Analysis
  uses: github/codeql-action/analyze@v2

7. İzleme (Monitoring) ve Gözlemlenebilirlik (Observability)

Detaylı içerik için önceki konuya (Observability) bakınız. Kısaca:

  • Logging: Serilog + Elasticsearch + Kibana.

  • Metrics: OpenTelemetry + Prometheus + Grafana.

  • Traces: OpenTelemetry + Jaeger.

  • Health Checks: .NET HealthCheck middleware + Kubernetes livenessProbe / readinessProbe.


8. Otomasyon Araçları ve Senaryolar

Araç Kullanım Alanı
PowerShell / Bash Script otomasyonu, ortam hazırlığı, deployment öncesi/sonrası işlemler.
Task Runner (Make, Cake, Nuke) Build görevlerini otomatikleştirme.
Terraform Altyapı sağlama (provisioning).
Ansible / Chef / Puppet Konfigürasyon yönetimi.
Kustomize / Helm Kubernetes manifest otomasyonu.

.NET için Cake (C# Make) Örneği:

csharp

// build.cake
var target = Argument("target", "Default");

Task("Restore")
    .Does(() => DotNetRestore("./MyApp.sln"));

Task("Build")
    .IsDependentOn("Restore")
    .Does(() => DotNetBuild("./MyApp.sln"));

Task("Test")
    .IsDependentOn("Build")
    .Does(() => DotNetTest("./MyApp.sln"));

Task("Publish")
    .IsDependentOn("Test")
    .Does(() => DotNetPublish("./MyApp.sln"));

Task("Default")
    .IsDependentOn("Publish");

RunTarget(target);

9. Otomasyon Stratejileri ve En İyi Pratikler

  1. Everything as Code (Her Şey Kod): Altyapı, pipeline, konfigürasyon, güvenlik politikaları, testler hepsi kod olarak versiyonlansın.

  2. Shift-Left (Sola Kaydır): Test, güvenlik ve kalite kontrollerini mümkün olduğunca erken (geliştirme aşamasında) entegre edin.

  3. Pipeline'ı Parçalara Bölün: Build, test, deploy, post-deploy aşamalarını ayrı job'lar olarak modülerleştirin.

  4. Immutable Infrastructure (Değişmez Altyapı): Sunucuları güncellemek yerine yeniden oluşturun (deploy ile birlikte).

  5. Güvenli Secret Yönetimi: Parolaları, token'ları, API key'leri asla kodda saklamayın; GitHub Secrets, Azure Key Vault, HashiCorp Vault kullanın.

  6. Test Otomasyonu: Unit, integration, UI ve performance testlerini pipeline'a entegre edin.

  7. Deployment Stratejisi Belirleyin: Zero-downtime, rolling, blue-green veya canary.

Sonuç:

Yazılım geliştirme araçları ve otomasyon, günümüz yazılım mühendisliğinin belkemiğidir. CI/CD, containerization, IaC, güvenlik taramaları ve observability araçları, ekiplerin daha hızlı, daha kaliteli ve daha güvenilir yazılım teslim etmesini sağlar. .NET ekosistemi, bu araçlarla tam uyumludur ve Azure DevOps, GitHub Actions, Docker, Kubernetes ve Terraform gibi modern toolchain'lerle doğal entegrasyon sunar.

Unutmayın:

  • Otomasyon bir amaç değil, bir araçtır. Doğru yerlerde otomasyon, yanlış yerlerde ise aşırı mühendislik (over-engineering) olabilir.

  • Kültür değişimi, araçlardan daha önemlidir. DevOps, ekip kültürünü ve iş birliğini dönüştüren bir felsefedir.

  • Sürekli iyileştirme esastır. Toolchain'iniz zamanla evrilir, gelişir ve ihtiyaçlara göre şekillenir.

Tüm yazılar