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.
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 &
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 &
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
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.
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
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-fromile build süresini %70 azaltın. - İmaj tarama:
trivyveyadocker scanile güvenlik açıklarını tarayın. - İmaj etiketleme:
CI_COMMIT_SHORT_SHAgibi 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
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 Rolloutsile traffic splitting yapın. - Rollback:
kubectl rollout undo deployment/my-appile hızlı geri alma sağlayın.
5.3 GitOps ve ArgoCD Entegrasyonu
GitOps, altyapıyı kod olarak yönetme prensibidir. ArgoCD ile entegrasyon:
ArgoCD Kurulumu:
kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yamlApplication 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
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:
- Güvenlik: SonarQube ile shift-left security, Docker ile imaj güvenliği, EKS ile IAM entegrasyonu.
- Gözlemlenebilirlik: Prometheus, Grafana ve ELK ile dağıtım sonrası izleme.
- Hız ve Verimlilik: Çok aşamalı Docker build, GitLab CI cache, EKS autoscaling.
- Geri Alma Stratejileri: Blue-Green, Canary, Argo Rollouts.
- 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.
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ı!
Yorumlar
Bir Yorum Bırakın
Henüz yorum yapılmamış. İlk yorumu siz yapın!