Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Jenkins'te Parallel, Matrix, input ve Deploy Stage'leri
Aynı paketi önce staging'e, agent'sız bir input onayından sonra production'a sshagent, rsync ve systemctl ile deploy ediyoruz; Lockable Resources eşzamanlılığı, milestone ise sırayı çözer. Health check'li deploy script'i, eski build'in yeniden sonra deploy ettiği gerçek kilit çıktısı, inversePrecedence, failFast, Node 22/24 matrix'i ve IIS için app_offline.htm yapısı.
Jenkins ile Angular Pipeline: Node Container, npm Cache, Headless Test ve stash/unstash
Angular 22 uygulamasını node:24 container'ında npm ci, ng lint, Vitest ve ng build ile .NET API'yle paralel build edip stash/unstash ile tek pakette birleştiriyoruz. npm cache volume'ü, Vitest'in JUnit reporter'ı, budget'lar, browser modu için eksik paket hatası, 329 MB'lık node_modules'ü stash etmemek ve Pipeline Graph View'da paralel stage süreleri.
Jenkins ile .NET Pipeline: dotnet SDK Container'ı, Test Sonuçları, Coverage ve Publish Artifact'ı
Bookstore.Api'yi .NET SDK container'ında restore, build, test ve publish edip JUnit raporunu, Cobertura coverage'ı ve fingerprint'li artifact'ı Jenkins'e kaydediyoruz. NuGet cache volume'ünün izin hatası ve kazandırdığı süre, .NET 10'da Microsoft.Testing.Platform ile xUnit v3'ün JUnit çıktısı, coverage quality gate'i ve test raporu bulunamayınca kırmızıya dönen build.
Jenkins Multibranch Pipeline ve GitHub Entegrasyonu: Webhook, PR Build'leri ve Status Check
Multibranch pipeline her branch ve PR için otomatik job açar; webhook ile saniyeler içinde build başlar, sonuç commit'e status check olarak döner. Branch source trait'leri, webhook'un localhost URL'i ve Gitea'nın SSRF engeline takılması, when ile branch/PR ayrımı, fork PR'ında Jenkinsfile'ın base branch'ten okunması, required check ve PAT yerine GitHub App.
Jenkins Credentials: withCredentials, Credential Binding ve Groovy String Interpolation Tuzağı
Secret'ı credentials() veya withCredentials ile en dar scope'ta açar, sh adımında tek tırnakla shell değişkeni olarak okursun; çift tırnakla Groovy interpolation process'e sızdırır. Credential türleri ve SYSTEM/GLOBAL/folder scope'ları, JCasC'de readFile, masking'in base64'ü yakalayıp parçayı kaçırması, sshagent, folder credential ile ekip izolasyonu ve harici secret store'lar.
Jenkins Agent'ları: SSH Agent, Inbound Agent, Label'lar ve Docker Container'da Build
SSH agent'ta bağlantıyı controller, inbound agent'ta agent açar; build'i label expression'larla seçtiğin agent'ta ya da agent { docker } ile SDK container'ında koşturursun. JCasC ile agent tanımı, gerçek SSH ve WebSocket bağlantı log'ları, Docker Pipeline'ın workspace mount'u ve uid 1000 ayrıntısı, cleanWs ile disk, Kubernetes pod template ve Windows agent'a kısa bakış.
Jenkinsfile ile İlk Pipeline: Declarative Syntax, stages, steps, post ve environment
Jenkinsfile, pipeline'ı kodla aynı repository'de tarif eder; Declarative syntax'ta agent, stages ve steps iskeletin kendisi, environment, options, parameters, triggers ve post ise davranışı belirler. Linter çıktısı, tırnak kuralı, ilk build'de shell'e boş gelen parametre, when ile atlanan stage, Snippet Generator ve Replay, Scripted Pipeline ve NotSerializableException ile @NonCPS.
Jenkins Kurulumu: Docker ile LTS, Java 21, İlk Admin ve Plugin Seçimi
Jenkins'i Docker'da sürümü sabit bir LTS image'ı, isimli bir JENKINS_HOME volume'ü ve Java 21 ile kurarsın; setup wizard'ı plugins.txt ve JCasC ile atlarsın. Anonim volume tuzağı, initialAdminPassword, Docker-in-Docker'ın TLS sertifika hatası, anonymous erişim, controller'da sıfır executor, CSRF crumb'ı, agent → controller security ve Linux paketiyle kurulum.
Jenkins Nedir? Controller, Agent, Executor ve Ne Zaman GitHub Actions Yerine Jenkins
Jenkins, işleri planlayan bir controller ile build'leri executor'larında koşan agent'lardan oluşan self-hosted bir CI/CD sunucusudur. Hudson'dan bugüne geçmişi, workspace ve label kavramları, eşleşmeyen label'ın build'i nasıl queue'da beklettiği, plugin ekosisteminin bedeli, Freestyle ve Pipeline, LTS ve weekly hattı ve Jenkins'in GitHub Actions'a göre ne zaman doğru seçim olduğu.
.NET 6'dan .NET 10'a Hosting'de Ne Değişti: Port 8080, HTTP_PORTS, KnownIPNetworks ve Diğerleri
.NET 8'den beri ASP.NET Core image'ları 80 yerine 8080'i dinliyor ve hazır bir app kullanıcısı getiriyor, ama varsayılan kullanıcı hâlâ root; .NET 10'da image'lar Ubuntu tabanlı ve KnownNetworks ile WebHost obsolete. Eski -p 8000:80 komutunun connection reset vermesini, Docker'da root olmayan 80'in neden çalışıp başka runtime'da çalışmayabileceğini, eski tutorial'lardaki tuzakları ve .NET 11'in hosting'e dokunan breaking change'lerini gerçek koşularla görüyoruz.
Hosting Seçimi ve Production Checklist'i: Nginx, IIS, Caddy, Container ve PaaS
Hosting seçimini önce ekibin neyi işletebildiği, sonra servis sayısı, deploy sıklığı ve maliyet belirler; Linux VM ve Nginx, IIS, Caddy, Traefik, YARP, PaaS ve container aynı soruların farklı cevapları. Caddy'yi yedi satırlık config ve active health check ile deniyor, go-live öncesi on maddelik bir kontrol script'iyle yedinci yazının config'inde dışarıdan görünmeyen health endpoint'i ve 443'te eksik default server'ı yakalıyoruz.
IIS'te Production: Deploy, app_offline.htm, Kilitli Dosyalar, Application Initialization ve Angular
IIS'te çalışan uygulamanın DLL'leri kilitli; deploy'u app_offline.htm ile ya da .NET 7'den beri desteklenen enableShadowCopy ile yap ve bu ayarları sunucuda değil projedeki web.config'te tut, publish onları koruyor. Recycle ve overlapped recycle, Application Initialization ve idle timeout, IIS'te Data Protection, sub-application, URL Rewrite ile Angular ve IIS yerine AddWindowsService; IIS bu Mac'te çalıştırılmadı, web.config ve build çıktıları gerçek.