Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
GitHub Actions'ta Secret, Variable ve GITHUB_TOKEN Permission'ları
Secret'lar organization, repository ve environment seviyesinde tanımlanır, en dar seviye kazanır ve log'da metin eşleştirmesiyle maskelenir; base64 gibi türetilmiş değerler ve JSON içinden okunan alanlar maskelenmez. act ile sahte secret'larla ::add-mask::, if içinde secret kullanımı, variable'lar ve boş GITHUB_TOKEN'ı gösteriyor; permissions ile least privilege'ı, Eylül 2026'da gelen vulnerability-alerts scope'unu ve PAT yerine GitHub App token'ını anlatıyoruz.
.NET + Angular Monorepo'da GitHub Actions: Path Filtreleri, Artifact Aktarımı ve Tek Release Paketi
Path filtreli ayrı workflow'lar required check'i pending bırakır; monorepo'da tek workflow, git diff ile karar veren bir changes job'ı ve her zaman koşan bir özet job (ci-ok) bu sorunu çözer. Angular dist'ini artifact ile .NET publish'in wwwroot'una taşıyıp tag push'unda tek bir release zip'i üretiyor, artifact ile cache farkını ve gh release create ile GitHub Release'i act çıktılarıyla anlatıyoruz.
GitHub Actions ile Angular CI: setup-node, npm ci, Lint, Vitest, Build Budget'ları ve Playwright
Angular 22 CI'ında Node sürümünü setup-node@v7 ile package.json'daki devEngines'ten oku, npm ci ile lock dosyasına bağlı kur, ng lint, Vitest ve budget'lı ng build çalıştır, Playwright e2e'yi API ve PostgreSQL service container'ıyla koştur. Monorepo'da setup-node'un otomatik npm cache'inin neden açılmadığını, lock drift hatasını, Node sürüm uyumsuzluğunu ve tarayıcı cache'inin etkisini act çıktılarıyla gösteriyoruz.
GitHub Actions ile .NET CI: setup-dotnet, global.json, NuGet Cache, Test Raporu ve Coverage
.NET 10 CI'ında SDK'yı global.json ve setup-dotnet@v6 ile sabitle, restore'u lock dosyaları ve --locked-mode ile yap, NuGet cache'ini lock hash'ine bağla, dotnet format ve -warnaserror ile kapı koy. xUnit v3'ün Microsoft.Testing.Platform modunda TRX ve Cobertura raporu üretip job summary'ye yazıyor, upload-artifact ile saklıyoruz; act'in v7 artifact sınırını ve Linux'taki dosya adı tuzağını da gerçek çıktılarla gösteriyoruz.
GitHub Actions'ta Job'lar: needs, matrix, concurrency, timeout ve Service Container'lar
Job'lar varsayılan olarak paralel koşar; needs ile bir DAG kurulur, kırılan job'a bağlı her şey skipped olur. Bookstore CI'ını format, unit-test (OS matrix), integration-test (PostgreSQL 16/17/18 service container), web-build ve publish job'larına bölüp act ile koşturuyor; include/exclude, fail-fast, max-parallel, concurrency, timeout-minutes, continue-on-error ve Nisan 2026'da gelen service command/entrypoint'i inceliyoruz.
GitHub Actions'ta Expression, Context ve Variable'lar: if, outputs ve GITHUB_ENV
${{ }} içindeki expression'lar context'lerden (github, env, vars, steps, needs, inputs…) değer okur, loose karşılaştırma yapar ve if: koşullarını belirler. if içinde ${{ }} dışında metin bırakmanın neden her zaman doğru sayıldığını, contains/fromJSON/hashFiles/case fonksiyonlarını, GITHUB_OUTPUT ve GITHUB_ENV ile veri taşımayı, GITHUB_STEP_SUMMARY ile test tablosunu ve always ile !cancelled farkını act çıktılarıyla gösteriyoruz.
GitHub Actions Trigger'ları: push, pull_request, workflow_dispatch, schedule ve Filtreler
Workflow'u ne zaman çalıştıracağını on altındaki event'ler ve filtreler belirler: push ve pull_request için branches, tags, paths ve ! negation; activity type'lar, workflow_dispatch input'ları, timezone destekli schedule, workflow_run, repository_dispatch ve merge_group. github.event.inputs ile boolean okuma tuzağını, actionlint'in yakaladığı trigger hatalarını ve act'in filtreleri neden değerlendirmediğini gerçek çıktılarla gösteriyoruz.
GitHub Actions Nedir? Workflow, Event, Job, Step ve Runner ile İlk CI
GitHub Actions, repository'deki event'lere göre .github/workflows altındaki YAML workflow'larını runner'larda koşturan CI/CD platformudur. Bookstore API için restore, build ve unit test yapan ilk workflow'u yazıp act ve actionlint ile yerelde deniyor; uses ile run farkını, run log'unu, re-run'ı ve Web API 31'deki workflow'un nedenlerini konuşuyoruz.
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ğı.
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ış.
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.
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.