🚀 CI/CD — Uçtan Uca Rehber
Doğru pipeline tasarımı, otomatik test ve güvenlik taramaları, sağlam artifact yönetimi ve risk azaltan Blue-Green / Canary dağıtımlar. Hem projede uygula hem de mülakatta net anlat.
🔎 Genel Bakış
- CI: Her commit’te otomatik build + test + kalite kontrolleri.
- CD: Onaylı/otomatik deploy → Blue-Green/Canary ile risksiz geçiş.
- Güvenlik: SCA (bağımlılık), SAST (kod), DAST (koşan uygulama), Container tarama, SBOM.
- İzlenebilirlik: Versiyon/etiket, SBOM, imza (cosign), ortamdan ortama promotion.
🏗️ Pipeline Tasarımı
Aşama Akışı
- pre-commit (lokal): lint/format/hızlı test
- CI: build → unit/slice → coverage & mutation → SCA/SAST → paketleme → image build → image scan → SBOM
- CD: deploy dev → integration/contract/e2e → onay → staging → prod (blue-green/canary)
Matris & Paralellik
- JDK 17/21 matrisi, çoklu OS/DB sürümleri için matrix build.
- Cache (Maven/NPM/Docker layer) ile süre kısaltma.
# GitHub Actions örnek pipeline özeti
name: ci
on: [push, pull_request]
jobs:
build-test:
runs-on: ubuntu-latest
strategy: { matrix: { java: [17, 21] } }
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with: { distribution: temurin, java-version: ${{ matrix.java }} }
- name: Cache maven
uses: actions/cache@v4
with:
path: ~/.m2
key: m2-${{ hashFiles('**/pom.xml') }}
- name: Build & Test
run: mvn -B -DskipITs=false verify
🧱 Build/Test/Scan Aşamaları
Build
- Maven/Gradle: reproducible build,
-DskipTestskullanımı yalnızca hızlı prototipte. - Docker image: multi-stage build, küçük base (alpine, distroless).
# Multi-stage Dockerfile (Spring Boot)
FROM maven:3.9-eclipse-temurin-21 as build
WORKDIR /app
COPY pom.xml .
RUN mvn -B -q -e -DskipTests dependency:go-offline
COPY . .
RUN mvn -B -DskipTests package
FROM eclipse-temurin:21-jre-alpine
WORKDIR /opt/app
COPY --from=build /app/target/app.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]
Test
- Unit/Slice/Integration → Testcontainers ile gerçek DB/Queue.
- Contract (Pact/Spring Cloud Contract), e2e smoke.
Scan
- SCA: Dependency tarama (OWASP Dependency-Check, Snyk).
- SAST: Kod analiz (SonarQube/SpotBugs).
- Container: Trivy/Grype; yüksek CVE → gate.
- SBOM: CycloneDX/Syft → artifact ile birlikte yayınla.
# Sonar + Trivy örneği (Actions)
- name: Sonar Scan
run: mvn -B sonar:sonar -Dsonar.host.url=$SONAR_URL -Dsonar.login=$SONAR_TOKEN
- name: Build image
run: docker build -t registry/app:${GITHUB_SHA} .
- name: Trivy
uses: aquasecurity/trivy-action@0.20.0
with:
image-ref: 'registry/app:${{ github.sha }}'
format: 'table'
exit-code: '1' # kritik bulguda job'ı kır
vuln-type: 'os,library'
📦 Artifact Yönetimi
- Maven (Nexus/Artifactory) →
groupId:artifactId:version. - Container registry: registry/app:
1.4.0+ immutability. - Build metadata: git SHA, build time, SBOM, imza.
- Promotion: dev → staging → prod aynı image/artifact ID ile.
# Artifact publish (Maven)
- name: Publish
run: mvn -B deploy -DskipTests -DaltDeploymentRepository=repo::default::${NEXUS_URL}
🏷️ Versiyonlama & Release
- SemVer: MAJOR.MINOR.PATCH.
- Git Tag tabanlı sürüm;
1.5.2etiketi pipeline’ı tetikler. - Release notları otomatik (Conventional Commits + changelog).
# Tag ile sürümleme
on:
push:
tags: ['v*.*.*']
🚢 Deploy Otomasyonu
- IaC: Helm/Manifest; ortam değişkenleri →
values.yaml. - Health checks: liveness/readiness; graceful shutdown.
- DB migration: Flyway/Liquibase (aşağıda).
# GitHub Actions ile K8s deploy (kubectl/helm)
- uses: azure/setup-kubectl@v4
- uses: azure/setup-helm@v4
- name: Helm upgrade
run: |
helm upgrade --install app charts/app \
--namespace prod --create-namespace \
--set image.tag=${{ github.sha }}
🟦 Blue-Green & 🟨 Canary Stratejileri
| Strateji | Özet | Artı | Eksi |
|---|---|---|---|
| Blue-Green | İki ortam (blue/green). Trafik anlık yeni ortama aktarılır. | Hızlı rollback, sıfıra yakın kesinti | Çift kaynak maliyeti, state senkronu |
| Canary | Trafiğin küçük yüzdesi yeni versiyona, kademeli artırılır. | Risk azaltır, gerçek metriklerle ilerleme | Rota/yönlendirme karmaşıklığı |
Ingress/Service Mesh ile Canary
# Istio VirtualService canary yüzdeleri
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
spec:
hosts: ["app.example.com"]
http:
- route:
- destination: { host: app, subset: v1 }
weight: 90
- destination: { host: app, subset: v2 }
weight: 10
İzleme: p95 latency, error rate, iş metrikleri (sipariş/s) canary sırasında otomatik gate olsun.
🗃️ DB Migrasyonları (Flyway/Liquibase)
- İleriye uyumlu şema değişiklikleri: önce yeni kolon ekle → kodu yeni kolonu kullanacak şekilde yayınla → eskiyi kaldır.
- Backfill işlemlerini idempotent batch job olarak ayır.
- Transactional DDL desteklemeyen DB’lerde güvenli sıralama.
# Spring Boot Flyway
spring.flyway.enabled=true
spring.flyway.locations=classpath:db/migration
-- V1__create_orders.sql
CREATE TABLE orders (id BIGINT PRIMARY KEY, status VARCHAR(20), created_at TIMESTAMP);
☸️ Kubernetes & Helm
# deployment.yaml (özet)
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 3
strategy: { type: RollingUpdate, rollingUpdate: { maxUnavailable: 0, maxSurge: 1 } }
template:
spec:
containers:
- name: app
image: registry/app:1.4.0
readinessProbe: { httpGet: { path: /actuator/health, port: 8080 }, initialDelaySeconds: 10 }
livenessProbe: { httpGet: { path: /actuator/health, port: 8080 }, initialDelaySeconds: 20 }
resources: { requests: { cpu: "200m", memory: "256Mi" }, limits: { cpu: "1", memory: "512Mi" } }
Helm values.yaml ile ortam farklarını yönetin; secrets için Vault/External Secrets Operator kullanın.
🧭 GitOps (Argo CD)
- İstenen durum (manifests/Helm) Git’te; Argo CD sürekli senkronize eder.
- PR-tabanlı değişim, audit ve rollbacks basit.
# ArgoCD Application (özet)
apiVersion: argoproj.io/v1alpha1
kind: Application
spec:
source: { repoURL: 'https://git/repo', path: 'charts/app', targetRevision: main }
destination: { server: 'https://kubernetes.default.svc', namespace: prod }
syncPolicy: { automated: { prune: true, selfHeal: true } }
🛡️ Supply Chain Güvenliği
- SBOM üret ve yayınla (CycloneDX/Syft).
- Image imzalama: cosign + politika (Only signed images).
- SLSA/Provenance: build kanıtı, tam izlenebilirlik.
- Policy as Code: OPA/Conftest ile no-latest tag, root kullanıcı yasağı, minimum base image vb.
cosign sign --key cosign.key registry/app:1.4.0
cosign verify registry/app:1.4.0
✅ Quality Gates & Onay Adımları
- Sonar Quality Gate, Trivy kritik CVE=0, test başarısı ≥ %100, coverage ≥ %X, mutation ≥ %Y.
- Staging→Prod için manuel onay + değişiklik seti & risk notu.
- Canary metrikleri eşik altındaysa otomatik ilerleme.
⚡ Hız & Stabilite
- Cache (Maven/NPM, Docker layer), –offline yaklaşımları.
- Paralel job, matrix; flaky test quarantine + tekrar deneme (
retries). - Artefact yeniden kullanımı (promotion), her aşamada sıfırdan build etme.
# GitLab CI: Retry/Cache (özet)
build:
script: mvn -B -DskipITs=false verify
cache: { key: m2, paths: [ .m2/repository ] }
retry: 2
↩️ Rollback Stratejileri
- Blue-Green: trafik geri çevir → anlık rollback.
- Canary: canary ağırlığını eski versiyona geri al.
- DB: ileri-geri uyumlu değişiklikler, veri geri alma planı, feature flag ile davranışı kapat.
❓ Mülakat Soruları & Kısa Yanıtlar
1) CI ve CD farkı?
CI: otomatik build/test; CD: onaylı/otomatik dağıtım ve ortamdan ortama geçiş.
2) Blue-Green vs Canary?
Blue-Green anlık geçiş/rollback; Canary kademeli trafik ve metrik-güdümlü karar.
3) SBOM neden önemli?
Bağımlılıkların tam envanteri → CVE izleme, uyumluluk ve tedarik zinciri güvenliği.
4) Production’a giden artefact aynı mı?
Evet; promotion ile tek artefact/tek image, ortamda yalnızca konfigürasyon değişir.
5) Feature flags nasıl yardım eder?
Riskli özellikleri runtime’da aç/kapat; rollback gereksinimini azaltır.
📝 CI/CD Check-list
- ✅ Unit/Integration/Contract testleri, coverage & mutation metrikleri
- ✅ SCA/SAST/Container Scan, Quality Gate kuralları
- ✅ SBOM üretimi ve yayın
- ✅ Immutable artefact & registry, tag + digest
- ✅ Helm/Manifest, readiness/liveness, kaynak limitleri
- ✅ Blue-Green/Canary planı + izleme (p95, error rate, iş metrik)
- ✅ DB migration stratejisi (ileri/geri uyumlu)
- ✅ İmza (cosign), politika (OPA), audit
- ✅ Cache/paralelism ile hızlı pipeline; flaky yönetimi
- ✅ Rollback prosedürü ve iletişim planı