Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Script'i Test Etmek ve CI'da Çalıştırmak: Pester 6, PSScriptAnalyzer, Cross-Platform ve 5.1'den 7.x'e Taşımak
GitHub Actions'ta shell: pwsh adımı yalnız $ErrorActionPreference = 'stop' ekler; ortadaki dotnet test kırılsa da son native komut 0 dönerse adım yeşil kalır, bu yüzden run bloğunu tek bir script çağrısı yap. Bookstore.Ops için Pester 6 testleri ve mock'lar, PSScriptAnalyzer kuralları, Windows ve Ubuntu matrix'i, cross-platform tuzaklar, 5.1'den 7.x'e ve 7.6'dan 7.7'ye geçişteki farklar.
Uzak Sunucu Yönetimi: SSH Tabanlı Remoting, Invoke-Command, Session'lar ve Credential'ı Script'e Gömmemek
PowerShell remoting'de Invoke-Command'dan dönen object'ler serialize edilmiş kopyalardır: property'ler gelir, method'lar gelmez; uzaktaki işi script bloğunun içinde yap. SSH tabanlı remoting, $using:, session'lar, ikinci hop, SecretManagement ile vault'tan secret okumak ve Bookstore.Api'yi iki sunucuya sırayla deploy eden, ilk hatada duran bir rollout script'i.
Gerçek İşler: Dosya Sistemi, REST API, JSON/CSV, Scheduled Task, Windows Service, IIS ve Windows'ta Network Teşhisi
ConvertTo-Json varsayılan olarak yalnız 2 seviye derine iner; API'ye gönderilen iç içe gövde sessizce "System.Collections.Hashtable" string'ine dönüşür, bu yüzden her gövdeye -Depth ver. Bearer token, -MaximumRetryCount'un 401'de bile POST'u tekrarlaması, $PSScriptRoot ve CSV encoding, Windows Service, scheduled task, IIS ve network komutları, sonunda Bookstore.Api için yedek alan ve geri dönebilen bir deploy script'i.
Function'dan Module'e: Advanced Function, [CmdletBinding()], Parametre Doğrulama, Pipeline Input ve -WhatIf
PowerShell'de function'ın sonucu return değil, success stream'e düşen her şeydir; advanced function ([CmdletBinding()]) bunu, parametre doğrulamayı, pipeline input'u ve -WhatIf/-Confirm'ü cmdlet gibi yönetmeyi sağlar. Bookstore.Ops module'ünü manifest'iyle yazıyor, module'e geçmeyen preference'ları ve CI'da ShouldProcess tuzağını gösteriyor, PSResourceGet ile yerel bir repository'den kuruyoruz.
Error Handling: Terminating ve Non-Terminating Hatalar, $ErrorActionPreference, try/catch ve Native Komutların Exit Code'u
PowerShell'de $ErrorActionPreference = 'Stop' yalnız PowerShell hatalarını durdurur; dotnet test gibi native komutun başarısız exit code'u için $PSNativeCommandUseErrorActionPreference = $true da gerekir, yoksa testler kırılsa bile publish çalışır ve script 0 ile çıkar. İki hata türünü, try/catch/finally ve trap'i, Write-Error ile throw farkını, stderr ve 2>&1 davranışını, Set-StrictMode'u, set -euo pipefail karşılıklarını ve Bookstore için ilk hatada duran bir build script'ini gösteriyoruz.
Koşullar, Döngüler ve Pipeline'ı Script'te Kullanmak: switch, foreach, Where-Object, ForEach-Object ve -Parallel
PowerShell'de foreach statement bellekteki koleksiyonda en hızlısıdır, dosyadan akan veride ise pipeline erken durabildiği için çok daha az iş yapar; ForEach-Object içindeki break ise script'in kalanını atlar. Karşılaştırma operatörlerini, switch -Regex ile log okumayı, begin/process/end bloklarını ve ForEach-Object -Parallel'i Bookstore'un 200 kitap kapağını kontrol eden bir script'le, $using:, race condition ve Format-Table tuzaklarıyla birlikte gösteriyoruz.
Variable'lar, Tipler ve Koleksiyonlar: [type] Cast, Array, Hashtable, PSCustomObject, Splatting ve String'ler
PowerShell'de karşılaştırmanın sonucu soldaki değerin tipine bağlıdır ve Import-Csv her sütunu string okur; bu yüzden veriyi en başta gerçek tiplere çevirmek gerekir. Bookstore'un kitap CSV'sinden yayınevi raporu çıkarırken $null'ı sola yazma kuralını, array ve +=, List, hashtable, PSCustomObject, splatting, string'ler, Türkçe culture'da sayı ve tarih tuzaklarını ve PowerShell 7.7'de [decimal] cast'inin .NET 11 yüzünden farklı sonuç vermesini gösteriyoruz.
İlk PowerShell Script'i: .ps1, Çalıştırma Yolları, #Requires, Comment-Based Help ve pwsh mi powershell.exe mi?
Bir PowerShell script'i PowerShell içinden çağrılınca aynı process'te kendi scope'unda, pwsh -File ile çağrılınca yeni bir process'te çalışır ve sonucunu exit code ile bildirir; Write-Error tek başına exit code'u değiştirmez. Bookstore API'sini kontrol eden Test-BookstoreHealth.ps1 ile &, dot-sourcing, -File ve -Command farkını, Linux'ta shebang'i, #Requires'ı, comment-based help'i, Windows PowerShell 5.1 ile 7.6 LTS farklarını ve BOM/CRLF tuzaklarını gösteriyoruz.
Argo CD'yi Production'da İşletmek ve 2.x'ten 3.6'ya Değişenler: SSO, RBAC, Notifications, Metrikler ve Upgrade
Argo CD'yi production'da işletmek, kendi ayarlarını da Git'te tutmak, insanları SSO ve en az yetkili RBAC rolleriyle, CI'ı süreli token ile içeri almak, admin hesabını kapatmak, bildirim ve argocd_app_info alarmı kurmak ve son üç minor sürümde kalmak demek. Hesapları, RBAC'ı ve bildirimleri Git'ten uyguluyor, 3.0'ın update, delete ve logs değişikliklerini, metrikleri ve 3.6'ya kadar yükseltme notlarını gerçek çıktılarla görüyor ve seriyi kapatıyoruz.
Argo Rollouts ile Progressive Delivery: Prometheus Metrikleriyle Otomatik Canary Analizi
Argo Rollouts, Deployment'ın yerine geçen bir Rollout ile yeni sürümü adım adım açar ve Prometheus'tan okuduğu metriklere göre ilerler ya da kendiliğinden geri döner. Bookstore API'sini Rollout'a çeviriyor, prod'da %25 ve %50 adımlı bir canary kuruyor, iyi bir sürümün geçişini ve %30 hata dönen bir sürümün 92 saniyede abort edilmesini, ardından Git'i revert ile gerçeğe uydurmayı gerçek çıktılarla görüyoruz.
GitOps'ta Secret Yönetimi: Sealed Secrets, SOPS ve Secret'ı Git'e Hiç Koymamak
Secret'ı Git'e koymanın güvenli yolu, değeri yalnız hedef cluster'ın açabileceği biçimde şifrelemek (Sealed Secrets), ekibin anahtarıyla şifreleyip manifest üretiminde çözmek (SOPS ve KSOPS) ya da Git'e yalnız bir referans koymak (External Secrets Operator). Var olan Secret'ı devralmayı, strict scope'u, anahtar kaybı provasını, KSOPS'u Argo CD'ye eklemeyi ve üç yolun karşılaştırmasını gerçek çıktılarla görüyoruz.
CI ile GitOps'u Bağlamak: Image Tag Promotion, Pull Request ile Environment Atlatmak ve Image Updater
GitOps'ta CI image'ı bir kez build edip registry'ye koyar ve hangi image'ın çalışacağını config repo'suna commit olarak yazar; deploy'u Argo CD yapar. Yerel bir CI script'iyle tag ve digest'i dev'e commit etmeyi, staging ve prod'a pull request ile promotion'ı, aynı dosyaya yazan iki pipeline'ın çakışmasını, Argo CD Image Updater'ın digest'i silmesini ve Source Hydrator'ı gerçek çıktılarla görüyoruz.