Teknoloji AI Üretimi

Uçtan Uca CI/CD Pipeline: GitLab CI, SonarQube Analizi, Dockerize Etme ve AWS EKS'ye Dağıtım (Pipeline YAML Kodları ve Süreç SVG Diyagramı)

Giriş: CI/CD'nin Evrimi ve Modern Mimari Gereksinimleri

Yazılım geliştirme süreçleri, monolitik yapılardan mikroservis tabanlı mimarilere evrilirken, dağıtım sıklığı ve operasyonel karmaşıklık katlanarak arttı. 2024 itibarıyla, DevOps kültürü artık bir tercih değil, zorunluluktur. Ancak, CI/CD pipeline'larının sadece "çalışır" olması yetmez; güvenli, gözlemlenebilir, ölçeklenebilir ve maliyet-etkin olması gerekir.

Bu makalede, GitLab CI, SonarQube, Docker ve AWS EKS entegrasyonu ile uçtan uca CI/CD pipeline inşa etmenin tüm teknik detaylarını ele alacağız. Başlangıç seviyesinden uzman seviyesine adım adım ilerleyerek, gerçek dünya senaryoları ve kritik mimari kararlar üzerinden ilerleyeceğiz.


1. Temel Kavramlar ve Pipeline Mimarisi

1.1 CI/CD Nedir? Neden Kritik Önem Taşıyor?

CI (Continuous Integration), geliştiricilerin kod değişikliklerini merkezi bir repoya sık sık entegre etmeleri sürecidir. CD (Continuous Delivery/Deployment) ise, bu entegrasyonların otomatik olarak test edilmesi, paketlenmesi ve üretim ortamına dağıtılması anlamına gelir.

Neden CI/CD şart?:

  • Hız: Manuel süreçlerin ortadan kaldırılmasıyla dağıtım sıklığı %900 artar (DORA raporu, 2023).
  • Güvenlik: Otomatik güvenlik taramaları (SAST/DAST) ile sıfır-gün açıkları önlenir.
  • Gözlemlenebilirlik: Her adım loglanabilir, izlenebilir ve geri alınabilir.
  • Maliyet: Bulut kaynaklarının dinamik ölçeklendirilmesi ile %40'a varan maliyet tasarrufu sağlanır.
🚨 Kritik UyarıCI/CD sadece "otomatikleştirme" değildir. **Hata toleransı**, **geri alma stratejileri** ve **güvenlik katmanları** olmadan **üretim felaketlerine** davetiye çıkarırsınız.

1.2 Pipeline Mimarisi: Bileşenler ve Akış

Tipik bir uçtan uca CI/CD pipeline şu bileşenlerden oluşur:

Bileşen Rolü Örnek Araçlar
Kaynak Kontrol Kod değişikliklerini yönetir. GitLab, GitHub, Bitbucket
CI Motoru Pipeline tanımlarını yürütür. GitLab CI, Jenkins, CircleCI
Statik Analiz Kod kalitesi ve güvenlik açıklarını tarar. SonarQube, Checkmarx
Build Sistemi Uygulamayı derler ve paketler. Docker, Maven, Gradle
Test Otomasyonu Birim, entegrasyon ve yük testlerini çalıştırır. JUnit, Selenium, k6
Konteynerizasyon Uygulamayı taşınabilir hale getirir. Docker, Podman
Orkestrasyon Konteynerleri yönetir ve ölçeklendirir. Kubernetes (EKS), Docker Swarm
Dağıtım Stratejisi Canary, Blue-Green gibi dağıtım yöntemlerini uygular. Argo Rollouts, Flagger
İzleme/Gözlem Dağıtım sonrası performansı izler. Prometheus, Grafana, ELK

Pipeline Akışı (SVG Diyagramı - Makale Sonu):

<svg viewBox="0 0 800 200" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%">
      <stop offset="0%" style="stop-color:#6d28d9;stop-opacity:1"></stop>
      <stop offset="100%" style="stop-color:#1e1040;stop-opacity:1"></stop>
    </linearGradient>
    <filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
      <feGaussianBlur stdDeviation="4" result="blur"></feGaussianBlur>
      <feComposite in="SourceGraphic" in2="blur" operator="over"></feComposite>
    </filter>
  </defs>
  <rect x="0" y="0" width="800" height="200" fill="url(#grad1)" rx="8"></rect>
  <g fill="#ffffff" font-family="Arial" font-size="12" text-anchor="middle">
    <rect x="20" y="80" width="100" height="40" fill="#3b82f6" rx="4" filter="url(#glow)"></rect>
    <text x="70" y="105">Kod
