{"id":37218,"date":"2025-12-29T01:01:10","date_gmt":"2025-12-28T22:01:10","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/"},"modified":"2025-12-29T01:01:10","modified_gmt":"2025-12-28T22:01:10","slug":"azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/","title":{"rendered":"Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz"},"content":{"rendered":"<h2>Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde s\u00fcr\u00fcm y\u00f6netimi, projelerin d\u00fczenini, izlenebilirli\u011fini ve kalitesini do\u011frudan etkileyen kritik bir ad\u0131md\u0131r. \u00d6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k projelerde, do\u011fru s\u00fcr\u00fcmleme stratejileri benimsemek, hem geli\u015ftirici ekiplerinin i\u015f y\u00fck\u00fcn\u00fc hafifletir hem de son kullan\u0131c\u0131ya sunulan \u00fcr\u00fcn\u00fcn istikrar\u0131n\u0131 garantiler. Bu makalede, modern CI\/CD d\u00fcnyas\u0131n\u0131n vazge\u00e7ilmez ara\u00e7lar\u0131ndan Azure DevOps ve otomatik s\u00fcr\u00fcmleme felsefesinin g\u00fc\u00e7l\u00fc temsilcisi Semantic Release&#8217;i bir araya getirerek, manuel tetiklemeli s\u00fcr\u00fcm y\u00fckseltmelerini nas\u0131l daha verimli ve hatas\u0131z hale getirebilece\u011fimizi detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Giri\u015f: Semantik S\u00fcr\u00fcmleme ve \u00d6nemi<\/h3>\n<p>Yaz\u0131l\u0131m projelerinde s\u00fcr\u00fcm numaralar\u0131, bir projenin geli\u015fimini ve de\u011fi\u015fikliklerini ifade eden \u00f6nemli g\u00f6stergelerdir. Ancak bu numaralar\u0131n rastgele verilmesi, hem geli\u015ftiriciler hem de kullan\u0131c\u0131lar i\u00e7in kafa kar\u0131\u015f\u0131kl\u0131\u011f\u0131na yol a\u00e7abilir. Semantik S\u00fcr\u00fcmleme (Semantic Versioning), bu karma\u015fay\u0131 ortadan kald\u0131rmak i\u00e7in tasarlanm\u0131\u015f basit ama etkili bir standartt\u0131r.<\/p>\n<h4>Semantik S\u00fcr\u00fcmleme Temelleri<\/h4>\n<p>Semantik S\u00fcr\u00fcmleme, <code>MAJOR.MINOR.PATCH<\/code> format\u0131nda \u00fc\u00e7 par\u00e7al\u0131 bir s\u00fcr\u00fcm numaras\u0131 kullan\u0131r. Her bir par\u00e7a, yap\u0131lan de\u011fi\u015fikliklerin t\u00fcr\u00fcn\u00fc g\u00f6sterir:<br \/>\n*   <strong>MAJOR (B\u00fcy\u00fck):<\/strong> Geriye d\u00f6n\u00fck uyumlulu\u011fu bozan (breaking changes) API de\u011fi\u015fiklikleri yap\u0131ld\u0131\u011f\u0131nda art\u0131r\u0131l\u0131r.<br \/>\n*   <strong>MINOR (K\u00fc\u00e7\u00fck):<\/strong> Geriye d\u00f6n\u00fck uyumlu yeni \u00f6zellikler (new features) eklendi\u011finde art\u0131r\u0131l\u0131r.<br \/>\n*   <strong>PATCH (Yama):<\/strong> Geriye d\u00f6n\u00fck uyumlu hata d\u00fczeltmeleri (bug fixes) yap\u0131ld\u0131\u011f\u0131nda art\u0131r\u0131l\u0131r.<br \/>\nBu yap\u0131, bir s\u00fcr\u00fcm numaras\u0131n\u0131 g\u00f6ren herkesin, o s\u00fcr\u00fcmde ne t\u00fcr de\u011fi\u015fiklikler bekleyebilece\u011fi konusunda net bir fikre sahip olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Neden Semantik S\u00fcr\u00fcmleme Kullanmal\u0131y\u0131z?<\/h4>\n<p>Semantik S\u00fcr\u00fcmleme, yaz\u0131l\u0131m ekosisteminde bir\u00e7ok fayda sa\u011flar:<br \/>\n*   <strong>Net \u0130leti\u015fim:<\/strong> Geli\u015ftiriciler ve kullan\u0131c\u0131lar aras\u0131nda s\u00fcr\u00fcm de\u011fi\u015fiklikleri hakk\u0131nda net bir dil olu\u015fturur.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi:<\/strong> Di\u011fer projelerle entegrasyonu olan projelerde, ba\u011f\u0131ml\u0131l\u0131klar\u0131n uyumlulu\u011funu y\u00f6netmeyi kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Risk Azaltma:<\/strong> Geriye d\u00f6n\u00fck uyumsuzluklar\u0131n ne zaman beklenece\u011fini bilmek, y\u00fckseltme risklerini azalt\u0131r.<br \/>\n*   <strong>Otomasyon Dostu:<\/strong> Otomatik s\u00fcr\u00fcmleme ara\u00e7lar\u0131 i\u00e7in ideal bir temel sunar.<\/p>\n<h4>Manuel S\u00fcr\u00fcmlemenin Riskleri<\/h4>\n<p>Geleneksel manuel s\u00fcr\u00fcmleme y\u00f6ntemleri, \u00f6zellikle b\u00fcy\u00fck ekiplerde ve h\u0131zl\u0131 geli\u015ftirme d\u00f6ng\u00fclerinde ciddi riskler ta\u015f\u0131r:<br \/>\n*   <strong>\u0130nsan Hatas\u0131:<\/strong> S\u00fcr\u00fcm numaralar\u0131n\u0131n unutulmas\u0131, yanl\u0131\u015f girilmesi veya standartlara uygun olmamas\u0131.<br \/>\n*   <strong>Tutars\u0131zl\u0131k:<\/strong> Farkl\u0131 geli\u015ftiricilerin farkl\u0131 s\u00fcr\u00fcmleme yakla\u015f\u0131mlar\u0131 benimsemesi.<br \/>\n*   <strong>Geli\u015ftirme H\u0131z\u0131 Engeli:<\/strong> Her s\u00fcr\u00fcmde manuel m\u00fcdahale gereklili\u011fi, CI\/CD s\u00fcre\u00e7lerini yava\u015flat\u0131r.<br \/>\n*   <strong>\u0130zlenebilirlik Eksikli\u011fi:<\/strong> Hangi de\u011fi\u015fikli\u011fin hangi s\u00fcr\u00fcmle ili\u015fkilendirildi\u011fini takip etmek zorla\u015f\u0131r.<\/p>\n<h3>Semantic Release Nedir ve Neden Kullan\u0131l\u0131r?<\/h3>\n<p>Semantic Release, geli\u015ftirme s\u00fcre\u00e7lerinizi otomatikle\u015ftirmek ve s\u00fcr\u00fcm y\u00f6netimini kolayla\u015ft\u0131rmak i\u00e7in tasarlanm\u0131\u015f g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Projenizin Git commit ge\u00e7mi\u015fini analiz ederek, Semantik S\u00fcr\u00fcmleme kurallar\u0131na uygun olarak yeni s\u00fcr\u00fcm numaralar\u0131n\u0131 otomatik olarak belirler, Git etiketlerini (tags) olu\u015fturur ve de\u011fi\u015fiklik g\u00fcnl\u00fcklerini (changelog) g\u00fcnceller.<\/p>\n<h4>Otomatik S\u00fcr\u00fcmleme Felsefesi<\/h4>\n<p>Semantic Release&#8217;in temel felsefesi, s\u00fcr\u00fcmleme karar\u0131n\u0131n insan m\u00fcdahalesi yerine commit mesajlar\u0131n\u0131n i\u00e7eri\u011fine dayanmas\u0131d\u0131r. Bu, geli\u015ftiricilerin sadece anlaml\u0131 ve standartla\u015ft\u0131r\u0131lm\u0131\u015f commit mesajlar\u0131 yazmaya odaklanmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, <code>fix: d\u00fczeltme yap\u0131ld\u0131<\/code> mesaj\u0131 bir <code>PATCH<\/code> s\u00fcr\u00fcm\u00fcn\u00fc tetiklerken, <code>feat: yeni \u00f6zellik eklendi<\/code> bir <code>MINOR<\/code> s\u00fcr\u00fcm\u00fcn\u00fc tetikler.<\/p>\n<h4>Temel Bile\u015fenleri<\/h4>\n<p>Semantic Release, bir dizi eklenti (plugins) arac\u0131l\u0131\u011f\u0131yla \u00e7al\u0131\u015f\u0131r. Bu eklentiler, farkl\u0131 g\u00f6revleri yerine getirir:<br \/>\n*   <strong><code>@semantic-release\/commit-analyzer<\/code>:<\/strong> Commit mesajlar\u0131n\u0131 analiz eder ve s\u00fcr\u00fcm t\u00fcr\u00fcn\u00fc (major, minor, patch) belirler.<br \/>\n*   <strong><code>@semantic-release\/release-notes-generator<\/code>:<\/strong> Analiz edilen commit&#8217;lerden de\u011fi\u015fiklik g\u00fcnl\u00fc\u011f\u00fc olu\u015fturur.<br \/>\n*   <strong><code>@semantic-release\/changelog<\/code>:<\/strong> De\u011fi\u015fiklik g\u00fcnl\u00fc\u011f\u00fcn\u00fc bir dosyaya (\u00f6rn. <code>CHANGELOG.md<\/code>) yazar.<br \/>\n*   <strong><code>@semantic-release\/npm<\/code>:<\/strong> <code>package.json<\/code> dosyas\u0131ndaki s\u00fcr\u00fcm numaras\u0131n\u0131 g\u00fcnceller ve npm paketini yay\u0131nlar.<br \/>\n*   <strong><code>@semantic-release\/git<\/code>:<\/strong> G\u00fcncellenmi\u015f dosyalar\u0131 (changelog, package.json) commit eder ve yeni bir Git etiketi olu\u015fturur.<br \/>\n*   <strong><code>@semantic-release\/github<\/code> veya <code>@semantic-release\/azure-devops<\/code>:<\/strong> GitHub veya Azure DevOps \u00fczerinde release olu\u015fturur.<\/p>\n<h4>Avantajlar\u0131<\/h4>\n<p>Semantic Release kullanman\u0131n ba\u015fl\u0131ca avantajlar\u0131 \u015funlard\u0131r:<br \/>\n*   <strong>Tutarl\u0131l\u0131k:<\/strong> T\u00fcm s\u00fcr\u00fcmler Semantik S\u00fcr\u00fcmleme standartlar\u0131na uygun olur.<br \/>\n*   <strong>Otomasyon:<\/strong> Manuel s\u00fcr\u00fcmleme hatalar\u0131n\u0131 ortadan kald\u0131r\u0131r ve s\u00fcreci h\u0131zland\u0131r\u0131r.<br \/>\n*   <strong>Geli\u015ftirici Odakl\u0131l\u0131k:<\/strong> Geli\u015ftiriciler s\u00fcr\u00fcm numaralar\u0131n\u0131 d\u00fc\u015f\u00fcnmek yerine koda odaklan\u0131r.<br \/>\n*   <strong>\u015eeffafl\u0131k:<\/strong> Otomatik olarak olu\u015fturulan de\u011fi\u015fiklik g\u00fcnl\u00fckleri sayesinde, her s\u00fcr\u00fcmdeki de\u011fi\u015fiklikler net bir \u015fekilde g\u00f6r\u00fclebilir.<\/p>\n<h3>Azure DevOps Ortam\u0131nda S\u00fcr\u00fcmleme Yakla\u015f\u0131mlar\u0131<\/h3>\n<p>Azure DevOps, kapsaml\u0131 CI\/CD yetenekleri sunan entegre bir platformdur. S\u00fcr\u00fcmleme, Azure Pipelines&#8217;\u0131n temel bir par\u00e7as\u0131d\u0131r ve \u00e7e\u015fitli yakla\u015f\u0131mlarla uygulanabilir.<\/p>\n<h4>Geleneksel S\u00fcr\u00fcmleme Y\u00f6ntemleri<\/h4>\n<p>Azure Pipelines&#8217;ta geleneksel olarak s\u00fcr\u00fcm numaralar\u0131, genellikle derleme numaralar\u0131 veya manuel olarak belirlenen de\u011fi\u015fkenler arac\u0131l\u0131\u011f\u0131yla y\u00f6netilir.<br \/>\n*   <strong>Derleme Numaras\u0131:<\/strong> <code>$(Build.BuildNumber)<\/code> gibi \u00f6n tan\u0131ml\u0131 de\u011fi\u015fkenler, her derleme i\u00e7in benzersiz bir numara sa\u011flar. Ancak bu numaralar genellikle anlams\u0131zd\u0131r ve Semantik S\u00fcr\u00fcmleme kurallar\u0131na uymaz.<br \/>\n*   <strong>Manuel De\u011fi\u015fkenler:<\/strong> Kullan\u0131c\u0131lar, pipeline&#8217;da manuel olarak <code>major<\/code>, <code>minor<\/code>, <code>patch<\/code> de\u011fi\u015fkenleri tan\u0131mlayabilir ve bunlar\u0131 elle g\u00fcncelleyebilir. Bu da manuel s\u00fcr\u00fcmlemenin getirdi\u011fi riskleri bar\u0131nd\u0131r\u0131r.<\/p>\n<h4>Azure Pipelines ve S\u00fcr\u00fcm Numaralar\u0131<\/h4>\n<p>Azure Pipelines, <code>semver<\/code> gibi yerle\u015fik fonksiyonlar sunmaz, ancak \u00f6zel betikler (script) veya eklentilerle Semantik S\u00fcr\u00fcmleme uygulanabilir. <code>semantic-release<\/code> gibi ara\u00e7lar, bu bo\u015flu\u011fu doldurarak Azure Pipelines&#8217;\u0131n g\u00fcc\u00fcn\u00fc Semantik S\u00fcr\u00fcmleme ile birle\u015ftirir.<\/p>\n<h4>Git Ak\u0131\u015f Modelleri ve S\u00fcr\u00fcmleme<\/h4>\n<p>Farkl\u0131 Git ak\u0131\u015f modelleri (Git Flow, GitHub Flow, GitLab Flow), s\u00fcr\u00fcmleme stratejilerini etkiler. Semantic Release, \u00f6zellikle <code>main<\/code> (veya <code>master<\/code>) branch&#8217;ine yap\u0131lan commit&#8217;ler \u00fczerinden otomatik s\u00fcr\u00fcmleme yapmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu, genellikle GitHub Flow veya GitLab Flow gibi daha basit ve s\u00fcrekli entegrasyonu te\u015fvik eden modellerle iyi uyum sa\u011flar. Manuel tetikleme, bu modellerin d\u0131\u015f\u0131nda, \u00f6rne\u011fin belirli bir <code>release<\/code> branch&#8217;inden veya \u00f6zel bir durum i\u00e7in s\u00fcr\u00fcm olu\u015fturma ihtiyac\u0131nda devreye girebilir.<\/p>\n<h3>Manuel S\u00fcr\u00fcm Y\u00fckseltmelerinin Zorluklar\u0131 ve \u00c7\u00f6z\u00fcmler<\/h3>\n<p>Manuel s\u00fcr\u00fcm y\u00fckseltmeleri, yukar\u0131da bahsedildi\u011fi gibi bir\u00e7ok zorluk i\u00e7erir. Ancak baz\u0131 durumlarda, \u00f6zellikle kritik yamalar, acil durum d\u00fczeltmeleri veya \u00f6zel yay\u0131n s\u00fcre\u00e7leri i\u00e7in manuel m\u00fcdahale gerekebilir. Burada \u00f6nemli olan, manuel m\u00fcdahaleyi otomasyonun g\u00fcc\u00fcyle birle\u015ftirmektir.<\/p>\n<h4>\u0130nsan Hatas\u0131 Fakt\u00f6r\u00fc<\/h4>\n<p>Manuel s\u00fcr\u00fcm y\u00fckseltmelerinde en b\u00fcy\u00fck risk, insan hatas\u0131d\u0131r. Yanl\u0131\u015f bir s\u00fcr\u00fcm numaras\u0131n\u0131n girilmesi, <code>CHANGELOG.md<\/code> dosyas\u0131n\u0131n g\u00fcncellenmemesi veya Git etiketinin atlanmas\u0131 gibi durumlar, projenin s\u00fcr\u00fcm ge\u00e7mi\u015finde tutars\u0131zl\u0131klara yol a\u00e7abilir.<\/p>\n<h4>Tutars\u0131zl\u0131k ve Karma\u015fa<\/h4>\n<p>Birden fazla geli\u015ftiricinin ayn\u0131 projede \u00e7al\u0131\u015fmas\u0131 durumunda, manuel s\u00fcr\u00fcmleme kurallar\u0131n\u0131n veya standartlar\u0131n\u0131n tam olarak takip edilmemesi, s\u00fcr\u00fcm numaralar\u0131nda ve s\u00fcre\u00e7lerde tutars\u0131zl\u0131\u011fa neden olabilir. Bu da hem i\u00e7 ekipler hem de d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar i\u00e7in kafa kar\u0131\u015ft\u0131r\u0131c\u0131 olabilir.<\/p>\n<h4>Otomasyonun Rol\u00fc<\/h4>\n<p>Semantic Release gibi ara\u00e7lar, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in otomasyonu devreye sokar. Manuel tetiklemeli bir pipeline&#8217;da bile, s\u00fcr\u00fcm y\u00fckseltme ad\u0131mlar\u0131n\u0131n Semantic Release taraf\u0131ndan y\u00f6netilmesi, tutarl\u0131l\u0131\u011f\u0131 ve do\u011frulu\u011fu garanti eder. Geli\u015ftiricinin tek yapmas\u0131 gereken, pipeline&#8217;\u0131 manuel olarak tetiklemek ve Semantic Release&#8217;in gerisini halletmesini sa\u011flamakt\u0131r.<\/p>\n<h3>Azure DevOps ile Semantic Release Entegrasyonu<\/h3>\n<p>Azure DevOps ve Semantic Release&#8217;i bir araya getirmek, g\u00fc\u00e7l\u00fc ve esnek bir s\u00fcr\u00fcmleme s\u00fcreci olu\u015fturman\u0131z\u0131 sa\u011flar. Bu entegrasyon, \u00f6zellikle manuel tetiklemeli bir senaryoda, otomasyonun avantajlar\u0131ndan faydalan\u0131rken kontrol\u00fc elinizde tutman\u0131za olanak tan\u0131r.<\/p>\n<h4>Gerekli Ara\u00e7lar ve Eklentiler<\/h4>\n<p>Entegrasyon i\u00e7in ba\u015fl\u0131ca ihtiya\u00e7lar \u015funlard\u0131r:<br \/>\n*   <strong>Node.js:<\/strong> Semantic Release bir Node.js uygulamas\u0131d\u0131r, bu y\u00fczden pipeline&#8217;\u0131n\u0131zda Node.js kurulu olmal\u0131d\u0131r.<br \/>\n*   <strong><code>semantic-release<\/code> paketi:<\/strong> Projenizin <code>devDependencies<\/code> k\u0131sm\u0131na eklenmelidir.<br \/>\n*   <strong><code>@semantic-release\/git<\/code>:<\/strong> De\u011fi\u015fiklikleri Git deposuna geri yazmak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong><code>@semantic-release\/changelog<\/code>:<\/strong> De\u011fi\u015fiklik g\u00fcnl\u00fc\u011f\u00fc olu\u015fturmak i\u00e7in.<br \/>\n*   <strong><code>@semantic-release\/npm<\/code>:<\/strong> E\u011fer bir npm paketi yay\u0131nl\u0131yorsan\u0131z.<br \/>\n*   <strong><code>@semantic-release\/azure-devops<\/code> (iste\u011fe ba\u011fl\u0131):<\/strong> Azure DevOps release&#8217;leri olu\u015fturmak i\u00e7in.<br \/>\n*   <strong>Ki\u015fisel Eri\u015fim Belirteci (PAT):<\/strong> Semantic Release&#8217;in Git deposuna yazma ve etiket olu\u015fturma yetkisine sahip olmas\u0131 i\u00e7in bir PAT gereklidir.<\/p>\n<h4>Pipeline Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>Azure DevOps YAML pipeline&#8217;\u0131n\u0131zda Semantic Release&#8217;i \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir <code>script<\/code> g\u00f6revi eklemeniz gerekir. Bu script, <code>semantic-release<\/code> komutunu \u00e7al\u0131\u015ft\u0131racakt\u0131r.<\/p>\n<pre><code class=\"language-yaml\">trigger: none # Manuel tetikleme i\u00e7in\n\npool:\n  vmImage: 'ubuntu-latest'\n\nvariables:\n  GIT_AUTHOR_NAME: 'Azure DevOps Build'\n  GIT_AUTHOR_EMAIL: 'azuredevops@example.com'\n  # PAT'i g\u00fcvenli bir \u015fekilde saklay\u0131n ve pipeline de\u011fi\u015fkeni olarak kullan\u0131n\n  # \u00d6rne\u011fin, bir Secret Variable grubundan veya pipeline de\u011fi\u015fkeni olarak gizli tutun\n  # SEMANTIC_RELEASE_TOKEN: $(System.AccessToken) veya \u00f6zel bir PAT\n\nsteps:\n- task: NodeTool@0\n  inputs:\n    versionSpec: '16.x'\n  displayName: 'Install Node.js'\n\n- script: |\n    npm ci\n  displayName: 'Install Dependencies'\n\n- script: |\n    npx semantic-release\n  displayName: 'Run Semantic Release'\n  env:\n    # Git push i\u015flemleri i\u00e7in bir PAT gereklidir.\n    # Bu PAT'in \"Code (Read & write)\" izinlerine sahip olmas\u0131 gerekir.\n    # $(System.AccessToken) genellikle sadece okuma izni verir, bu y\u00fczden \u00f6zel bir PAT daha iyidir.\n    # AZURE_DEVOPS_TOKEN: $(System.AccessToken) # E\u011fer bu token yeterli yetkiye sahipse\n    # Veya daha g\u00fcvenli bir \u015fekilde:\n    AZURE_DEVOPS_TOKEN: $(PAT_FOR_SEMANTIC_RELEASE) # Kendi olu\u015fturdu\u011funuz PAT de\u011fi\u015fkeni\n    # Di\u011fer gerekli ortam de\u011fi\u015fkenleri (\u00f6rn. NPM_TOKEN e\u011fer npm'e yay\u0131n yap\u0131l\u0131yorsa)<\/pre>\n<p><\/code><\/p>\n<h4>Kimlik Do\u011frulama ve Yetkilendirme<\/h4>\n<p>Semantic Release'in Git deposuna commit yapabilmesi ve etiket olu\u015fturabilmesi i\u00e7in uygun kimlik do\u011frulama yetkilerine sahip olmas\u0131 gerekir.<br \/>\n*   <strong><code>System.AccessToken<\/code>:<\/strong> Azure Pipelines'\u0131n varsay\u0131lan olarak sa\u011flad\u0131\u011f\u0131 bu token, genellikle sadece okuma iznine sahiptir. Git'e yazma i\u015flemleri i\u00e7in yeterli olmayabilir.<br \/>\n*   <strong>Ki\u015fisel Eri\u015fim Belirteci (PAT):<\/strong> En g\u00fcvenli ve \u00f6nerilen y\u00f6ntem, \"Code (Read & write)\" izinlerine sahip bir PAT olu\u015fturmak ve bunu Azure DevOps pipeline'\u0131n\u0131zda bir gizli de\u011fi\u015fken olarak kullanmakt\u0131r. Bu PAT, <code>AZURE_DEVOPS_TOKEN<\/code> veya benzeri bir ortam de\u011fi\u015fkeni olarak Semantic Release'e sa\u011flan\u0131r.<\/p>\n<p><strong>\u00d6nemli:<\/strong> PAT'inizi do\u011frudan YAML dosyas\u0131na yazmay\u0131n. Azure DevOps'ta \"Variable group\" veya pipeline de\u011fi\u015fkenleri b\u00f6l\u00fcm\u00fcnde \"secret\" olarak i\u015faretleyerek g\u00fcvenli bir \u015fekilde saklay\u0131n.<\/p>\n<h3>Manuel Tetikleme ve S\u00fcr\u00fcm Y\u00fckseltme S\u00fcreci<\/h3>\n<p>Manuel tetiklemeli bir s\u00fcr\u00fcm y\u00fckseltme senaryosunda, bir geli\u015ftirici veya yay\u0131n y\u00f6neticisi, belirli bir zamanda veya belirli bir ihtiya\u00e7 do\u011frultusunda s\u00fcr\u00fcm olu\u015fturma pipeline'\u0131n\u0131 ba\u015flat\u0131r.<\/p>\n<h4>\u00d6zel Pipeline Tetikleyicileri<\/h4>\n<p>Yukar\u0131daki YAML \u00f6rne\u011finde <code>trigger: none<\/code> kullan\u0131lmas\u0131, pipeline'\u0131n otomatik olarak tetiklenmesini engeller. Bu pipeline, sadece Azure DevOps aray\u00fcz\u00fcnden manuel olarak \"Run pipeline\" se\u00e7ene\u011fiyle ba\u015flat\u0131labilir.<\/p>\n<h4>S\u00fcr\u00fcmleme Ad\u0131mlar\u0131n\u0131n Tan\u0131mlanmas\u0131<\/h4>\n<p>Manuel tetiklemeli pipeline'da Semantic Release'in \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131, t\u00fcm s\u00fcr\u00fcmleme ad\u0131mlar\u0131n\u0131 otomatikle\u015ftirir:<br \/>\n1.  <strong>Commit Analizi:<\/strong> <code>main<\/code> (veya belirlenen) branch'indeki commit mesajlar\u0131 analiz edilir.<br \/>\n2.  <strong>S\u00fcr\u00fcm Belirleme:<\/strong> Yeni <code>MAJOR<\/code>, <code>MINOR<\/code> veya <code>PATCH<\/code> s\u00fcr\u00fcm\u00fc belirlenir.<br \/>\n3.  <strong>De\u011fi\u015fiklik G\u00fcnl\u00fc\u011f\u00fc Olu\u015fturma:<\/strong> Yeni s\u00fcr\u00fcme ait de\u011fi\u015fiklikler i\u00e7in <code>CHANGELOG.md<\/code> g\u00fcncellenir.<br \/>\n4.  <strong>S\u00fcr\u00fcm Dosyalar\u0131n\u0131 G\u00fcncelleme:<\/strong> <code>package.json<\/code> gibi s\u00fcr\u00fcm i\u00e7eren dosyalar g\u00fcncellenir.<br \/>\n5.  <strong>Git \u0130\u015flemleri:<\/strong> G\u00fcncellenmi\u015f dosyalar yeni bir commit ile depoya geri yaz\u0131l\u0131r ve yeni s\u00fcr\u00fcm numaras\u0131yla bir Git etiketi olu\u015fturulur.<br \/>\n6.  <strong>Release Olu\u015fturma:<\/strong> \u0130ste\u011fe ba\u011fl\u0131 olarak, Azure DevOps veya GitHub \u00fczerinde bir release olu\u015fturulur.<\/p>\n<h4>\u00d6rnek YAML Pipeline Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>A\u015fa\u011f\u0131da, manuel tetiklemeli ve Semantic Release kullanan basit bir Azure DevOps YAML pipeline \u00f6rne\u011fi bulunmaktad\u0131r:<\/p>\n<pre><code class=\"language-yaml\"># azure-pipelines.yml\ntrigger: none # Bu pipeline sadece manuel olarak \u00e7al\u0131\u015ft\u0131r\u0131lacak\n\npool:\n  vmImage: 'ubuntu-latest' # Veya Windows agent\n\nvariables:\n  # Semantic Release'in Git i\u015flemlerini yapabilmesi i\u00e7in PAT\n  # Bu de\u011fi\u015fkeni Azure DevOps'ta gizli (secret) olarak tan\u0131mlay\u0131n\n  PAT_FOR_SEMANTIC_RELEASE: $(System.AccessToken) # E\u011fer Build Service hesab\u0131na yeterli yetki verildi ise\n  # Veya kendi olu\u015fturdu\u011funuz PAT i\u00e7in:\n  # PAT_FOR_SEMANTIC_RELEASE: $(MySemanticReleasePAT) \n\nstages:\n- stage: Release\n  displayName: 'Create Release'\n  jobs:\n  - job: SemanticReleaseJob\n    displayName: 'Run Semantic Release'\n    steps:\n    - checkout: self\n      persistCredentials: true # Bu, Git push\/tag i\u015flemlerinin \u00e7al\u0131\u015fmas\u0131 i\u00e7in \u00f6nemli\n\n    - task: NodeTool@0\n      inputs:\n        versionSpec: '16.x'\n      displayName: 'Install Node.js'\n\n    - script: |\n        npm install\n      displayName: 'Install Project Dependencies'\n\n    - script: |\n        npm install -g semantic-release @semantic-release\/git @semantic-release\/changelog @semantic-release\/npm\n      displayName: 'Install Semantic Release CLI and Plugins'\n\n    - script: |\n        git config user.name \"$(GIT_AUTHOR_NAME)\"\n        git config user.email \"$(GIT_AUTHOR_EMAIL)\"\n        npx semantic-release\n      displayName: 'Execute Semantic Release'\n      env:\n        # Semantic Release'in Git i\u015flemlerini yapabilmesi i\u00e7in token\n        # Gerekirse, Git URL'ini de token ile birlikte yap\u0131land\u0131rabilirsiniz\n        # GITHUB_TOKEN: $(PAT_FOR_SEMANTIC_RELEASE) # E\u011fer GitHub i\u00e7inse\n        # AZURE_DEVOPS_TOKEN: $(PAT_FOR_SEMANTIC_RELEASE) # Azure DevOps i\u00e7in\n        # Npm paketini yay\u0131nlamak i\u00e7in Npm token\n        # NPM_TOKEN: $(NPM_AUTH_TOKEN) \n        # Di\u011fer ortam de\u011fi\u015fkenleri...<\/pre>\n<p><\/code><br \/>\n<strong>Not:<\/strong> <code>checkout: self<\/code> ad\u0131m\u0131nda <code>persistCredentials: true<\/code> kullanmak, <code>semantic-release<\/code>'in Git i\u015flemlerini yapabilmesi i\u00e7in \u00f6nemlidir. <code>PAT_FOR_SEMANTIC_RELEASE<\/code> de\u011fi\u015fkeninin <code>System.AccessToken<\/code> olarak ayarlanmas\u0131, e\u011fer Build Service hesab\u0131na \"Contribute\" ve \"Create tag\" izinleri verilmi\u015fse \u00e7al\u0131\u015fabilir. Aksi takdirde, \u00f6zel bir PAT kullanmak daha g\u00fcvenli ve yayg\u0131n bir yakla\u015f\u0131md\u0131r.<\/p>\n<h4>S\u00fcr\u00fcm Etiketlerinin Olu\u015fturulmas\u0131<\/h4>\n<p>Semantic Release, ba\u015far\u0131l\u0131 bir s\u00fcr\u00fcm y\u00fckseltme sonras\u0131nda otomatik olarak Git deposuna yeni bir s\u00fcr\u00fcm etiketi (\u00f6rn. <code>v1.2.3<\/code>) ekler. Bu etiketler, belirli bir s\u00fcr\u00fcm\u00fcn kod taban\u0131n\u0131 kolayca bulmay\u0131 ve referans vermeyi sa\u011flar.<\/p>\n<h3>En \u0130yi Uygulamalar ve Dikkat Edilmesi Gerekenler<\/h3>\n<p>Manuel tetiklemeli Semantic Release kullan\u0131m\u0131, esneklik sa\u011flarken, baz\u0131 en iyi uygulamalar\u0131n takip edilmesini gerektirir.<\/p>\n<h4>Commit Mesaj\u0131 Standartlar\u0131<\/h4>\n<p>Semantic Release'in do\u011fru \u00e7al\u0131\u015fmas\u0131 i\u00e7in commit mesajlar\u0131n\u0131n belirli bir standarda (\u00f6rn. Conventional Commits) uymas\u0131 zorunludur.<br \/>\n*   <code>feat:<\/code> yeni \u00f6zellikler i\u00e7in<br \/>\n*   <code>fix:<\/code> hata d\u00fczeltmeleri i\u00e7in<br \/>\n*   <code>chore:<\/code> yap\u0131land\u0131rma veya bak\u0131m g\u00f6revleri i\u00e7in<br \/>\n*   <code>BREAKING CHANGE:<\/code> geriye d\u00f6n\u00fck uyumsuz de\u011fi\u015fiklikler i\u00e7in mesaj g\u00f6vdesinde belirtilmelidir.<\/p>\n<h4>G\u00fcvenlik ve \u0130zinler<\/h4>\n<p>Semantic Release'in Git deposuna yazma yetkisi oldu\u011fu i\u00e7in, kullan\u0131lan PAT'in izinlerini dikkatlice y\u00f6netmek \u00f6nemlidir. Sadece gerekli minimum izinleri (Code: Read & Write) verin ve PAT'i gizli tutun.<\/p>\n<h4>Geri Alma Stratejileri<\/h4>\n<p>Otomatik s\u00fcr\u00fcmlemede bir hata olmas\u0131 durumunda (nadiren de olsa), geri alma stratejileri \u00f6nemlidir. Yanl\u0131\u015f bir s\u00fcr\u00fcm yay\u0131nland\u0131\u011f\u0131nda, Git etiketini silip \u00f6nceki bir commite geri d\u00f6nmek ve ard\u0131ndan d\u00fczeltilmi\u015f bir commit ile yeni bir s\u00fcr\u00fcm tetiklemek gerekebilir.<\/p>\n<h4>Test ve Do\u011frulama<\/h4>\n<p>Semantic Release pipeline'\u0131n\u0131 ilk kez kurarken veya \u00f6nemli de\u011fi\u015fiklikler yaparken, bir test projesi \u00fczerinde veya bir <code>dry-run<\/code> modu ile dikkatlice test etmek \u00f6nemlidir. <code>semantic-release --dry-run<\/code> komutu, ger\u00e7ek bir yay\u0131n yapmadan ne olaca\u011f\u0131n\u0131 g\u00f6rmenizi sa\u011flar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Azure DevOps ve Semantic Release'in birle\u015fimi, yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde s\u00fcr\u00fcm y\u00f6netimini devrim niteli\u011finde basitle\u015ftirir ve g\u00fc\u00e7lendirir. Manuel tetiklemeli bir yakla\u015f\u0131mla bile, Semantic Release'in sundu\u011fu otomasyon, insan hatas\u0131n\u0131 en aza indirir, tutarl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r ve geli\u015ftiricilerin daha verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Do\u011fru yap\u0131land\u0131rma ve en iyi uygulamalar\u0131n takibiyle, projelerinizde hem esnek hem de g\u00fcvenilir bir s\u00fcr\u00fcmleme s\u00fcreci in\u015fa edebilirsiniz. Bu entegrasyon, modern CI\/CD pratiklerinin vazge\u00e7ilmez bir par\u00e7as\u0131 olarak, yaz\u0131l\u0131m kalitesini ve yay\u0131n s\u00fcre\u00e7lerinin \u00f6ng\u00f6r\u00fclebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<p><strong>S1: Semantic Release neden manuel s\u00fcr\u00fcmlemeyi tamamen ortadan kald\u0131rm\u0131yor?<\/strong><br \/>\nC1: Semantic Release, commit ge\u00e7mi\u015fine dayal\u0131 otomatik s\u00fcr\u00fcmleme i\u00e7in tasarlanm\u0131\u015ft\u0131r. Ancak baz\u0131 \u00f6zel durumlarda (acil yamalar, belirli bir tarihte yay\u0131nlama vb.) manuel kontrol ihtiyac\u0131 do\u011fabilir. Bu makale, bu manuel tetikleme ihtiyac\u0131n\u0131 Semantic Release'in otomasyonuyla birle\u015ftirmeyi ama\u00e7lamaktad\u0131r.<\/p>\n<p><strong>S2: <code>System.AccessToken<\/code> yerine neden \u00f6zel bir PAT kullanmal\u0131y\u0131m?<\/strong><br \/>\nC2: <code>System.AccessToken<\/code> genellikle Azure DevOps Build Service hesab\u0131na atanan varsay\u0131lan izinlere sahiptir ve \u00e7o\u011fu zaman Git deposuna yazma (commit, tag olu\u015fturma) yetkisi i\u00e7ermez. Semantic Release'in Git i\u015flemlerini yapabilmesi i\u00e7in \"Code (Read & write)\" izinlerine sahip bir PAT gereklidir. Bu PAT'i bir gizli de\u011fi\u015fken olarak tan\u0131mlamak daha g\u00fcvenlidir.<\/p>\n<p><strong>S3: Semantic Release'i Azure DevOps'ta her branch i\u00e7in \u00e7al\u0131\u015ft\u0131rabilir miyim?<\/strong><br \/>\nC3: Semantic Release genellikle ana branch'ler (\u00f6rn. <code>main<\/code> veya <code>master<\/code>) i\u00e7in yap\u0131land\u0131r\u0131l\u0131r. Ancak, yap\u0131land\u0131rmas\u0131n\u0131 \u00f6zelle\u015ftirerek belirli <code>release<\/code> branch'leri gibi di\u011fer branch'lerde de \u00e7al\u0131\u015ft\u0131rabilirsiniz. <code>branches<\/code> yap\u0131land\u0131rmas\u0131 ile hangi branch'lerin s\u00fcr\u00fcm yay\u0131nlayabilece\u011fini belirleyebilirsiniz.<\/p>\n<p><strong>S4: <code>semantic-release<\/code> komutunu \u00e7al\u0131\u015ft\u0131rmadan \u00f6nce <code>npm install<\/code> yapmam gerekiyor mu?<\/strong><br \/>\nC4: Evet, <code>semantic-release<\/code> ve onun eklentileri projenizin <code>devDependencies<\/code> k\u0131sm\u0131nda tan\u0131ml\u0131ysa, pipeline'da bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklemek i\u00e7in <code>npm install<\/code> (veya <code>npm ci<\/code>) komutunu \u00e7al\u0131\u015ft\u0131rman\u0131z gerekir. Alternatif olarak, <code>npx semantic-release<\/code> komutu, yerel olarak kurulu olmayan paketleri ge\u00e7ici olarak indirip \u00e7al\u0131\u015ft\u0131rabilir, ancak ba\u011f\u0131ml\u0131l\u0131klar\u0131 \u00f6nceden y\u00fcklemek genellikle daha sa\u011flam bir yakla\u015f\u0131md\u0131r.<\/p>\n","protected":false},"excerpt":{"rendered":"Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz\nYaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde s\u00fcr\u00fcm y\u00f6netimi, pr&#8230;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1405],"tags":[],"class_list":{"0":"post-37218","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-azure","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz\" \/>\n<meta property=\"og:description\" content=\"Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz Yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde s\u00fcr\u00fcm y\u00f6netimi, pr...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-28T22:01:10+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz\",\"datePublished\":\"2025-12-28T22:01:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/\"},\"wordCount\":2604,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Azure\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/\",\"name\":\"Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-28T22:01:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/","og_locale":"tr_TR","og_type":"article","og_title":"Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz","og_description":"Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz Yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde s\u00fcr\u00fcm y\u00f6netimi, pr...","og_url":"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-28T22:01:10+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"15 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz","datePublished":"2025-12-28T22:01:10+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/"},"wordCount":2604,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Azure"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/","url":"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/","name":"Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-28T22:01:10+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/azure-devops-ile-semantic-release-kullanarak-manuel-surum-yukseltmeleri-detayli-bir-kilavuz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Azure DevOps ile Semantic Release Kullanarak Manuel S\u00fcr\u00fcm Y\u00fckseltmeleri: Detayl\u0131 Bir K\u0131lavuz"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37218","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=37218"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37218\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37218"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}