Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
CI, Continuous Delivery ve Continuous Deployment: Farkları ve Neden Önemli
CI, herkesin işini her gün mainline'a entegre edip her push'ta otomatik build ve test koşturmaktır; continuous delivery her commit'i release edilebilir tutar ve production'a çıkışı bir karara bırakır, continuous deployment ise o butonu da kaldırır. Integration hell senaryosu, Fowler'ın 2024 pratikleri, act ile koşulmuş bir CI workflow'u ve MinimumCD kontrol listesi.
Pipeline Anatomisi: Trigger, Stage, Job, Step ve Fail Fast
Bir pipeline trigger'larla başlar, birbirine bağımlı job'lardan (Jenkins'te stage) ve sırayla koşan step'lerden oluşur; build mantığını lokalde çalışan bir script'e koyup pipeline'ı sadece orkestra şefi yapmak, ucuz kontrolleri öne almak ve paralel dallarda fail fast kullanmak geri bildirimi hızlandırır. GitHub Actions, Jenkins ve Azure DevOps terim eşlemesi, act ve Jenkins ile koşulmuş gerçek çıktılar.
Build Once, Deploy Many: Artifact, Versiyonlama ve Immutable Paket
Artifact'ı bir kez build edip aynısını, tag'i ya da digest'iyle staging'den production'a taşımak, staging'de test edilen şeyin production'a gitmesini garanti eder; aynı commit'ten iki kez build almak bile farklı image üretir. Lock dosyaları ve npm ci ile reproducible build, SHA ile sürüm damgalama, :latest tuzağı ve Angular için runtime config.json.
Pipeline'da Test: Hızlı Geri Bildirim, Quality Gate'ler ve Flaky Test'ler
Testleri pipeline'a ucuzdan pahalıya dizmek (format, unit, Testcontainers ile integration, Playwright ile e2e) ve uyarı, coverage ve bundle budget gibi quality gate'leri eklemek hızlı ve güvenilir geri bildirim verir; flaky test'i retry ile örtmek yerine kökünü bulmak gerekir. Assertion'sız testin coverage'ı nasıl şişirdiği, 30 koşuda 2 kez kırılan gerçek bir flaky test ve boş kalan Playwright shard'ı.
Environment'lar ve Promotion: Dev, Test, Staging, Production ve Configuration
Aynı artifact dev, test, staging ve production'a yeniden build edilmeden taşınır; basamaktan basamağa değişen tek şey ortamdan gelen configuration olmalıdır. ASP.NET Core'da appsettings.{Environment}.json ve ortam değişkenleriyle katmanlı configuration, ValidateOnStart ile açılışta kırılan eksik ayar, staging ile production arasında fark envanteri, PR başına preview environment ve non-prod veriyi maskelemek.
Approval, Gate ve Deploy Kontrolleri: Pipeline'a İnsan ve Kural Eklemek
Otomatik gate'ler (smoke test, health check, deploy freeze) 'bu değişiklik çalışıyor mu?' sorusunu, manuel approval ise 'şimdi mi?' sorusunu cevaplamalı; DORA, ağır dış onayların change fail rate'i düşürdüğüne dair kanıt bulamadı. Jenkins input step'inde herkes yöneticiyken submitter'ın işe yaramadığını gösteren gerçek çıktı, GitHub environment protection rule'ları ve Azure DevOps check'leri.
Pipeline Güvenliği ve Secret'lar: Least Privilege, Kısa Ömürlü Credential ve Supply Chain
Pipeline production anahtarlarına sahip en güçlü kullanıcıdır; secret'ları store'da tutmak, job başına least privilege, uzun ömürlü cloud key'leri yerine OIDC ile kısa ömürlü token ve action'ları commit SHA'sına pin'lemek riskin büyük kısmını kapatır. Base64'e çevrilen secret'ın maskelemeden kaçtığı gerçek act çıktısı, actionlint'in yakaladığı script injection, fork PR riskleri ve SLSA v1.2 ile SBOM'a kısa bakış.
Pipeline'ı Ölçmek ve Hızlandırmak: DORA Metrikleri, Cache ve Paralellik
DORA'nın güncel beş metriği (change lead time, deployment frequency, failed deployment recovery time, change fail rate, deployment rework rate) deploy kayıtlarından hesaplanır ve ekip bazında trend olarak izlenmelidir; pipeline'ı hızlandırmak ise ölçümle başlar. Tek dosyalık bir C# hesaplayıcı, act'te NuGet cache'inin restore'u sadece 0,2 saniye hızlandırıp 2,3 saniyelik geri yükleme maliyeti getirdiği gerçek ölçüm, cache key tasarımı ve path filter tuzağı.