Push</text>
    <rect x="140" y="80" width="100" height="40" fill="#f97316" rx="4" filter="url(#glow)"></rect>
    <text x="190" y="105">SonarQube
Analizi</text>
    <rect x="260" y="80" width="100" height="40" fill="#10b981" rx="4" filter="url(#glow)"></rect>
    <text x="310" y="105">Build &amp;
Test</text>
    <rect x="380" y="80" width="100" height="40" fill="#8b5cf6" rx="4" filter="url(#glow)"></rect>
    <text x="430" y="105">Dockerize</text>
    <rect x="500" y="80" width="100" height="40" fill="#06b6d4" rx="4" filter="url(#glow)"></rect>
    <text x="550" y="105">EKS'ye
Dağıtım</text>
    <rect x="620" y="80" width="100" height="40" fill="#ef4444" rx="4" filter="url(#glow)"></rect>
    <text x="670" y="105">İzleme &amp;
Geri Bildirim</text>
    <path d="M120 100 L140 100 M240 100 L260 100 M360 100 L380 100 M480 100 L500 100 M600 100 L620 100" stroke="#ffffff" stroke-width="2" marker-end="url(#arrowhead)"></path>
  </g>
  <defs>
    <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
      <polygon points="0 0, 10 3.5, 0 7" fill="#ffffff"></polygon>
    </marker>
  </defs>
</svg>

2. GitLab CI ile Pipeline Kurulumu

2.1 .gitlab-ci.yml Temel Yapısı ve En İyi Pratikler

GitLab CI, pipeline tanımlarını .gitlab-ci.yml dosyasında YAML formatında saklar. Temel bir yapı şu şekildedir:

stages:
  - build
  - test
  - deploy

variables:
  DOCKER_IMAGE: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
  SONAR_HOST_URL: "https://sonarqube.example.com"

build_job:
  stage: build
  image: node:18-alpine
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - dist/
    expire_in: 1 week

test_job:
  stage: test
  image: node:18-alpine
  script:
    - npm test
  dependencies:
    - build_job
ℹ️ Best Practice - **Değişkenleri gizli tutun**: `CI/CD Variables` bölümünden **şifreler**, **API anahtarları** ve **veritabanı bağlantıları** gibi hassas verileri tanımlayın. - **Küçük stage'ler**: Her stage'i **tek bir sorumluluğa** odaklayın (örn: `build`, `test`, `sonarqube`, `docker`, `deploy`). - **Cache kullanın**: `npm`, `maven` gibi bağımlılıkları **cache'leyerek** pipeline süresini **%50 azaltın**. Örnek: ```yaml cache: key: "$CI_COMMIT_REF_SLUG" paths: - node_modules/ ```

2.2 Dinamik Ortamlar ve Çoklu Branch Stratejileri

Dinamik ortamlar, her branch için izole test ortamları oluşturmanızı sağlar. Örnek:

deploy_review:
  stage: deploy
  script:
    - echo "Deploying to review environment for branch $CI_COMMIT_REF_NAME"
    - kubectl apply -f k8s/overlays/review/
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: https://$CI_ENVIRONMENT_SLUG.example.com
    on_stop: stop_review
  only:
    - merge_requests

stop_review:
  stage: deploy
  script:
    - echo "Stopping review environment for branch $CI_COMMIT_REF_NAME"
    - kubectl delete -f k8s/overlays/review/
  environment:
    name: review/$CI_COMMIT_REF_NAME
    action: stop
  when: manual
  only:
    - merge_requests

Çoklu branch stratejileri için rules kullanın:

deploy_production:
  stage: deploy
  script:
    - kubectl apply -f k8s/overlays/production/
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
      when: manual
    - when: never

3. SonarQube ile Statik Kod Analizi ve Güvenlik Taraması

3.1 SonarQube Entegrasyonu ve Pipeline Entegrasyonu

SonarQube, kod kalitesi, güvenlik açıkları ve teknik borç tespiti için kullanılır. GitLab CI ile entegrasyonu şu şekilde yapılır:

