Sürekli entegrasyon (CI), kod değişikliklerinin ana dala entegre edilmeden önce otomatik olarak derlenmesi, test edilmesi ve kalite kapılarından geçirilmesi disiplinidir. İyi tasarlanmamış bir pipeline ya geliştiriciyi yavaşlatır ya da hatalı kodu üretime yaklaştırır. Pipeline tasarımı, yazılım teslimat hızı ile güvenilirlik arasındaki dengeyi kodlayan mimari karardır; bu denge proje olgunluğu, ekip büyüklüğü ve düzenleme gereksinimleriyle birlikte evrilir.
Pipeline'ın temel aşamaları
Tipik bir CI pipeline şu sırayı izler: checkout, bağımlılık restore, statik analiz, birim test, derleme, entegrasyon test, güvenlik taraması, artefakt publish ve bildirim. Her aşama bağımsız bir job veya step olabilir; fail-fast ilkesi gereksiz kaynak tüketimini önler. Lint 30 saniyede başarısız olurken derlemenin 10 dakika daha devam etmesi kabul edilemez.
stages:
- validate
- test
- build
- security
- publish
validate:lint:
stage: validate
script:
- dotnet format --verify-no-changes
- dotnet build --no-restore -warnaserror
test:unit:
stage: test
script:
- dotnet test --filter Category=Unit --collect:"XPlat Code Coverage"
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage/cobertura.xml
Geri bildirim süresi hedefleri
Geliştirici akışında "inner loop" (edit-test) ile "outer loop" (CI) farklı SLA'lara sahiptir. PR pipeline'ı ideal olarak 10-15 dakikada tamamlanmalıdır; daha uzun süreler context switching maliyetini artırır. Bunu başarmak için test paralelleştirme, cache ve aşama ayrımı kullanılır. Ağır entegrasyon testleri gece veya merge sonrası pipeline'a taşınabilir.
- PR pipeline: Hızlı geri bildirim — lint, unit, contract test.
- Main pipeline: Tam güven — entegrasyon, E2E, imaj push, deploy staging.
- Scheduled pipeline: Performans testi, dependency audit, DR drill.
Cache ve artefakt stratejisi
NuGet, npm ve Docker layer cache, pipeline süresinin yüzde 50'sinden fazlasını oluşturabilir. Cache anahtarlarını lock dosyası hash'ine bağlayın; package-lock.json değişince cache invalidate olmalı. Artefakt olarak derlenmiş binary'leri sonraki job'lara taşımak, her job'da yeniden derlemeyi önler. GitHub Actions actions/cache, GitLab cache: keyword, Azure DevOps pipeline cache aynı problemi çözer.
Docker build in CI
BuildKit remote cache ile imaj katmanları registry'de saklanır. Multi-stage Dockerfile'daki restore katmanı cache hit aldığında build süresi dramatik düşer. docker/build-push-action ile cache-from ve cache-to parametreleri yapılandırılır.
Kalite kapıları
Quality gate, pipeline'ın ilerlemesini ölçülebilir eşiklere bağlar: kod kapsamı yüzde 80'in altına düşerse fail, kritik CVE bulunursa fail, cyclomatic complexity artarsa uyarı. SonarQube, Codecov ve Dependabot bu kapıların veri kaynağıdır. Kapılar çok sıkı ayarlanırsa ekip bypass arar; çok gevşekse teknik borç birikir. Başlangıçta uyarı modunda çalıştırıp eşikleri kademeli sıkılaştırmak sürdürülebilir yaklaşımdır.
Dal stratejisi ve tetikleyiciler
Trunk-based development, kısa ömürlü feature branch'ler ve sık merge ile CI yükünü düzenler. Uzun süre açık kalan branch'ler merge conflict ve "integration hell" üretir. Pipeline tetikleyicileri: push, pull_request, schedule, manual (workflow_dispatch). Fork PR'larında secret erişimini kısıtlamak güvenlik gereksinimidir; pull_request_target anti-pattern'lerinden kaçının.
Paralelleştirme ve matrix build
Matrix strategy ile aynı test farklı runtime sürümlerinde paralel çalışır:
strategy:
matrix:
dotnet: ['8.0.x', '9.0.x']
os: [ubuntu-latest, windows-latest]
Paralel job sayısı runner kapasitesiyle sınırlıdır; self-hosted runner'lar maliyet optimizasyonu sağlar ancak bakım yükü getirir. Test bölme (test sharding) büyük test suite'lerinde wall-clock süresini düşürür.
Güvenlik ve tedarik zinciri
CI ortamı yüksek ayrıcalıklıdır: registry push, cloud deploy, secret erişimi. Minimum privilege IAM rolleri, OIDC federation (kalıcı cloud key yerine), ve ephemeral runner'lar riski azaltır. SBOM üretimi ve imaj imzalama pipeline'a entegre edilmelidir. Üçüncü parti action ve script'ler pinlenmeli (commit SHA ile); @v3 floating tag tedarik zinciri saldırısına açıktır.
Gözlemlenebilirlik
Pipeline metrikleri: başarı oranı, ortalama süre, p95 süre, queue bekleme, flaky test oranı. DORA metriklerinden "deployment frequency" ve "lead time for changes" doğrudan CI verimliliğiyle ilişkilidir. Başarısız build'lerin kök neden analizi haftalık ritüel olmalıdır; altyapı kaynaklı fail ile kod kaynaklı fail ayrıştırılır.
Hata yönetimi ve retry
Geçici ağ hatalarında kontrollü retry uygulanır; test fail'de retry flaky test maskeler. retry: yalnızca infra step'lerinde kullanılmalıdır. Pipeline timeout'ları sonsuz beklemeyi önler; asılı job runner maliyetini ve geliştirici güvenini tüketir.
Monorepo ve değişiklik algılama
Monorepo'da her commit tüm servisleri build etmek israfır. Path filter ile yalnızca etkilenen modüller build edilir:
paths:
- 'src/services/billing/**'
- 'libs/shared/**'
Nx, Bazel ve Turborepo affected graph hesaplamayı otomatikleştirir. CI tasarımı monorepo aracıyla uyumlu planlanmalıdır.
Anti-pattern'ler
- Manuel onay her PR'da: Darboğaz oluşturur; yalnızca deploy aşamasında kullanın.
- Test olmadan deploy: "Hızlı" görünür, incident maliyeti katlanır.
- Shared mutable runner state: Test izolasyonunu bozar.
- Sıralı E2E: Paralel shard ile 45 dakika 8 dakikaya iner.
CI pipeline tasarımı statik bir YAML dosyası değil, yaşayan bir sistemdir. Metriklerle beslenen, ekip geri bildirimiyle sadeleşen ve güvenlik gereksinimleriyle güçlenen pipeline, modern yazılım teslimatının omurgasını oluşturur.
Artefakt imzalama ve provenance
SLSA (Supply-chain Levels for Software Artifacts) çerçevesi, build provenance ve imzalı artefakt beklentilerini tanımlar. GitHub Actions slsa-github-generator ve Sigstore Cosign ile container imajları pipeline sonunda imzalanır. İmza doğrulaması deploy aşamasında zorunlu kılınır; imzasız imaj cluster'a kabul edilmez. Bu, tedarik zinciri saldırılarına karşı savunma katmanı oluşturur.
Pipeline maliyet optimizasyonu
Self-hosted runner maliyeti sabit; cloud-hosted runner dakika bazlı faturalandırılır. Büyük monorepo'larda path filter ve affected detection olmadan aylık CI faturası kontrolden çıkar. Spot runner veya gece batch job'ları ile maliyet yüzde 30-50 düşürülebilir. Cache hit oranını dashboard'da izlemek, hangi job'ların optimize edilmesi gerektiğini gösterir.
Bildirim ve geliştirici deneyimi
Pipeline başarısızlığı Slack veya Teams kanalına değil, PR yorumuna ve commit author'a yönlendirilmelidir. Gürültülü bildirimler ignore edilir. Test raporu artefakt olarak PR'a eklenir; coverage diff görünür olmalıdır. Flaky test tespiti için aynı commit'te N kez retry değil, geçmiş istatistik bazlı quarantine kullanın. Build süresi regresyonu (önceki haftaya göre yüzde 20 artış) otomatik uyarı tetikler.
Deploy kapıları ve ortam ilerlemesi
CI ile CD arasındaki sınır, staging deploy'un otomatik, production deploy'un manuel veya onaylı olmasıyla netleşir. Environment protection rule'ları, required reviewer ve wait timer tanımlar. Staging'de smoke test geçmeden production job başlamaz. Infrastructure drift detection (Terraform plan) deploy öncesi ayrı job olarak çalışır; beklenmeyen altyapı değişikliği pipeline'ı durdurur.
Test verisi ve izolasyon
Entegrasyon testleri için deterministik fixture kullanın; rastgele veri flaky sonuç üretir. Her pipeline run'ında temiz veritabanı (Testcontainers veya ephemeral schema) oluşturulmalıdır. Paralel test job'ları aynı paylaşımlı DB'ye yazmamalıdır; job başına schema prefix veya container izolasyonu şarttır. Test artefakt retention policy'si disk maliyetini kontrol altında tutar; başarısız run'ların log ve screenshot'ları 30 gün saklanır.
Pipeline tasarımında en sık gözden kaçan nokta, başarılı build'in otomatik olarak kalite garantisi sayılmasıdır. Yeşil pipeline yalnızca tanımlanan testlerin geçtiğini gösterir; eksik test coverage veya yanlış eşik değerleri yeşil build ile production incident arasında gizli köprü oluşturur. Bu nedenle pipeline evrimi test stratejisi ve kalite kapılarıyla birlikte planlanmalıdır.