Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Artifact Repository ve Release Süreci: Feed'ler, Container Image Tag'leri, Hotfix Akışı ve Destek Politikası
Container registry'lerinde tag varsayılan olarak hareketli bir işaret; bu yüzden image'ı sürüm ve commit SHA'sıyla etiketle, OCI label'larıyla kaynağını işaretle ve digest ile deploy et. Bookstore API'sinde aynı tag'in iki farklı image'ı göstermesini, SDK'nın OCI label'larını ve digest çıktısını, cherry-pick'li 1.x hotfix'ini ve release branch'inde yayın workflow'unun olmaması tuzağını gösteriyor; artifact repository seçeneklerini, release cadence'ı ve destek politikası şablonunu ele alıyoruz.
Angular Kütüphanesini npm'e Yayınlamak: ng-packagr, peerDependencies, dist-tag'ler ve Trusted Publishing
Angular kütüphanesini ng-packagr ile Angular Package Format'ta paketle, kaynak klasörünü değil dist çıktısını yayınla ve desteklediğin Angular aralığını peerDependencies ile beyan et. @bookstore/ui'de secondary entry point'i ve exports alanını kuruyor, peer aralığı karşılanmayınca ERESOLVE'u, npm 11'in tag'siz prerelease yayınını reddetmesini gösteriyor, dist-tag, deprecate ve trusted publishing workflow'unu ele alıyoruz.
NuGet Paketi Yayınlamak: dotnet pack, Paket Metadata'sı, Package Validation ve nuget.org Trusted Publishing
NuGet paketini metadata, README, lisans ve symbol paketiyle oluştur, EnablePackageValidation ile önceki sürümü baseline alıp kazara breaking change'i pack sırasında yakala, nuget.org'a ise uzun ömürlü API key yerine OIDC ile bir saatlik key veren trusted publishing ile yayınla. Bookstore.Contracts'ta isteğe bağlı parametrenin binary kırılmasını CP0002 ile, framework kaldırmayı PKV006 ile, aynı sürümün ikinci push'unu yerel sunucuda 409 Conflict ile gösteriyoruz.
Changelog ve Release Notes: Conventional Commits'ten Otomatik CHANGELOG'a, Deprecation Politikası
CHANGELOG'u Conventional Commits'ten otomatik üret, release notes'u ise elle yaz: araç sürümü ve değişiklik listesini mekanik olarak çıkarır, ama deprecation'ı, geçiş adımlarını ve destek takvimini bilmez. Bookstore.Contracts'ı commit-and-tag-version ile 1.1.0 ve 2.0.0'a taşıyor, [Obsolete] ve DiagnosticId ile bir sürüm önceden uyarıyor, 2.0 geçiş notunu yazıyor ve release-please manifest mode ile PR tabanlı alternatifi karşılaştırıyoruz.
Git'ten Sürüm Üretmek: MinVer, Nerdbank.GitVersioning ve GitVersion Karşılaştırması
Sürümü Git'ten üretmenin üç yolu var: MinVer yalnız tag'e bakar, Nerdbank.GitVersioning version.json ile git height'ı birleştirir, GitVersion branch tipine göre hesaplar. Üçünü Bookstore.Contracts'ta aynı senaryoyla gerçek çıktılarla karşılaştırıyor; tag öneki, AssemblyVersion varsayılanları, GitVersion 6'daki config değişiklikleri ve CI'da fetch-depth: 0 gerektiren shallow clone tuzağını gösteriyoruz.
.NET ve Angular'da Sürüm Bilgisi: AssemblyVersion, FileVersion, InformationalVersion, Source Link ve /version Endpoint'i
.NET'te sürümü Version ile tek yerden ver, kütüphanede AssemblyVersion'ı major'a sabitle, FileVersion'a CI build numarasını koy ve InformationalVersion'ı .NET 8'den beri commit SHA'sını ekleyen SDK'ya bırak. Bookstore API'sinde /version endpoint'i, log satırı ve OpenTelemetry service.version ile sürümü görünür kılıyor; Angular'da define ile build'e sürüm gömüyor ve service worker ile yeni sürüm bildirimini Playwright'la deniyoruz.
Sürüm Numarası Ne Anlatır? SemVer 2.0.0, Pre-release, Build Metadata ve CalVer
Sürüm numarası, kime söz verdiğine göre seçilir: paketler için SemVer 2.0.0 uyumluluk sözü verir, deploy edilen uygulamalar için CalVer ve build numarası "ne zaman, ne çıktı" sorusunu cevaplar. Pre-release ve build metadata sıralamasını NuGet.Versioning ve npm semver ile gerçek çıktılarla karşılaştırıyor, 0.x aralıklarını, breaking change türlerini, .NET ve Angular destek politikalarını ve Bookstore için karar tablosunu ele alıyoruz.
Certificate'ları İzlemek ve Kesintileri Önlemek: Envanter, Expiry Alert'leri, TLS Testleri ve Gerçek Olay Örnekleri
Certificate kesintilerini önlemek için diskteki dosyayı değil, istemcinin gördüğü certificate'ı dışarıdan ölçersin: blackbox exporter'ın last_chain metric'ine ömre göre eşikli bir alarm, probe_success alarmı, CT log ve CAA ile envanter. Reload edilmemiş yenilemeyi, eksik intermediate'ı, yanlış SAN'ı, earliest_cert_expiry'yi yanıltan cross certificate'ı ve saat kaymasını laboratuvarda üretiyor, alarmları promtool ile, TLS config'ini testssl.sh ile test ediyoruz.
mTLS ve Internal Certificate'lar: ASP.NET Core'da Client Certificate Authentication ve Kendi CA'nı İşletmek
mTLS'te istemci de bir certificate ve private key ile attığı imzayla kimliğini kanıtlar; public CA'lar client authentication EKU'sunu bıraktığı için bunun için offline root'lu kendi internal CA'n gerekir. ASP.NET Core'da AddCertificate ile CustomRootTrust, issuer ve CN tabanlı partner eşlemesi kuruyor, Kestrel'in TLS katmanındaki sessiz reddini, revocation'ı ve Nginx'in certificate'ı header ile iletmesinin private key olmadan nasıl taklit edilebildiğini gerçek koşularla görüyoruz.
HTTPS'i Zorunlu Kılmak: HTTP→HTTPS Redirect, HSTS'i Kademeli Açmak, Preload ve Mixed Content
HTTPS'i zorunlu kılmak için redirect'i TLS'in bittiği katmanda yaparsın, API'lerde redirect yerine HTTP'yi 400 ile reddedersin ve HSTS'i 5 dakikadan bir yıla kademeli açarsın; includeSubDomains'ten önce alt domain envanteri şart. Proxy arkasında UseHttpsRedirection döngüsünü ve secure'suz cookie'yi, 301'in POST'u GET'e çevirmesini, HSTS'in HTTP-only alt domain'i kilitlemesini ve Angular build'indeki mutlak http:// URL'in mixed content olarak bloklanmasını gerçek koşularla görüyoruz.
Yönetilen Platformlarda Certificate: Caddy, Azure App Service, Key Vault, Front Door ve Kubernetes'te cert-manager
Managed platformlarda certificate'ı platform alır ve yeniler, ama her birinin seni yakalayacak bir sınırı vardır: Caddy /data volume'ü olmadan rate limit'e takılır, App Service managed certificate wildcard vermez, Front Door doğrudan CNAME ister, cert-manager her yenilemede key'i değiştirir. Caddy, cert-manager ve Envoy Gateway'i Pebble ile gerçek koşularla çalıştırıp pinning'in yenilemede nasıl kırıldığını görüyoruz.
.NET'te ve Kestrel'de Certificate: dev-certs, PEM/PFX Yükleme, SNI, Yenilemede Reload ve HttpClient Doğrulaması
Kestrel, configuration'daki PEM veya PFX certificate'ını restart'sız yeniden yükler ama yalnızca Path'i izler, yaklaşık beş saniyede fark eder ve endpoint'i yeniden başlatır; root olmayan kullanıcıyla Certbot'un dosyalarını okuyamaz, bu yüzden bir deploy hook gerekir. dev-certs'in Linux'taki SSL_CERT_DIR ayarını, ServerCertificateSelector ile SNI'ı ve HttpClient'ta doğrulamayı kapatmadan CustomRootTrust ile internal CA'ya güvenmeyi gerçek koşularla görüyoruz.