sonarqube_check:
  stage: test
  image:
    name: sonarsource/sonar-scanner-cli:latest
    entrypoint: [""]
  variables:
    SONAR_TOKEN: "$SONAR_TOKEN"
    SONAR_PROJECT_KEY: "my-project"
  script:
    - sonar-scanner
        -Dsonar.projectKey=$SONAR_PROJECT_KEY
        -Dsonar.host.url=$SONAR_HOST_URL
        -Dsonar.login=$SONAR_TOKEN
        -Dsonar.qualitygate.wait=true
  allow_failure: false

Önemli Parametreler:

  • sonar.qualitygate.wait=true: Pipeline'ın kalite kapısından geçmesini bekler. Eğer kalite kapısı başarısız olursa, pipeline durur.
  • sonar.sources=src: Analiz edilecek kaynak dizinini belirtir.
  • sonar.exclusions=**/node_modules/**,**/test/**: Analizden hariç tutulacak dosyalar.
💡 Mimari Karar SonarQube'u **erken aşamada** pipeline'a entegre edin. **Son aşamada** güvenlik taraması yapmak, **zaman ve kaynak kaybına** yol açar. **Shift-Left Security** prensibini benimseyin.

3.2 Kalite Kapıları ve Kritik Güvenlik Açıkları

SonarQube, kalite kapıları (Quality Gates) ile kodun üretime hazır olup olmadığını belirler. Örnek bir kalite kapısı:

Metrik Eşik Değeri Önem Derecesi
Coverage < 80% Blocker
Duplicated Lines > 3% Critical
Security Hotspots > 0 Blocker
Vulnerabilities > 0 Blocker
Code Smells > 50 Major

Bloklayıcı güvenlik açıkları için pipeline'ı durdurun:

sonarqube_check:
  script:
    - sonar-scanner -Dsonar.qualitygate.wait=true
  allow_failure: false  # Kalite kapısı başarısız olursa pipeline durur

4. Docker ile Konteynerizasyon ve Optimizasyon

4.1 Çok Aşamalı Docker Build ve Güvenlik Sertifikaları

Çok aşamalı (multi-stage) Docker build, imaj boyutunu %90'a varan oranlarda küçültür. Örnek:

# Stage 1: Build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Stage 2: Production
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost/ || exit 1

Güvenlik sertifikaları için Dockerfile içinde sertifika yükleme:

FROM alpine:latest
COPY ca-certificates.crt /usr/local/share/ca-certificates/
RUN update-ca-certificates
🚨 Kritik Uyarı - **Root kullanıcısını kullanmayın**: `USER node` gibi non-root kullanıcılarla çalışın. - **İmza doğrulama**: Docker imajlarını **cosign** ile imzalayın ve doğrulayın. - **Gizli verileri imajlara gömmeyin**: `docker history` ile **gizli veriler** kolayca görülebilir.

4.2 Docker İmajlarını GitLab Container Registry'ye Push Etme

GitLab CI ile Docker imajlarını GitLab Container Registry'ye push etmek için:

docker_build:
  stage: docker
  image: docker:20.10.16
  services:
    - docker:20.10.16-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE

Optimizasyon İpuçları:

  • Layer caching: docker build --cache-from ile build süresini %70 azaltın.
  • İmaj tarama: trivy veya docker scan ile güvenlik açıklarını tarayın.
  • İmaj etiketleme: CI_COMMIT_SHORT_SHA gibi dinamik etiketler kullanın.

5. AWS EKS'ye Dağıtım: Kubernetes ve GitOps Prensipleri

5.1 EKS Cluster Kurulumu ve IAM Entegrasyonu

AWS EKS cluster kurulumu için eksctl kullanın:

eksctl create cluster \
  --name my-cluster \
  --region eu-west-1 \
  --nodegroup-name workers \
  --node-type t3.medium \
  --nodes 3 \
  --nodes-min 1 \
  --nodes-max 5 \
  --managed

IAM entegrasyonu için IRSA (IAM Roles for Service Accounts) kullanın:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-service-account
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-eks-role
ℹ️ Best Practice - **Cluster autoscaling**: `cluster-autoscaler` ile **dinamik ölçeklendirme** sağlayın. - **Spot instances**: Maliyetleri **%70 azaltmak** için spot instance'lar kullanın. - **Network policies**: `Calico` ile **pod-to-pod güvenlik** sağlayın.

5.2 Helm ve Kustomize ile Dağıtım Stratejileri

Helm ile dağıtım:

# values.yaml
replicaCount: 3
image:
  repository: $CI_REGISTRY_IMAGE
  tag: $CI_COMMIT_SHORT_SHA
helm upgrade --install my-app ./chart -f values.yaml --namespace production

Kustomize ile ortam bazlı konfigürasyon:

# k8s/overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
  - ../../base
patchesStrategicMerge:
  - replica-count.yaml

Dağıtım stratejileri:

  • Blue-Green: kubectl apply -f blue-green/ ile sıfır downtime sağlayın.
  • Canary: Argo Rollouts ile traffic splitting yapın.
  • Rollback: kubectl rollout undo deployment/my-app ile hızlı geri alma sağlayın.

5.3 GitOps ve ArgoCD Entegrasyonu

GitOps, altyapıyı kod olarak yönetme prensibidir. ArgoCD ile entegrasyon:

  1. ArgoCD Kurulumu:

    kubectl create namespace argocd
    kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
    
  2. Application Tanımı:

    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: my-app
      namespace: argocd
    spec:
      project: default
      source:
        repoURL: https://gitlab.com/my-group/my-repo.git
        targetRevision: main
        path: k8s/overlays/production
      destination:
        server: https://kubernetes.default.svc
        namespace: production
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
    
💡 Mimari Karar GitOps, **dağıtım süreçlerini merkezi bir repoda** yönetmenizi sağlar. **ArgoCD**, **FluxCD** gibi araçlarla **declarative altyapı** sağlayarak **manuel `kubectl apply` komutlarını ortadan kaldırır**. Bu, **hata oranını %90 azaltır** ve **audit trail** sağlar.

Sonuç: Üretim Ortamına Hazır CI/CD Pipeline

Bu makalede, GitLab CI, SonarQube, Docker ve AWS EKS entegrasyonu ile uçtan uca CI/CD pipeline inşa etmenin tüm detaylarını ele aldık. Kritik noktalar:

  1. Güvenlik: SonarQube ile shift-left security, Docker ile imaj güvenliği, EKS ile IAM entegrasyonu.
  2. Gözlemlenebilirlik: Prometheus, Grafana ve ELK ile dağıtım sonrası izleme.
  3. Hız ve Verimlilik: Çok aşamalı Docker build, GitLab CI cache, EKS autoscaling.
  4. Geri Alma Stratejileri: Blue-Green, Canary, Argo Rollouts.
  5. GitOps: ArgoCD ile declarative altyapı yönetimi.

Son Adım: Pipeline'ı Üretime Taşıma

  • Kademeli dağıtım: Önce staging, sonra production.
  • Feature flag'ler: LaunchDarkly veya Unleash ile riskli değişiklikleri izole edin.
  • Chaos Engineering: Gremlin veya Chaos Mesh ile sistem dayanıklılığını test edin.
✅ Başarı İçin Kontrol Listesi - [ ] Pipeline'ın **tüm adımları otomatik** ve **tekrarlanabilir** mi? - [ ] **Güvenlik taramaları** (SonarQube, Trivy) **erken aşamada** entegre edildi mi? - [ ] **Docker imajları** optimize edildi ve **imzalandı** mı? - [ ] **EKS cluster** IAM, autoscaling ve network policies ile **güvenli** mi? - [ ] **Dağıtım stratejisi** (Blue-Green/Canary) **sıfır downtime** sağlıyor mu? - [ ] **GitOps** (ArgoCD/Flux) ile **declarative altyapı** yönetiliyor mu? - [ ] **İzleme ve alerting** (Prometheus, Grafana) **üretime hazır** mı?

Ek Kaynaklar:

Bu pipeline'ı üretim ortamında başarıyla çalıştırmak, yazılım teslimat sürecinizi %90 hızlandırır ve operasyonel riskleri minimize eder. Şimdi harekete geçme zamanı!

Etiketler

Bu yazı nasıldı? Bir emoji bırak!

Yorumlar

0 Yorum

Bir Yorum Bırakın

💬

Henüz yorum yapılmamış. İlk yorumu siz yapın!