{"id":34439,"date":"2025-11-16T17:31:16","date_gmt":"2025-11-16T14:31:16","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/"},"modified":"2025-11-16T17:31:16","modified_gmt":"2025-11-16T14:31:16","slug":"github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/","title":{"rendered":"Github Actions Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131na Dinamik Parametre Ge\u00e7i\u015fi"},"content":{"rendered":"<p><body><\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde otomasyon, h\u0131z\u0131 ve g\u00fcvenilirli\u011fi art\u0131rman\u0131n anahtar\u0131d\u0131r. GitHub Actions, bu otomasyonu do\u011frudan geli\u015ftirme ekosisteminize entegre ederek g\u00fc\u00e7l\u00fc bir CI\/CD platformu sunar. Ancak, projeler b\u00fcy\u00fcd\u00fck\u00e7e ve karma\u015f\u0131kla\u015ft\u0131k\u00e7a, farkl\u0131 ortamlar, hizmetler veya yap\u0131land\u0131rmalar i\u00e7in esneklik ihtiyac\u0131 ortaya \u00e7\u0131kar. Bu makale, GitHub Actions&#8217;\u0131n yeniden kullan\u0131labilir i\u015f ak\u0131\u015flar\u0131na dinamik parametreler nas\u0131l ge\u00e7irebilece\u011finizi, b\u00f6ylece s\u00fcre\u00e7lerinizi daha esnek ve g\u00fc\u00e7l\u00fc hale getirebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.<\/p>\n<p>Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda s\u00fcrekli entegrasyon (CI) ve s\u00fcrekli da\u011f\u0131t\u0131m (CD) pratikleri, ekiplerin daha h\u0131zl\u0131 ve hatas\u0131z bir \u015fekilde \u00fcr\u00fcnlerini pazara sunmalar\u0131n\u0131 sa\u011flayan temel ta\u015flard\u0131r. GitHub Actions gibi g\u00fc\u00e7l\u00fc otomasyon ara\u00e7lar\u0131, bu s\u00fcre\u00e7leri otomatize ederek geli\u015ftiricilerin daha verimli olmalar\u0131na olanak tan\u0131r. Ancak, her projenin kendine \u00f6zg\u00fc gereksinimleri ve karma\u015f\u0131kl\u0131klar\u0131 vard\u0131r. Bir yandan geli\u015ftirme (dev) ortam\u0131na h\u0131zl\u0131ca bir prototip da\u011f\u0131tmak isterken, di\u011fer yandan test (staging) ve \u00fcretim (production) ortamlar\u0131na daha kontroll\u00fc ve spesifik konfig\u00fcrasyonlarla da\u011f\u0131t\u0131m yapmak isteyebilirsiniz.<\/p>\n<p>\u0130\u015fte tam da bu noktada statik, tek tip i\u015f ak\u0131\u015flar\u0131 yetersiz kalmaya ba\u015flar. Her ortam, her mikroservis veya her da\u011f\u0131t\u0131m senaryosu i\u00e7in ayr\u0131 ayr\u0131 i\u015f ak\u0131\u015flar\u0131 olu\u015fturmak, hem zaman kayb\u0131na yol a\u00e7ar hem de bak\u0131m maliyetini art\u0131r\u0131r. Diyelim ki, farkl\u0131 mikroservisleri farkl\u0131 AWS b\u00f6lgelerine da\u011f\u0131tman\u0131z gerekiyor veya bir uygulaman\u0131n belirli bir s\u00fcr\u00fcm\u00fcn\u00fc birden fazla test ortam\u0131nda \u00e7al\u0131\u015ft\u0131rman\u0131z gerekiyor. Her senaryo i\u00e7in ayr\u0131 bir YAML dosyas\u0131 yazmak, k\u0131sa s\u00fcrede bir &#8220;YAML orman\u0131&#8221; olu\u015fturman\u0131za neden olabilir. Bu durum, yaln\u0131zca kod tekrar\u0131na yol a\u00e7makla kalmaz, ayn\u0131 zamanda hatalar\u0131n yay\u0131lma riskini de art\u0131r\u0131r ve i\u015f ak\u0131\u015flar\u0131n\u0131n y\u00f6netimini zorla\u015ft\u0131r\u0131r.<\/p>\n<p>Bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in, i\u015f ak\u0131\u015flar\u0131m\u0131z\u0131n d\u0131\u015far\u0131dan gelen girdilere g\u00f6re davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirebilmesi gerekir. Yani, i\u015f ak\u0131\u015flar\u0131m\u0131z\u0131n dinamik olmas\u0131, \u00e7al\u0131\u015fma an\u0131nda parametreler alabilmesi ve bu parametreler do\u011frultusunda farkl\u0131 yollar izleyebilmesi hayati \u00f6nem ta\u015f\u0131r. Dinamik parametreler, ayn\u0131 i\u015f ak\u0131\u015f\u0131 tan\u0131m\u0131n\u0131 koruyarak, yaln\u0131zca girdi de\u011ferlerini de\u011fi\u015ftirerek farkl\u0131 i\u015flemler ger\u00e7ekle\u015ftirmemizi sa\u011flar. \u00d6rne\u011fin, tek bir &#8220;deploy&#8221; i\u015f ak\u0131\u015f\u0131 ile hem <code>dev<\/code> hem de <code>prod<\/code> ortamlar\u0131na da\u011f\u0131t\u0131m yapabilir, hatta hangi mikroservisin da\u011f\u0131t\u0131laca\u011f\u0131n\u0131 belirtebiliriz. Bu yakla\u015f\u0131m, CI\/CD s\u00fcre\u00e7lerimizi sadece otomatize etmekle kalmaz, ayn\u0131 zamanda onlar\u0131 inan\u0131lmaz derecede esnek, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir k\u0131lar. Dinamik parametrelerin g\u00fcc\u00fc, GitHub Actions&#8217;\u0131 sadece bir otomasyon arac\u0131 olmaktan \u00e7\u0131kar\u0131p, karma\u015f\u0131k ve modern yaz\u0131l\u0131m projelerinin belkemi\u011fi haline getirir.<\/p>\n<h2>Temel Kavramlar: GitHub Actions ve Tekrar Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131 Nelerdir?<\/h2>\n<p>GitHub Actions, GitHub deposunda bar\u0131nd\u0131r\u0131lan yaz\u0131l\u0131m geli\u015ftirme ya\u015fam d\u00f6ng\u00fcn\u00fczdeki g\u00f6revleri otomatikle\u015ftiren bir platformdur. Kod de\u011fi\u015fikliklerinde otomatik testler \u00e7al\u0131\u015ft\u0131rmak, paketler olu\u015fturmak, da\u011f\u0131t\u0131mlar yapmak veya Slack bildirimleri g\u00f6ndermek gibi \u00e7e\u015fitli g\u00f6revleri otomatikle\u015ftirebilirsiniz. Her otomasyon ad\u0131m\u0131, <code>job<\/code> ad\u0131 verilen bir veya daha fazla ad\u0131mdan (<code>step<\/code>) olu\u015fan bir <code>workflow<\/code> (i\u015f ak\u0131\u015f\u0131) i\u00e7inde tan\u0131mlan\u0131r. Bu i\u015f ak\u0131\u015flar\u0131, deponuzun <code>.github\/workflows<\/code> dizininde YAML dosyalar\u0131 olarak bulunur.<\/p>\n<p>GitHub Actions&#8217;\u0131n g\u00fcc\u00fcn\u00fcn \u00f6nemli bir k\u0131sm\u0131, i\u015f ak\u0131\u015flar\u0131n\u0131n tekrar kullan\u0131labilirli\u011fidir. B\u00fcy\u00fck projelerde veya birden fazla mikroservisi y\u00f6neten ekiplerde, belirli bir g\u00f6revi (\u00f6rne\u011fin, bir Docker imaj\u0131 olu\u015fturma, belirli bir bulut sa\u011flay\u0131c\u0131s\u0131na da\u011f\u0131t\u0131m yapma) bir\u00e7ok farkl\u0131 i\u015f ak\u0131\u015f\u0131nda tekrar tekrar kullanman\u0131z gerekebilir. Her seferinde ayn\u0131 kodu yazmak yerine, bu mant\u0131\u011f\u0131 tek bir <strong>yeniden kullan\u0131labilir i\u015f ak\u0131\u015f\u0131<\/strong> i\u00e7inde kaps\u00fclleyebilirsiniz. Bu, DRY (Don&#8217;t Repeat Yourself) prensibini uygulayarak kod tekrar\u0131n\u0131 \u00f6nler, bak\u0131m maliyetini d\u00fc\u015f\u00fcr\u00fcr ve tutarl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r.<\/p>\n<p>Yeniden kullan\u0131labilir i\u015f ak\u0131\u015flar\u0131, <code>workflow_call<\/code> tetikleyicisi kullan\u0131larak tan\u0131mlan\u0131r. Bu, ba\u015fka bir i\u015f ak\u0131\u015f\u0131n\u0131n (\u00e7a\u011f\u0131ran i\u015f ak\u0131\u015f\u0131) bu i\u015f ak\u0131\u015f\u0131n\u0131 bir fonksiyon \u00e7a\u011fr\u0131s\u0131 gibi \u00e7a\u011f\u0131rabilece\u011fi anlam\u0131na gelir. \u00c7a\u011f\u0131ran i\u015f ak\u0131\u015f\u0131, <code>uses<\/code> anahtar kelimesini kullanarak yeniden kullan\u0131labilir i\u015f ak\u0131\u015f\u0131n\u0131 belirtir ve ona <code>inputs<\/code> (girdiler) ve <code>secrets<\/code> (s\u0131rlar) sa\u011flayabilir. Bu sayede, ayn\u0131 da\u011f\u0131t\u0131m mant\u0131\u011f\u0131n\u0131 farkl\u0131 parametrelerle bir\u00e7ok kez kullanabiliriz.<\/p>\n<pre><code class=\"language-yaml\">\n# .github\/workflows\/reusable-deploy.yml (Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015f\u0131)\nname: Tekrar Kullan\u0131labilir Da\u011f\u0131t\u0131m\n\non:\n  workflow_call:\n    inputs:\n      environment:\n        required: true\n        type: string\n        description: 'Da\u011f\u0131t\u0131m ortam\u0131 (dev, staging, prod)'\n      service_name:\n        required: true\n        type: string\n        description: 'Da\u011f\u0131t\u0131lacak servis ad\u0131'\n    secrets:\n      AWS_ACCESS_KEY_ID:\n        required: true\n      AWS_SECRET_ACCESS_KEY:\n        required: true\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Git Repository Check-out\n        uses: actions\/checkout@v4\n\n      - name: AWS Kimlik Bilgilerini Yap\u0131land\u0131r\n        uses: aws-actions\/configure-aws-credentials@v4\n        with:\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          aws-region: us-east-1 # \u00d6rnek b\u00f6lge\n\n      - name: Servis ve Ortama Da\u011f\u0131t\n        run: |\n          echo \"Servis ${{ inputs.service_name }} ${{ inputs.environment }} ortam\u0131na da\u011f\u0131t\u0131l\u0131yor...\"\n          # Ger\u00e7ek da\u011f\u0131t\u0131m komutlar\u0131 buraya gelecek\n          # \u00d6rne\u011fin: aws s3 sync .\/build s3:\/\/${{ inputs.service_name }}-${{ inputs.environment }}-bucket\/\n          echo \"Da\u011f\u0131t\u0131m tamamland\u0131!\"\n<\/pre>\n<p><\/code><\/p>\n<h3>Tekrar Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131na Parametre Ge\u00e7i\u015fi Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>Yukar\u0131daki \u00f6rnekte g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, yeniden kullan\u0131labilir bir i\u015f ak\u0131\u015f\u0131, <code>workflow_call<\/code> alt\u0131nda <code>inputs<\/code> ve <code>secrets<\/code> tan\u0131mlar\u0131n\u0131 bar\u0131nd\u0131r\u0131r. Bu tan\u0131mlar, \u00e7a\u011f\u0131ran i\u015f ak\u0131\u015f\u0131n\u0131n bu i\u015f ak\u0131\u015f\u0131na hangi verileri sa\u011flamas\u0131 gerekti\u011fini belirtir. \u0130\u015fte bu parametre ge\u00e7i\u015finin ana mekanizmalar\u0131:<\/p>\n<ul>\n<li><strong><code>inputs<\/code><\/strong>: Bu anahtar, i\u015f ak\u0131\u015f\u0131n\u0131n d\u0131\u015far\u0131dan alabilece\u011fi yap\u0131land\u0131r\u0131labilir de\u011ferleri tan\u0131mlar. Her girdi i\u00e7in bir <code>id<\/code> (giri\u015fin ad\u0131), <code>description<\/code> (a\u00e7\u0131klamas\u0131), <code>required<\/code> (zorunlu olup olmad\u0131\u011f\u0131), <code>type<\/code> (veri tipi, \u00f6rne\u011fin <code>string<\/code>, <code>boolean<\/code>, <code>number<\/code>) ve iste\u011fe ba\u011fl\u0131 olarak bir <code>default<\/code> de\u011fer belirleyebilirsiniz. Girdiler, i\u015f ak\u0131\u015f\u0131 i\u00e7indeki ad\u0131mlarda <code>${{ inputs.your_input_id }}<\/code> format\u0131yla eri\u015filebilir.<\/li>\n<li><strong><code>secrets<\/code><\/strong>: Hassas bilgiler (API anahtarlar\u0131, veritaban\u0131 \u015fifreleri vb.) i\u00e7in kullan\u0131l\u0131r. <code>inputs<\/code> gibi tan\u0131mlan\u0131r ancak de\u011ferleri GitHub Secrets'tan al\u0131n\u0131r ve i\u015f ak\u0131\u015f\u0131 g\u00fcnl\u00fcklerinde maskelenir. \u0130\u015f ak\u0131\u015f\u0131 i\u00e7inde <code>${{ secrets.YOUR_SECRET_ID }}<\/code> format\u0131yla eri\u015filir.<\/li>\n<\/ul>\n<p>Bir ba\u015fka i\u015f ak\u0131\u015f\u0131, bu yeniden kullan\u0131labilir i\u015f ak\u0131\u015f\u0131n\u0131 \u00e7a\u011f\u0131rd\u0131\u011f\u0131nda, <code>jobs<\/code> b\u00f6l\u00fcm\u00fcnde <code>uses<\/code> anahtar kelimesini kullan\u0131r. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-yaml\">\n# .github\/workflows\/main.yml (\u00c7a\u011f\u0131ran \u0130\u015f Ak\u0131\u015f\u0131)\nname: Ana Uygulama Da\u011f\u0131t\u0131m Ak\u0131\u015f\u0131\n\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n    inputs:\n      target_environment:\n        description: 'Da\u011f\u0131t\u0131m Hedefi'\n        required: true\n        type: string\n        default: 'dev'\n        options:\n          - dev\n          - staging\n          - prod\n      deploy_service:\n        description: 'Hangi Servis Da\u011f\u0131t\u0131ls\u0131n?'\n        required: true\n        type: string\n        default: 'frontend'\n        options:\n          - frontend\n          - backend\n          - auth\n\njobs:\n  call_deploy_workflow:\n    uses: .\/.github\/workflows\/reusable-deploy.yml@main # Veya bir repo\/path@ref\n    with:\n      environment: ${{ github.event.inputs.target_environment }}\n      service_name: ${{ github.event.inputs.deploy_service }}\n    secrets:\n      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_PROD_ACCESS_KEY_ID }}\n      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_PROD_SECRET_ACCESS_KEY }}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00e7a\u011fr\u0131 mekanizmas\u0131 sayesinde, <code>reusable-deploy.yml<\/code> i\u015f ak\u0131\u015f\u0131 ayn\u0131 mant\u0131kla, \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 her seferde farkl\u0131 <code>environment<\/code> ve <code>service_name<\/code> girdileriyle \u00e7al\u0131\u015fabilir. Bu, i\u015f ak\u0131\u015f\u0131 otomasyonunuzda esneklik ve mod\u00fclerlik sa\u011flar. <code>workflow_dispatch<\/code> tetikleyicisi ise, i\u015f ak\u0131\u015f\u0131n\u0131 GitHub UI \u00fczerinden manuel olarak tetiklerken bu dinamik girdileri do\u011frudan sa\u011flaman\u0131za olanak tan\u0131r, bu da ad-hoc da\u011f\u0131t\u0131mlar veya testler i\u00e7in idealdir.<\/p>\n<h2>Dinamik Parametreler Ne Anlama Geliyor ve Nas\u0131l Tan\u0131mlan\u0131r?<\/h2>\n<p>GitHub Actions ba\u011flam\u0131nda \"dinamik parametreler\", i\u015f ak\u0131\u015f\u0131n\u0131n \u00e7al\u0131\u015fma zaman\u0131nda de\u011ferleri de\u011fi\u015febilen ve bu de\u011ferlere g\u00f6re farkl\u0131 davran\u0131\u015flar sergileyebilen girdiler anlam\u0131na gelir. Bu dinamizm, genellikle bir \u00e7a\u011fr\u0131 yapan i\u015f ak\u0131\u015f\u0131ndan (caller workflow) veya manuel tetikleyici (<code>workflow_dispatch<\/code>) arac\u0131l\u0131\u011f\u0131yla sa\u011flanan <code>inputs<\/code> kullan\u0131larak elde edilir. Bu girdiler, basit string'lerden karma\u015f\u0131k JSON yap\u0131lar\u0131na kadar her \u015feyi temsil edebilir ve i\u015f ak\u0131\u015f\u0131 i\u00e7inde ko\u015fullu mant\u0131k, d\u00f6ng\u00fcler veya de\u011fi\u015fken tan\u0131mlar\u0131 i\u00e7in kullan\u0131labilir.<\/p>\n<p>Dinamik parametrelerin g\u00fcc\u00fc, \u00f6zellikle mikroservis mimarilerinde veya birden fazla ortam\u0131n (geli\u015ftirme, test, \u00fcretim) oldu\u011fu projelerde ortaya \u00e7\u0131kar. Tek bir i\u015f ak\u0131\u015f\u0131 \u015fablonu olu\u015fturarak, bu \u015fablonu farkl\u0131 parametre setleriyle tekrar tekrar kullanabilirsiniz. \u00d6rne\u011fin, \"Da\u011f\u0131t\u0131m Yap\" ad\u0131nda bir i\u015f ak\u0131\u015f\u0131n\u0131z olabilir. Bu i\u015f ak\u0131\u015f\u0131na bir <code>environment<\/code> (ortam: dev, staging, prod) ve bir <code>service_name<\/code> (servis ad\u0131: kullan\u0131c\u0131lar, \u00fcr\u00fcnler, \u00f6deme) parametreleri ge\u00e7irebilirsiniz. \u0130\u015f ak\u0131\u015f\u0131, bu parametreleri alarak ilgili servisi belirtilen ortama da\u011f\u0131t\u0131r. Bu yakla\u015f\u0131m, sadece kodu DRY (Don't Repeat Yourself) tutmakla kalmaz, ayn\u0131 zamanda CI\/CD s\u00fcre\u00e7lerinizi inan\u0131lmaz derecede esnek ve bak\u0131m\u0131 kolay hale getirir.<\/p>\n<p>Dinamik parametreleri tan\u0131mlamak ve kullanmak i\u00e7in yeniden kullan\u0131labilir i\u015f ak\u0131\u015f\u0131n\u0131zdaki <code>on: workflow_call: inputs:<\/code> b\u00f6l\u00fcm\u00fcn\u00fc ve \u00e7a\u011f\u0131ran i\u015f ak\u0131\u015f\u0131n\u0131zdaki <code>with:<\/code> b\u00f6l\u00fcm\u00fcn\u00fc etkin bir \u015fekilde kullanman\u0131z gerekir. \u0130\u015fte bir \u00f6rnek:<\/p>\n<pre><code class=\"language-yaml\">\n# .github\/workflows\/dynamic-build-and-deploy.yml (Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015f\u0131)\nname: Dinamik Derleme ve Da\u011f\u0131t\u0131m\n\non:\n  workflow_call:\n    inputs:\n      target_env:\n        required: true\n        type: string\n        description: 'Da\u011f\u0131t\u0131m\u0131n yap\u0131laca\u011f\u0131 hedef ortam (dev, prod)'\n      build_arg_tag:\n        required: false\n        type: string\n        description: 'Docker imaj\u0131 i\u00e7in kullan\u0131lacak etiket (varsay\u0131lan: latest)'\n        default: 'latest'\n      run_tests:\n        required: false\n        type: boolean\n        description: 'Testlerin \u00e7al\u0131\u015ft\u0131r\u0131l\u0131p \u00e7al\u0131\u015ft\u0131r\u0131lmayaca\u011f\u0131'\n        default: true\n    secrets:\n      CLOUD_API_TOKEN:\n        required: true\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Kodu \u00c7ek\n        uses: actions\/checkout@v4\n      \n      - name: Docker \u0130maj\u0131 Olu\u015ftur\n        run: |\n          docker build -t my-app:${{ inputs.build_arg_tag }} .\n          echo \"Docker imaj\u0131 olu\u015fturuldu: my-app:${{ inputs.build_arg_tag }}\"\n\n  test:\n    runs-on: ubuntu-latest\n    needs: build\n    if: ${{ inputs.run_tests == true }} # Dinamik ko\u015fullu \u00e7al\u0131\u015ft\u0131rma\n    steps:\n      - name: Kodu \u00c7ek\n        uses: actions\/checkout@v4\n      \n      - name: Testleri \u00c7al\u0131\u015ft\u0131r\n        run: |\n          echo \"Testler \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor...\"\n          # npm test veya pytest gibi test komutlar\u0131\n          echo \"Testler tamamland\u0131.\"\n\n  deploy:\n    runs-on: ubuntu-latest\n    needs: test\n    steps:\n      - name: Kimlik Do\u011frulama\n        run: |\n          echo \"Cloud kimlik do\u011frulamas\u0131 ${{ secrets.CLOUD_API_TOKEN }} ile yap\u0131l\u0131yor...\"\n          # AWS\/Azure\/GCP CLI login komutlar\u0131\n      \n      - name: ${{ inputs.target_env }} Ortam\u0131na Da\u011f\u0131t\u0131m\n        run: |\n          echo \"my-app:${{ inputs.build_arg_tag }} imaj\u0131 ${{ inputs.target_env }} ortam\u0131na da\u011f\u0131t\u0131l\u0131yor.\"\n          # Ger\u00e7ek da\u011f\u0131t\u0131m komutlar\u0131 (\u00f6rn: Kubernetes deploy, Serverless deploy)\n          echo \"Da\u011f\u0131t\u0131m ba\u015far\u0131l\u0131!\"\n<\/pre>\n<p><\/code><\/p>\n<p>Bu i\u015f ak\u0131\u015f\u0131, <code>target_env<\/code>, <code>build_arg_tag<\/code> ve <code>run_tests<\/code> gibi parametreler alarak dinamik bir davran\u0131\u015f sergiler. \u00d6rne\u011fin, <code>run_tests<\/code> girdisi <code>true<\/code> oldu\u011funda test i\u015fi \u00e7al\u0131\u015f\u0131r, <code>false<\/code> oldu\u011funda atlan\u0131r. Bu, farkl\u0131 senaryolar i\u00e7in esneklik sa\u011flar.<\/p>\n<h3>Ger\u00e7ek D\u00fcnya Senaryosu: Mikroservis Da\u011f\u0131t\u0131m\u0131 \u0130\u00e7in Dinamik Parametre Kullan\u0131m\u0131<\/h3>\n<p>B\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar genellikle birden fazla mikroservisten olu\u015fur. Her mikroservisin kendi da\u011f\u0131t\u0131m ak\u0131\u015f\u0131 olabilir, ancak bu ak\u0131\u015flar\u0131n \u00e7o\u011fu benzer ad\u0131mlar\u0131 (Docker imaj\u0131 olu\u015fturma, test etme, buluta da\u011f\u0131tma) i\u00e7erir. Her mikroservis i\u00e7in ayr\u0131 bir i\u015f ak\u0131\u015f\u0131 yerine, tek bir genel \"Mikroservis Da\u011f\u0131t\u0131m\u0131\" i\u015f ak\u0131\u015f\u0131 olu\u015fturup, gerekli parametreleri dinamik olarak ge\u00e7irebiliriz. Bu, sadece DRY prensibini uygulamakla kalmaz, ayn\u0131 zamanda yeni bir mikroservis eklendi\u011finde veya da\u011f\u0131t\u0131m s\u00fcre\u00e7leri g\u00fcncellendi\u011finde y\u00f6netim y\u00fck\u00fcn\u00fc b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<p><strong>Vaka Analizi: \u00c7oklu Mikroservis Da\u011f\u0131t\u0131m\u0131<\/strong><\/p>\n<p>Bir e-ticaret platformunuz oldu\u011funu varsayal\u0131m. Bu platformda <code>\u00fcr\u00fcnler<\/code>, <code>kullan\u0131c\u0131lar<\/code> ve <code>sipari\u015fler<\/code> ad\u0131nda \u00fc\u00e7 ana mikroservis bulunuyor. Her servisin kendi deposu ve da\u011f\u0131t\u0131m stratejisi var, ancak hepsinin AWS ECS'ye da\u011f\u0131t\u0131lmas\u0131 gerekiyor. Ayr\u0131ca, geli\u015ftirme ve \u00fcretim ortamlar\u0131 aras\u0131nda da farkl\u0131l\u0131klar var (farkl\u0131 ECS k\u00fcmeleri, farkl\u0131 g\u00f6rev tan\u0131mlar\u0131 vb.).<\/p>\n<p>\u0130\u015fte bu senaryo i\u00e7in dinamik parametreleri kullanarak nas\u0131l tek bir yeniden kullan\u0131labilir da\u011f\u0131t\u0131m i\u015f ak\u0131\u015f\u0131 olu\u015fturabilece\u011fimize dair bir \u00f6rnek:<\/p>\n<pre><code class=\"language-yaml\">\n# .github\/workflows\/reusable-microservice-deploy.yml (Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015f\u0131)\nname: Mikroservis Da\u011f\u0131t\u0131m \u015eablonu\n\non:\n  workflow_call:\n    inputs:\n      service_name:\n        required: true\n        type: string\n        description: 'Da\u011f\u0131t\u0131lacak mikroservisin ad\u0131'\n      environment:\n        required: true\n        type: string\n        description: 'Hedef da\u011f\u0131t\u0131m ortam\u0131 (dev, prod)'\n      docker_image_tag:\n        required: true\n        type: string\n        description: 'Da\u011f\u0131t\u0131lacak Docker imaj\u0131n\u0131n etiketi'\n      ecs_cluster_name:\n        required: true\n        type: string\n        description: 'Hedef AWS ECS k\u00fcmesinin ad\u0131'\n      ecs_service_name:\n        required: true\n        type: string\n        description: 'Hedef AWS ECS servisinin ad\u0131'\n      ecs_task_definition_path:\n        required: true\n        type: string\n        description: 'ECS g\u00f6rev tan\u0131m\u0131 dosyas\u0131n\u0131n yolu'\n    secrets:\n      AWS_ACCESS_KEY_ID:\n        required: true\n      AWS_SECRET_ACCESS_KEY:\n        required: true\n      AWS_REGION:\n        required: true\n\njobs:\n  deploy_to_ecs:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Git Repository \u00c7ek\n        uses: actions\/checkout@v4\n\n      - name: AWS Kimlik Bilgilerini Yap\u0131land\u0131r\n        uses: aws-actions\/configure-aws-credentials@v4\n        with:\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          aws-region: ${{ secrets.AWS_REGION }}\n\n      - name: ECR Login\n        run: |\n          aws ecr get-login-password --region ${{ secrets.AWS_REGION }} | docker login --username AWS --password-stdin YOUR_AWS_ACCOUNT_ID.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com\n\n      - name: G\u00f6rev Tan\u0131m\u0131n\u0131 G\u00fcncelle ve Da\u011f\u0131t\n        id: deploy\n        run: |\n          # G\u00f6rev tan\u0131m\u0131 JSON dosyas\u0131n\u0131 okuyup imaj etiketini g\u00fcncelleme\n          TASK_DEFINITION=$(cat ${{ inputs.ecs_task_definition_path }} | jq \\\n            --arg SERVICE_NAME \"${{ inputs.service_name }}\" \\\n            --arg DOCKER_IMAGE_TAG \"${{ inputs.docker_image_tag }}\" \\\n            '.containerDefinitions[0].image = (\"YOUR_AWS_ACCOUNT_ID.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com\/\" + $SERVICE_NAME + \":\" + $DOCKER_IMAGE_TAG)')\n\n          # Yeni g\u00f6rev tan\u0131m\u0131n\u0131 kaydetme\n          echo $TASK_DEFINITION > updated-task-definition.json\n\n          # Yeni g\u00f6rev tan\u0131m\u0131n\u0131 AWS'e kaydetme\n          aws ecs register-task-definition --cli-input-json file:\/\/updated-task-definition.json\n\n          # ECS servisini g\u00fcncelleme\n          aws ecs update-service \\\n            --cluster ${{ inputs.ecs_cluster_name }} \\\n            --service ${{ inputs.ecs_service_name }} \\\n            --task-definition $(aws ecs describe-task-definition --task-definition ${{ inputs.ecs_service_name }} --query \"taskDefinition.taskDefinitionArn\" --output text)\n\n          echo \"${{ inputs.service_name }} servisi, ${{ inputs.environment }} ortam\u0131na, ${docker_image_tag} imaj etiketiyle ba\u015far\u0131yla da\u011f\u0131t\u0131ld\u0131.\"\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi, bu yeniden kullan\u0131labilir i\u015f ak\u0131\u015f\u0131n\u0131 kullanarak her mikroservis i\u00e7in nas\u0131l bir da\u011f\u0131t\u0131m ak\u0131\u015f\u0131 olu\u015fturaca\u011f\u0131m\u0131z\u0131 g\u00f6relim:<\/p>\n<pre><code class=\"language-yaml\">\n# .github\/workflows\/deploy-products-dev.yml (\u00dcr\u00fcnler Servisi Geli\u015ftirme Ortam\u0131 Da\u011f\u0131t\u0131m\u0131)\nname: \u00dcr\u00fcnler Servisi Geli\u015ftirme Ortam\u0131 Da\u011f\u0131t\u0131m\u0131\n\non:\n  push:\n    branches:\n      - dev\n  workflow_dispatch:\n\njobs:\n  call_microservice_deploy:\n    uses: .\/.github\/workflows\/reusable-microservice-deploy.yml@main\n    with:\n      service_name: 'products'\n      environment: 'dev'\n      docker_image_tag: '${{ github.sha }}' # Commit SHA's\u0131n\u0131 etiket olarak kullan\n      ecs_cluster_name: 'dev-ecommerce-cluster'\n      ecs_service_name: 'products-dev-service'\n      ecs_task_definition_path: '.\/ecs\/products-task-definition.json'\n    secrets:\n      AWS_ACCESS_KEY_ID: ${{ secrets.DEV_AWS_ACCESS_KEY_ID }}\n      AWS_SECRET_ACCESS_KEY: ${{ secrets.DEV_AWS_SECRET_ACCESS_KEY }}\n      AWS_REGION: 'us-east-1' # Geli\u015ftirme ortam\u0131 i\u00e7in b\u00f6lge\n\n# .github\/workflows\/deploy-products-prod.yml (\u00dcr\u00fcnler Servisi \u00dcretim Ortam\u0131 Da\u011f\u0131t\u0131m\u0131)\nname: \u00dcr\u00fcnler Servisi \u00dcretim Ortam\u0131 Da\u011f\u0131t\u0131m\u0131\n\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\njobs:\n  call_microservice_deploy:\n    uses: .\/.github\/workflows\/reusable-microservice-deploy.yml@main\n    with:\n      service_name: 'products'\n      environment: 'prod'\n      docker_image_tag: 'latest' # \u00dcretim i\u00e7in genellikle <code>latest<\/code> veya s\u00fcr\u00fcm etiketi\n      ecs_cluster_name: 'prod-ecommerce-cluster'\n      ecs_service_name: 'products-prod-service'\n      ecs_task_definition_path: '.\/ecs\/products-task-definition.json'\n    secrets:\n      AWS_ACCESS_KEY_ID: ${{ secrets.PROD_AWS_ACCESS_KEY_ID }}\n      AWS_SECRET_ACCESS_KEY: ${{ secrets.PROD_AWS_SECRET_ACCESS_KEY }}\n      AWS_REGION: 'us-east-1' # \u00dcretim ortam\u0131 i\u00e7in b\u00f6lge\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, ayn\u0131 <code>reusable-microservice-deploy.yml<\/code> i\u015f ak\u0131\u015f\u0131, farkl\u0131 parametreler (<code>environment<\/code>, <code>ecs_cluster_name<\/code>, <code>docker_image_tag<\/code> vb.) ve farkl\u0131 AWS s\u0131rlar\u0131 ile \u00e7a\u011fr\u0131larak hem geli\u015ftirme hem de \u00fcretim ortamlar\u0131 i\u00e7in \u00fcr\u00fcnler servisini da\u011f\u0131tabiliyor. Benzer \u015fekilde, <code>users<\/code> ve <code>orders<\/code> servisleri i\u00e7in de bu \u015fablonu kullanarak sadece birka\u00e7 YAML dosyas\u0131 ile t\u00fcm da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini y\u00f6netebilirsiniz. Bu, da\u011f\u0131t\u0131m mant\u0131\u011f\u0131n\u0131 merkezile\u015ftirirken, her servisin ve ortam\u0131n kendine \u00f6zg\u00fc gereksinimlerini kar\u015f\u0131layacak esnekli\u011fi sa\u011flar. B\u00f6ylece, hem kod tekrar\u0131n\u0131 azalt\u0131r hem de CI\/CD s\u00fcre\u00e7lerinizin tutarl\u0131l\u0131\u011f\u0131n\u0131 ve g\u00fcvenilirli\u011fini art\u0131r\u0131rs\u0131n\u0131z.<\/p>\n<h2>\u0130leri D\u00fczey Teknikler: Dinamik Listeler ve Karma\u015f\u0131k Veri Yap\u0131lar\u0131 Nas\u0131l Y\u00f6netilir?<\/h2>\n<p>Basit string veya boolean de\u011ferleri ge\u00e7irmek kolayd\u0131r, ancak bazen i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131n dinamik olarak olu\u015fturulmu\u015f listeler veya daha karma\u015f\u0131k veri yap\u0131lar\u0131yla \u00e7al\u0131\u015fmas\u0131 gerekebilir. \u00d6rne\u011fin, bir test i\u015f ak\u0131\u015f\u0131n\u0131n, test edilecek mod\u00fcllerin dinamik bir listesini almas\u0131 veya bir da\u011f\u0131t\u0131m i\u015f ak\u0131\u015f\u0131n\u0131n, da\u011f\u0131t\u0131lacak birden fazla mikroservis i\u00e7in yap\u0131land\u0131rma detaylar\u0131n\u0131 almas\u0131 gerekebilir. GitHub Actions, bu t\u00fcr senaryolar i\u00e7in g\u00fc\u00e7l\u00fc yetenekler sunar.<\/p>\n<h3>JSON Dizilerini Giri\u015f Olarak Ge\u00e7irme ve \u0130\u015fleme<\/h3>\n<p>GitHub Actions'taki <code>inputs<\/code>, sadece string de\u011ferleri de\u011fil, ayn\u0131 zamanda string olarak temsil edilen JSON verilerini de kabul edebilir. Bu, dinamik listeler veya anahtar-de\u011fer \u00e7iftleri gibi karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 tek bir girdi olarak ge\u00e7irmenizi sa\u011flar. \u0130\u015f ak\u0131\u015f\u0131 i\u00e7inde, <code>fromJSON<\/code> ifadesini kullanarak bu JSON string'ini ayr\u0131\u015ft\u0131rabilir ve \u00fczerinde d\u00f6ng\u00fc yapabilir veya belirli \u00f6zelliklerine eri\u015febilirsiniz.<\/p>\n<pre><code class=\"language-yaml\">\n# .github\/workflows\/reusable-multi-deploy.yml (Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015f\u0131)\nname: \u00c7oklu Servis Dinamik Da\u011f\u0131t\u0131m\n\non:\n  workflow_call:\n    inputs:\n      services_to_deploy:\n        required: true\n        type: string\n        description: 'Da\u011f\u0131t\u0131lacak servislerin JSON dizisi'\n      base_environment:\n        required: true\n        type: string\n        description: 'Temel da\u011f\u0131t\u0131m ortam\u0131'\n\njobs:\n  dynamic_deploy:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        service: ${{ fromJSON(inputs.services_to_deploy) }} # JSON dizisini ayr\u0131\u015ft\u0131r\n    steps:\n      - name: Servis ${{ matrix.service.name }} Da\u011f\u0131t\u0131l\u0131yor\n        run: |\n          echo \"Servis ad\u0131: ${{ matrix.service.name }}\"\n          echo \"Versiyon: ${{ matrix.service.version }}\"\n          echo \"Ortam: ${{ inputs.base_environment }}\"\n          echo \"\u00d6zel URL: ${{ matrix.service.url_suffix }}\"\n          # Da\u011f\u0131t\u0131m mant\u0131\u011f\u0131 burada devam edecek\n          # \u00d6rne\u011fin: docker deploy ${{ matrix.service.name }}:${{ matrix.service.version }} --env ${{ inputs.base_environment }}\n          echo \"Servis ${{ matrix.service.name }} da\u011f\u0131t\u0131m ad\u0131m\u0131 tamamland\u0131.\"\n<\/pre>\n<p><\/code><\/p>\n<p>Bu i\u015f ak\u0131\u015f\u0131n\u0131 \u00e7a\u011f\u0131ran ba\u015fka bir i\u015f ak\u0131\u015f\u0131 \u015fu \u015fekilde g\u00f6r\u00fcnebilir:<\/p>\n<pre><code class=\"language-yaml\">\n# .github\/workflows\/caller-multi-deploy.yml (\u00c7a\u011f\u0131ran \u0130\u015f Ak\u0131\u015f\u0131)\nname: \u00c7a\u011f\u0131ran \u00c7oklu Da\u011f\u0131t\u0131m\n\non:\n  workflow_dispatch:\n\njobs:\n  call_dynamic_deploy:\n    uses: .\/.github\/workflows\/reusable-multi-deploy.yml@main\n    with:\n      base_environment: 'staging'\n      services_to_deploy: | # YAML'da \u00e7ok sat\u0131rl\u0131 string giri\u015fi\n        [\n          {\"name\": \"frontend\", \"version\": \"1.2.0\", \"url_suffix\": \"web\"},\n          {\"name\": \"backend-api\", \"version\": \"2.1.5\", \"url_suffix\": \"api\"},\n          {\"name\": \"auth-service\", \"version\": \"1.0.0\", \"url_suffix\": \"auth\"}\n        ]\n<\/pre>\n<p><\/code><\/p>\n<p>Burada, <code>services_to_deploy<\/code> girdisine bir JSON dizisi olarak karma\u015f\u0131k veriler ge\u00e7irilir. Yeniden kullan\u0131labilir i\u015f ak\u0131\u015f\u0131 i\u00e7indeki <code>strategy.matrix<\/code>, <code>fromJSON<\/code> fonksiyonunu kullanarak bu diziyi ayr\u0131\u015ft\u0131r\u0131r ve her bir servis objesi i\u00e7in ayr\u0131 bir i\u015f (<code>job<\/code>) \u00f6rne\u011fi olu\u015fturur. Bu, bir\u00e7ok servisi tek bir \u00e7a\u011fr\u0131 ile paralel olarak da\u011f\u0131tmak i\u00e7in inan\u0131lmaz derecede g\u00fc\u00e7l\u00fc bir y\u00f6ntemdir.<\/p>\n<h3>Ko\u015fullu \u0130\u015f Y\u00fcr\u00fctme ve \u00c7\u0131kt\u0131lar (Outputs)<\/h3>\n<p>Dinamik parametreler sadece girdi olarak kullan\u0131lmakla kalmaz, ayn\u0131 zamanda i\u015flerin veya ad\u0131mlar\u0131n ko\u015fullu olarak y\u00fcr\u00fct\u00fclmesini sa\u011flamak i\u00e7in de kullan\u0131labilir. \u00d6rne\u011fin, bir parametrenin de\u011ferine g\u00f6re belirli bir test paketini \u00e7al\u0131\u015ft\u0131rmak veya belirli bir ortama \u00f6zg\u00fc bir ad\u0131m\u0131 atlamak isteyebilirsiniz. <code>if:<\/code> ifadesi, bu ko\u015fullu mant\u0131\u011f\u0131 uygulaman\u0131n ana yoludur.<\/p>\n<pre><code class=\"language-yaml\">\n# \u0130\u00e7inde ko\u015fullu ad\u0131m olan reusable-deploy.yml \u00f6rne\u011fi\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: \u00dcretim Ortam\u0131na \u00d6zg\u00fc Ek Ad\u0131mlar\n        if: ${{ inputs.environment == 'prod' }}\n        run: |\n          echo \"\u00dcretim ortam\u0131 i\u00e7in \u00f6zel onay ad\u0131m\u0131 veya g\u00fcvenlik taramas\u0131...\"\n          # production specific tasks\n<\/pre>\n<p><\/code><\/p>\n<p>Ayr\u0131ca, yeniden kullan\u0131labilir bir i\u015f ak\u0131\u015f\u0131, \u00e7al\u0131\u015fmas\u0131n\u0131n sonucunu \u00e7a\u011f\u0131ran i\u015f ak\u0131\u015f\u0131na <code>outputs<\/code> arac\u0131l\u0131\u011f\u0131yla bildirebilir. Bu, bir i\u015f ak\u0131\u015f\u0131n\u0131n di\u011ferini bilgilendirmesini veya sonraki ad\u0131mlar\u0131n ilk i\u015f ak\u0131\u015f\u0131n\u0131n sonucuna g\u00f6re dinamik olarak kararlar almas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-yaml\">\n# reusable-deploy.yml i\u00e7inde outputs tan\u0131mlama\non:\n  workflow_call:\n    # ... inputs ...\n    outputs:\n      deployment_status:\n        description: 'Da\u011f\u0131t\u0131m\u0131n durumu (success\/failure)'\n        value: ${{ jobs.deploy.outputs.status }} # deploy i\u015finin \u00e7\u0131kt\u0131s\u0131n\u0131 kullan\u0131r\n# ...\njobs:\n  deploy:\n    # ...\n    outputs:\n      status: ${{ steps.final_status.outcome }} # Ad\u0131m\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 i\u015f \u00e7\u0131kt\u0131s\u0131 yapar\n    steps:\n      # ...\n      - name: Da\u011f\u0131t\u0131m Durumunu Kaydet\n        id: final_status\n        run: echo \"status=success\" >> \"$GITHUB_OUTPUT\" # \u00c7\u0131kt\u0131 de\u011feri belirleme\n<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-yaml\"><\/pre>\n<p><\/code><br \/>\n# Caller workflow'da outputs kullanma<br \/>\njobs:<br \/>\n  call_deploy:<br \/>\n    uses: .\/.github\/workflows\/reusable-deploy.yml@main<br \/>\n    # ... inputs ...<br \/>\n  notify_result:<br \/>\n    needs: call_deploy<br \/>\n    runs-on: ubuntu-latest<br \/>\n    if: ${{ needs.call_deploy.outputs.deployment_status == 'failure' }}<br \/>\n    steps:<br \/>\n      - name: Da\u011f\u0131t\u0131m Hatas\u0131 Bildirimi<br \/>\n        run: |<br \/>\n          echo \"Da\u011f\u0131t\u0131m ba\u015far\u0131s\u0131z oldu! L\u00fctfen kontrol edin.\"<br \/>\n          # Slack veya Email bildirimi<br \/>\n<\/code><\/p>\n<p><div class=\"expert-tip\" style=\"padding: 15px; margin: 20px 0; border-left: 5px solid #007bff; background-color: #e9f5ff; border-radius: 4px;\">\n    Uzman \u0130pucu: Karma\u015f\u0131k JSON verilerini g\u00fcvenli bir \u015fekilde aktarmak i\u00e7in, bu verileri bir GitHub Secret olarak saklamak ve ard\u0131ndan <code>fromJSON<\/code> ile ayr\u0131\u015ft\u0131rmak, hassas verilerin g\u00fcnl\u00fcklerde g\u00f6r\u00fcnmesini engeller. Ancak, dinamik parametreler i\u00e7in do\u011frudan girdi olarak ge\u00e7irmek genellikle daha esnektir. Performans ve g\u00fcvenlik i\u00e7in <code>default<\/code> de\u011ferler belirlemeyi ve <code>required<\/code> bayra\u011f\u0131n\u0131 do\u011fru kullanmay\u0131 unutmay\u0131n. Bu, i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131n beklenmedik girdi de\u011ferleri kar\u015f\u0131s\u0131nda bile istikrarl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.\n  <\/div>\n<\/p>\n<h3>Mobil Uyumlu Raporlama \u0130\u00e7in GitHub Actions \u00c7\u0131kt\u0131lar\u0131ndan Nas\u0131l Faydalan\u0131l\u0131r?<\/h3>\n<p>GitHub Actions i\u015f ak\u0131\u015flar\u0131 do\u011frudan mobil uygulamalar olu\u015fturmaz veya mobil uyumlu web aray\u00fczleri sunmaz. Ancak, bir i\u015f ak\u0131\u015f\u0131n\u0131n \u00fcretti\u011fi \u00e7\u0131kt\u0131lar (\u00f6rne\u011fin, test sonu\u00e7lar\u0131, da\u011f\u0131t\u0131m durumu, performans metrikleri) genellikle \u00e7e\u015fitli \u015fekillerde g\u00f6rselle\u015ftirilebilir veya raporlanabilir. Bu raporlar\u0131 g\u00f6r\u00fcnt\u00fcleyen bir web aray\u00fcz\u00fc veya panosu varsa, bu aray\u00fcz\u00fcn mobil uyumlu olmas\u0131 \u00f6nemlidir. GitHub Actions'\u0131n kendisi HTML \u00fcretmezken, elde edilen verileri kullanarak modern, duyarl\u0131 web teknolojileriyle mobil uyumlu raporlama panolar\u0131 olu\u015fturabilirsiniz.<\/p>\n<p>\u0130\u015f ak\u0131\u015flar\u0131n\u0131zdan elde edilen verileri toplamak i\u00e7in \u015funlar\u0131 yapabilirsiniz:<\/p>\n<ol>\n<li><strong>\u0130\u015f Ak\u0131\u015f\u0131 \u00c7\u0131kt\u0131lar\u0131 (Outputs)<\/strong>: \u0130\u015f ak\u0131\u015flar\u0131n\u0131z\u0131n sonunda \u00f6nemli metrikleri veya durumlar\u0131 <code>outputs<\/code> olarak tan\u0131mlayarak, bunlar\u0131 \u00e7a\u011fr\u0131 yapan i\u015f ak\u0131\u015f\u0131na veya harici bir sisteme (\u00f6rne\u011fin, API \u00e7a\u011fr\u0131s\u0131 ile) iletebilirsiniz.<\/li>\n<li><strong>Artifacts<\/strong>: Test raporlar\u0131 (JUnit XML, HTML raporlar\u0131), kod analizi sonu\u00e7lar\u0131 veya log dosyalar\u0131 gibi daha b\u00fcy\u00fck \u00e7\u0131kt\u0131lar\u0131 <code>actions\/upload-artifact<\/code> kullanarak depolayabilirsiniz. Bu dosyalar daha sonra indirilebilir ve harici bir raporlama arac\u0131yla i\u015flenebilir.<\/li>\n<li><strong>Webhooklar ve API'ler<\/strong>: GitHub Actions i\u00e7inden \u00f6zel bir betik \u00e7al\u0131\u015ft\u0131rarak, i\u015f ak\u0131\u015f\u0131 sonu\u00e7lar\u0131n\u0131 bir \u00fc\u00e7\u00fcnc\u00fc taraf hizmetine (Datadog, Grafana, \u00f6zel bir raporlama servisi) g\u00f6nderebilirsiniz. Bu servisler, verileri i\u015fleyip mobil uyumlu bir \u015fekilde sunabilir.<\/li>\n<\/ol>\n<p>Bu raporlama panolar\u0131 veya aray\u00fczleri tasarlan\u0131rken, CSS media query'ler gibi standart web geli\u015ftirme teknikleri kullan\u0131larak mobil uyumluluk sa\u011flanabilir. \u0130\u015fte \u00e7ok basit bir HTML ve CSS \u00f6rne\u011fi, GitHub Actions sonu\u00e7lar\u0131n\u0131n bir kart d\u00fczeninde g\u00f6sterildi\u011fi varsay\u0131larak, nas\u0131l mobil uyumlu hale getirilebilece\u011fini g\u00f6sterir:<\/p>\n<pre><code class=\"language-html\">\n<div class=\"github-actions-report-container\">\n  <div class=\"github-actions-report-card\">\n    <h3>Frontend Servisi Da\u011f\u0131t\u0131m\u0131<\/h3>\n    <p>Durum: <span class=\"status-success\">Ba\u015far\u0131l\u0131<\/span><\/p>\n    <p>Ortam: \u00dcretim<\/p>\n    <p>Versiyon: 1.2.0<\/p>\n    <a href=\"#\" class=\"view-details-btn\">Detaylar\u0131 G\u00f6r<\/a>\n  <\/div>\n  <div class=\"github-actions-report-card\">\n    <h3>Backend API Testleri<\/h3>\n    <p>Durum: <span class=\"status-failure\">Ba\u015far\u0131s\u0131z<\/span><\/p>\n    <p>Ortam: Geli\u015ftirme<\/p>\n    <p>Test Say\u0131s\u0131: 120 (10 hata)<\/p>\n    <a href=\"#\" class=\"view-details-btn\">Detaylar\u0131 G\u00f6r<\/a>\n  <\/div>\n<\/div>\n<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-css\"><\/pre>\n<p><\/code><br \/>\n\/* Genel d\u00fczen i\u00e7in stil *\/<br \/>\n.github-actions-report-container {<br \/>\n  display: flex;<br \/>\n  flex-wrap: wrap;<br \/>\n  gap: 20px;<br \/>\n  justify-content: center;<br \/>\n  padding: 20px;<br \/>\n}<\/p>\n<p>.github-actions-report-card {<br \/>\n  background-color: #f8f9fa;<br \/>\n  border: 1px solid #e2e6ea;<br \/>\n  border-radius: 8px;<br \/>\n  padding: 20px;<br \/>\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);<br \/>\n  width: 300px;<br \/>\n  flex-shrink: 0;<br \/>\n}<\/p>\n<p>.status-success {<br \/>\n  color: green;<br \/>\n  font-weight: bold;<br \/>\n}<br \/>\n.status-failure {<br \/>\n  color: red;<br \/>\n  font-weight: bold;<br \/>\n}<\/p>\n<p>.view-details-btn {<br \/>\n  display: inline-block;<br \/>\n  margin-top: 15px;<br \/>\n  padding: 8px 15px;<br \/>\n  background-color: #007bff;<br \/>\n  color: white;<br \/>\n  text-decoration: none;<br \/>\n  border-radius: 5px;<br \/>\n}<\/p>\n<p>\/* Mobil cihazlar i\u00e7in stil (768px geni\u015fli\u011fin alt\u0131) *\/<br \/>\n@media screen and (max-width: 768px) {<br \/>\n  .github-actions-report-container {<br \/>\n    flex-direction: column; \/* Dikey s\u0131ralama *\/<br \/>\n    align-items: center; \/* Ortaya hizalama *\/<br \/>\n    padding: 10px;<br \/>\n  }<br \/>\n  .github-actions-report-card {<br \/>\n    width: 90%; \/* Daha dar ekranlarda daha geni\u015f *\/<br \/>\n    max-width: 400px; \/* \u00c7ok b\u00fcy\u00fck mobil cihazlarda \u00e7ok geni\u015f olmas\u0131n\u0131 engelle *\/<br \/>\n    margin-bottom: 15px; \/* Kartlar aras\u0131nda bo\u015fluk *\/<br \/>\n  }<br \/>\n  .view-details-btn {<br \/>\n    width: 100%; \/* Mobil cihazlarda buton tam geni\u015flik *\/<br \/>\n    text-align: center;<br \/>\n  }<br \/>\n}<br \/>\n<\/code><\/p>\n<p>Bu CSS media query \u00f6rne\u011fi, ekran geni\u015fli\u011fi 768 pikselin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde rapor kartlar\u0131n\u0131n dikey olarak s\u0131ralanmas\u0131n\u0131 ve daha fazla yer kaplamas\u0131n\u0131 sa\u011flar. Bu, GitHub Actions'\u0131n \u00fcretti\u011fi verilerin son kullan\u0131c\u0131ya nas\u0131l mobil dostu bir \u015fekilde sunulabilece\u011fine dair bir kavramsal bir \u00f6rnektir, do\u011frudan GitHub Actions YAML'\u0131 i\u00e7inde de\u011fil, ancak onun \u00fcretti\u011fi verileri t\u00fcketen bir UI katman\u0131nda uygulan\u0131r.<\/p>\n<h2>En \u0130yi Uygulamalar ve G\u00fcvenlik \u0130pu\u00e7lar\u0131: Dinamik Parametre Y\u00f6netiminde Nelere Dikkat Edilmeli?<\/h2>\n<p>Dinamik parametreler, GitHub Actions i\u015f ak\u0131\u015flar\u0131n\u0131 inan\u0131lmaz derecede esnek hale getirirken, ayn\u0131 zamanda belirli g\u00fcvenlik ve y\u00f6netim zorluklar\u0131n\u0131 da beraberinde getirebilir. Bu potansiyel riskleri en aza indirmek ve i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131n g\u00fcvenilirli\u011fini art\u0131rmak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 takip etmek hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<ol>\n<li><strong>Girdi Do\u011frulama ve Sanitizasyon (Input Validation and Sanitization)<\/strong>:\n<ul>\n<li><strong>Giri\u015f Tipi (<code>type<\/code>)<\/strong>: M\u00fcmk\u00fcn oldu\u011funca spesifik veri tipleri (<code>string<\/code>, <code>boolean<\/code>, <code>number<\/code>) kullan\u0131n. GitHub Actions, bu tipleri zorlayarak hatal\u0131 girdileri yakalaman\u0131za yard\u0131mc\u0131 olur.<\/li>\n<li><strong><code>options<\/code> Kullan\u0131m\u0131<\/strong>: E\u011fer bir parametrenin alabilece\u011fi de\u011ferler s\u0131n\u0131rl\u0131ysa, <code>workflow_dispatch<\/code> tetikleyicisiyle birlikte <code>options<\/code> \u00f6zelli\u011fini kullanarak kullan\u0131c\u0131n\u0131n \u00f6nceden tan\u0131ml\u0131 se\u00e7enekler aras\u0131ndan se\u00e7im yapmas\u0131n\u0131 sa\u011flay\u0131n. Bu, hatal\u0131 veya k\u00f6t\u00fc niyetli girdilerin ge\u00e7i\u015fini engeller.<\/li>\n<li><strong>YAML \u0130\u00e7inde Kontroller<\/strong>: Karma\u015f\u0131k senaryolarda, i\u015f ak\u0131\u015f\u0131 i\u00e7inde <code>if<\/code> ko\u015fullar\u0131 veya basit d\u00fczenli ifade (regex) kontrolleri kullanarak girdilerin beklenen format veya de\u011fere sahip olup olmad\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n. \u00d6rne\u011fin, bir branch ad\u0131n\u0131n belirli bir desene uyup uymad\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz.<\/li>\n<li><strong>Komut Enjeksiyonu Riski<\/strong>: Dinamik girdileri do\u011frudan bir kabuk komutuna ge\u00e7irmeden \u00f6nce dikkatli olun. K\u00f6t\u00fc niyetli bir kullan\u0131c\u0131, komut enjeksiyonuyla sisteminize zarar verebilir. Daima girdileri t\u0131rnak i\u00e7ine al\u0131n (\u00f6rne\u011fin, <code>run: my-command \"${{ inputs.dynamic_value }}\"<\/code>) ve m\u00fcmk\u00fcnse komut arg\u00fcman\u0131 olarak ge\u00e7irin, do\u011frudan kabuk komutunun i\u00e7ine enjekte etmeyin.<\/li>\n<\/ul>\n<\/li>\n<li><strong>S\u0131rlar i\u00e7in En Az Ayr\u0131cal\u0131k Prensibi (Least Privilege Principle for Secrets)<\/strong>:\n<ul>\n<li>Hassas bilgileri (API anahtarlar\u0131, \u015fifreler) asla <code>inputs<\/code> olarak ge\u00e7irmeyin. Bunun yerine daima <code>secrets<\/code> kullan\u0131n.<\/li>\n<li><code>secrets<\/code> tan\u0131mlarken, yaln\u0131zca belirli bir i\u015f ak\u0131\u015f\u0131n\u0131n veya i\u015fin ihtiya\u00e7 duydu\u011fu s\u0131rlar\u0131 sa\u011flay\u0131n. T\u00fcm s\u0131rlar dosyas\u0131n\u0131 bir i\u015f ak\u0131\u015f\u0131na a\u00e7\u0131k\u00e7a if\u015fa etmeyin.<\/li>\n<li>Ortam bazl\u0131 s\u0131rlar\u0131 ay\u0131r\u0131n (\u00f6rne\u011fin, <code>DEV_AWS_KEY<\/code>, <code>PROD_AWS_KEY<\/code>) ve i\u015f ak\u0131\u015f\u0131n\u0131n yaln\u0131zca \u00e7al\u0131\u015ft\u0131\u011f\u0131 ortama ait s\u0131rlara eri\u015fti\u011finden emin olun.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131n\u0131 S\u00fcr\u00fcmleme (Versioning Reusable Workflows)<\/strong>:\n<ul>\n<li>Yeniden kullan\u0131labilir i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131 her zaman bir s\u00fcr\u00fcm etiketi (tag) veya belirli bir commit SHA's\u0131 ile \u00e7a\u011f\u0131r\u0131n (\u00f6rne\u011fin, <code>.github\/workflows\/my-workflow.yml@v1<\/code> veya <code>my-org\/my-repo\/.github\/workflows\/my-workflow.yml@a1b2c3d<\/code>). Bu, i\u015f ak\u0131\u015f\u0131n\u0131z\u0131n beklenmedik de\u011fi\u015fikliklerden etkilenmesini \u00f6nler ve tutarl\u0131l\u0131\u011f\u0131 sa\u011flar.<\/li>\n<li><code>@main<\/code> gibi branch isimleri kullanmaktan ka\u00e7\u0131n\u0131n, \u00e7\u00fcnk\u00fc bu, ana branch'teki her de\u011fi\u015fiklikle i\u015f ak\u0131\u015f\u0131n\u0131n davran\u0131\u015f\u0131n\u0131n da de\u011fi\u015febilece\u011fi anlam\u0131na gelir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>A\u00e7\u0131k ve Kapsaml\u0131 Dok\u00fcmantasyon<\/strong>:\n<ul>\n<li>Yeniden kullan\u0131labilir i\u015f ak\u0131\u015flar\u0131n\u0131zdaki her <code>input<\/code> i\u00e7in net ve a\u00e7\u0131klay\u0131c\u0131 bir <code>description<\/code> sa\u011flay\u0131n. Bu, i\u015f ak\u0131\u015f\u0131n\u0131z\u0131 kullanacak di\u011fer geli\u015ftiricilerin hangi parametrelerin ne i\u015fe yarad\u0131\u011f\u0131n\u0131 anlamas\u0131na yard\u0131mc\u0131 olur.<\/li>\n<li>\u0130\u015f ak\u0131\u015f\u0131n\u0131n beklenen davran\u0131\u015f\u0131n\u0131, girdi aral\u0131\u011f\u0131n\u0131 ve herhangi bir \u00f6zel gereksinimi a\u00e7\u0131klayan harici bir README veya wiki belgesi bulundurun.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>required<\/code> ve <code>default<\/code> De\u011ferleri Etkin Kullanma<\/strong>:\n<ul>\n<li>Bir girdinin mutlaka sa\u011flanmas\u0131 gerekiyorsa <code>required: true<\/code> olarak i\u015faretleyin. Bu, eksik girdilerin derleme zaman\u0131nda hatalara yol a\u00e7mas\u0131n\u0131 sa\u011flar.<\/li>\n<li>M\u00fcmk\u00fcn oldu\u011funca <code>default<\/code> de\u011ferler sa\u011flay\u0131n. Bu, i\u015f ak\u0131\u015f\u0131n\u0131 \u00e7a\u011f\u0131ranlar\u0131n yaln\u0131zca varsay\u0131lan de\u011ferden farkl\u0131 parametreleri belirtmesini gerektirerek i\u015f ak\u0131\u015f\u0131n\u0131n kullan\u0131m\u0131n\u0131 basitle\u015ftirir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Kapsaml\u0131 Test ve Geri Alma Yetene\u011fi<\/strong>:\n<ul>\n<li>Dinamik parametrelere sahip i\u015f ak\u0131\u015flar\u0131n\u0131, m\u00fcmk\u00fcn olan t\u00fcm parametre kombinasyonlar\u0131yla test edin. \u00d6zellikle farkl\u0131 ortamlar veya ko\u015fullar i\u00e7in belirlenmi\u015f yollar\u0131n do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olun.<\/li>\n<li>Bir problem durumunda h\u0131zl\u0131ca geri alabilmek i\u00e7in i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131 mod\u00fcler tutun ve de\u011fi\u015fiklikleri k\u00fc\u00e7\u00fck ad\u0131mlarla uygulay\u0131n.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Bu en iyi uygulamalar\u0131 takip ederek, GitHub Actions i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131n hem esnek hem de g\u00fcvenli kalmas\u0131n\u0131 sa\u011flayabilir, dinamik parametrelerin t\u00fcm avantajlar\u0131ndan tam olarak yararlanabilirsiniz.<\/p>\n<h2>Sonu\u00e7: GitHub Actions ile CI\/CD S\u00fcre\u00e7lerinizi Nas\u0131l Otomatikle\u015ftirebilirsiniz?<\/h2>\n<p>GitHub Actions'\u0131n yeniden kullan\u0131labilir i\u015f ak\u0131\u015flar\u0131na dinamik parametreler ge\u00e7irme yetene\u011fi, modern CI\/CD s\u00fcre\u00e7lerini y\u00f6netme bi\u00e7imimizde devrim niteli\u011finde bir esneklik ve g\u00fc\u00e7 sunar. Bu makalede ele ald\u0131\u011f\u0131m\u0131z teknikler sayesinde, art\u0131k her senaryo, her ortam veya her mikroservis i\u00e7in ayr\u0131 ayr\u0131 i\u015f ak\u0131\u015flar\u0131 yazmak zorunda de\u011filsiniz. Bunun yerine, tek, genel, parametre odakl\u0131 i\u015f ak\u0131\u015flar\u0131 olu\u015fturarak kod tekrar\u0131n\u0131 en aza indirebilir, bak\u0131m maliyetlerini d\u00fc\u015f\u00fcrebilir ve geli\u015ftirme s\u00fcre\u00e7lerinizin tutarl\u0131l\u0131\u011f\u0131n\u0131 art\u0131rabilirsiniz.<\/p>\n<p>Dinamik parametreler, basit string girdilerinden JSON dizilerine kadar karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 y\u00f6netme kabiliyetiyle, ekiplerin daha mod\u00fcler, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir otomasyon \u00e7\u00f6z\u00fcmleri olu\u015fturmas\u0131n\u0131 sa\u011flar. Bu, \u00f6zellikle b\u00fcy\u00fck ve h\u0131zla b\u00fcy\u00fcyen projelerde, farkl\u0131 da\u011f\u0131t\u0131m ortamlar\u0131, test stratejileri veya mikroservisleri y\u00f6netirken kritik \u00f6neme sahiptir. Ayr\u0131ca, bu yetenek, geli\u015ftiricilere i\u015f ak\u0131\u015flar\u0131n\u0131 daha hassas bir \u015fekilde kontrol etme imkan\u0131 sunarken, manuel m\u00fcdahaleyi azaltarak hata potansiyelini d\u00fc\u015f\u00fcr\u00fcr.<\/p>\n<p>GitHub Actions'\u0131 bu ileri d\u00fczey tekniklerle birle\u015ftirmek, CI\/CD s\u00fcre\u00e7lerinizi sadece otomatikle\u015ftirmekle kalmaz, ayn\u0131 zamanda onlar\u0131 \"ak\u0131ll\u0131\" hale getirir. \u0130\u015f ak\u0131\u015flar\u0131n\u0131z art\u0131k statik bir dizi komut olmaktan \u00e7\u0131k\u0131p, projenizin ihtiya\u00e7lar\u0131na dinamik olarak adapte olabilen canl\u0131, nefes alan varl\u0131klara d\u00f6n\u00fc\u015f\u00fcr. Bu, ekiplerin daha h\u0131zl\u0131 yineleme yapmas\u0131na, daha g\u00fcvenli da\u011f\u0131t\u0131mlar ger\u00e7ekle\u015ftirmesine ve nihayetinde daha iyi yaz\u0131l\u0131mlar sunmas\u0131na olanak tan\u0131r. Unutmay\u0131n ki, bu g\u00fcc\u00fc kullan\u0131rken girdi do\u011frulama, s\u0131r y\u00f6netimi ve s\u00fcr\u00fcmleme gibi en iyi uygulamalara uymak, otomasyon altyap\u0131n\u0131z\u0131n sa\u011flam ve g\u00fcvenli kalmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Dinamik parametreler ile GitHub Actions s\u0131rlar\u0131 (secrets) aras\u0131ndaki fark nedir?<\/strong><\/p>\n<p>Dinamik parametreler (<code>inputs<\/code>), i\u015f ak\u0131\u015f\u0131n\u0131n \u00e7al\u0131\u015fma zaman\u0131nda davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmek i\u00e7in kullan\u0131lan, genellikle hassas olmayan yap\u0131land\u0131rma de\u011ferleridir (\u00f6rne\u011fin, ortam ad\u0131, servis ad\u0131, Docker etiketi). Bunlar genellikle \u00e7a\u011fr\u0131 yapan i\u015f ak\u0131\u015f\u0131 taraf\u0131ndan a\u00e7\u0131k\u00e7a sa\u011flan\u0131r ve g\u00fcnl\u00fcklerde g\u00f6r\u00fcnebilir. S\u0131rlar (<code>secrets<\/code>) ise, API anahtarlar\u0131, \u015fifreler, eri\u015fim tokenlar\u0131 gibi hassas bilgilerdir. GitHub taraf\u0131ndan otomatik olarak maskelenirler ve g\u00fcnl\u00fcklerde g\u00f6r\u00fcnmezler. Hassas bilgiler asla dinamik parametre olarak ge\u00e7irilmemeli, daima GitHub Secrets olarak y\u00f6netilmelidir.<\/p>\n<p><strong>2. Yeniden kullan\u0131labilir bir i\u015f ak\u0131\u015f\u0131na birden fazla dinamik parametre ge\u00e7irebilir miyim?<\/strong><\/p>\n<p>Evet, kesinlikle. Yeniden kullan\u0131labilir i\u015f ak\u0131\u015f\u0131n\u0131zdaki <code>workflow_call: inputs:<\/code> b\u00f6l\u00fcm\u00fcnde istedi\u011finiz say\u0131da <code>input<\/code> tan\u0131mlayabilirsiniz. \u00c7a\u011f\u0131ran i\u015f ak\u0131\u015f\u0131, bu girdilerin her birini <code>with:<\/code> anahtar kelimesi alt\u0131nda uygun de\u011ferlerle sa\u011flayabilir. Bu, i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131 son derece esnek hale getirmenizi sa\u011flar.<\/p>\n<p><strong>3. Dinamik parametrelerin varsay\u0131lan de\u011ferleri olabilir mi?<\/strong><\/p>\n<p>Evet, bir <code>input<\/code> tan\u0131mlarken <code>default<\/code> anahtar\u0131n\u0131 kullanarak bir varsay\u0131lan de\u011fer belirleyebilirsiniz. E\u011fer \u00e7a\u011f\u0131ran i\u015f ak\u0131\u015f\u0131 bu girdiyi sa\u011flamazsa, yeniden kullan\u0131labilir i\u015f ak\u0131\u015f\u0131 tan\u0131mlanan varsay\u0131lan de\u011feri kullan\u0131r. Bu, i\u015f ak\u0131\u015flar\u0131n\u0131n kullan\u0131m\u0131n\u0131 basitle\u015ftirir ve baz\u0131 parametrelerin iste\u011fe ba\u011fl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p><strong>4. Dinamik parametreleri kullanarak ko\u015fullu ad\u0131mlar veya i\u015fler \u00e7al\u0131\u015ft\u0131rabilir miyim?<\/strong><\/p>\n<p>Evet, bu dinamik parametrelerin en g\u00fc\u00e7l\u00fc kullan\u0131m alanlar\u0131ndan biridir. \u0130\u015f ak\u0131\u015f\u0131 ad\u0131mlar\u0131n\u0131zda veya i\u015flerinizde <code>if:<\/code> ko\u015fulunu kullanarak dinamik parametrelerin de\u011ferlerine g\u00f6re belirli eylemlerin tetiklenip tetiklenmeyece\u011fini kontrol edebilirsiniz. \u00d6rne\u011fin, <code>if: ${{ inputs.environment == 'prod' }}<\/code> ile sadece \u00fcretim ortam\u0131nda \u00e7al\u0131\u015facak ad\u0131mlar tan\u0131mlayabilirsiniz.<\/p>\n<p><strong>5. Dinamik bir listedeki her \u00f6\u011fe i\u00e7in bir i\u015fi nas\u0131l \u00e7al\u0131\u015ft\u0131r\u0131r\u0131m?<\/strong><\/p>\n<p>JSON format\u0131nda bir liste veya dizi alan dinamik bir parametre ge\u00e7irebilir ve bunu <code>fromJSON<\/code> ifadesiyle ayr\u0131\u015ft\u0131rabilirsiniz. Ard\u0131ndan, yeniden kullan\u0131labilir i\u015f ak\u0131\u015f\u0131n\u0131zdaki <code>jobs<\/code> b\u00f6l\u00fcm\u00fcnde <code>strategy.matrix<\/code> kullanarak bu ayr\u0131\u015ft\u0131r\u0131lm\u0131\u015f listenin her \u00f6\u011fesi i\u00e7in paralel veya s\u0131ral\u0131 olarak ayr\u0131 i\u015fler \u00e7al\u0131\u015ft\u0131rabilirsiniz. Bu, \u00f6zellikle \u00e7oklu mikroservis da\u011f\u0131t\u0131m\u0131 veya test senaryolar\u0131 i\u00e7in \u00e7ok etkilidir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde otomasyon, h\u0131z\u0131 ve g\u00fcvenilirli\u011fi art\u0131rman\u0131n anahtar\u0131d\u0131r. GitHub Actions, bu otomasyonu do\u011frudan geli\u015ftirme ekosisteminize entegre&hellip;","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":[1401],"tags":[],"class_list":{"0":"post-34439","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-git","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>Github Actions Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131na Dinamik Parametre Ge\u00e7i\u015fi<\/title>\n<meta name=\"description\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde otomasyon, h\u0131z\u0131 ve g\u00fcvenilirli\u011fi art\u0131rman\u0131n anahtar\u0131d\u0131r. GitHub Actions, bu otomasyonu do\u011frudan geli\u015ftirme ekosisteminize entegre ederek g\u00fc\u00e7l\u00fc bir CI\/CD platformu sunar. Ancak, projeler b\u00fcy\u00fcd\u00fck\u00e7e ve karma\u015f\u0131kla\u015ft\u0131k\u00e7a, farkl\u0131 ortamlar, hizmetler veya yap\u0131land\u0131rmalar i\u00e7in esneklik ihtiyac\u0131 ortaya \u00e7\u0131kar. Bu makale, GitHub Actions&#039;\u0131n yeniden kullan\u0131labilir i\u015f ak\u0131\u015flar\u0131na dinamik parametreler nas\u0131l ge\u00e7irebilece\u011finizi, b\u00f6ylece s\u00fcre\u00e7lerinizi daha esnek ve g\u00fc\u00e7l\u00fc hale getirebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.\" \/>\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\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Github Actions Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131na Dinamik Parametre Ge\u00e7i\u015fi\" \/>\n<meta property=\"og:description\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde otomasyon, h\u0131z\u0131 ve g\u00fcvenilirli\u011fi art\u0131rman\u0131n anahtar\u0131d\u0131r. GitHub Actions, bu otomasyonu do\u011frudan geli\u015ftirme ekosisteminize entegre ederek g\u00fc\u00e7l\u00fc bir CI\/CD platformu sunar. Ancak, projeler b\u00fcy\u00fcd\u00fck\u00e7e ve karma\u015f\u0131kla\u015ft\u0131k\u00e7a, farkl\u0131 ortamlar, hizmetler veya yap\u0131land\u0131rmalar i\u00e7in esneklik ihtiyac\u0131 ortaya \u00e7\u0131kar. Bu makale, GitHub Actions&#039;\u0131n yeniden kullan\u0131labilir i\u015f ak\u0131\u015flar\u0131na dinamik parametreler nas\u0131l ge\u00e7irebilece\u011finizi, b\u00f6ylece s\u00fcre\u00e7lerinizi daha esnek ve g\u00fc\u00e7l\u00fc hale getirebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-16T14:31:16+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=\"28 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Github Actions Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131na Dinamik Parametre Ge\u00e7i\u015fi\",\"datePublished\":\"2025-11-16T14:31:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/\"},\"wordCount\":4074,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Git\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/\",\"name\":\"Github Actions Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131na Dinamik Parametre Ge\u00e7i\u015fi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-16T14:31:16+00:00\",\"description\":\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde otomasyon, h\u0131z\u0131 ve g\u00fcvenilirli\u011fi art\u0131rman\u0131n anahtar\u0131d\u0131r. GitHub Actions, bu otomasyonu do\u011frudan geli\u015ftirme ekosisteminize entegre ederek g\u00fc\u00e7l\u00fc bir CI\/CD platformu sunar. Ancak, projeler b\u00fcy\u00fcd\u00fck\u00e7e ve karma\u015f\u0131kla\u015ft\u0131k\u00e7a, farkl\u0131 ortamlar, hizmetler veya yap\u0131land\u0131rmalar i\u00e7in esneklik ihtiyac\u0131 ortaya \u00e7\u0131kar. Bu makale, GitHub Actions'\u0131n yeniden kullan\u0131labilir i\u015f ak\u0131\u015flar\u0131na dinamik parametreler nas\u0131l ge\u00e7irebilece\u011finizi, b\u00f6ylece s\u00fcre\u00e7lerinizi daha esnek ve g\u00fc\u00e7l\u00fc hale getirebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Github Actions Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131na Dinamik Parametre Ge\u00e7i\u015fi\"}]},{\"@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":"Github Actions Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131na Dinamik Parametre Ge\u00e7i\u015fi","description":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde otomasyon, h\u0131z\u0131 ve g\u00fcvenilirli\u011fi art\u0131rman\u0131n anahtar\u0131d\u0131r. GitHub Actions, bu otomasyonu do\u011frudan geli\u015ftirme ekosisteminize entegre ederek g\u00fc\u00e7l\u00fc bir CI\/CD platformu sunar. Ancak, projeler b\u00fcy\u00fcd\u00fck\u00e7e ve karma\u015f\u0131kla\u015ft\u0131k\u00e7a, farkl\u0131 ortamlar, hizmetler veya yap\u0131land\u0131rmalar i\u00e7in esneklik ihtiyac\u0131 ortaya \u00e7\u0131kar. Bu makale, GitHub Actions'\u0131n yeniden kullan\u0131labilir i\u015f ak\u0131\u015flar\u0131na dinamik parametreler nas\u0131l ge\u00e7irebilece\u011finizi, b\u00f6ylece s\u00fcre\u00e7lerinizi daha esnek ve g\u00fc\u00e7l\u00fc hale getirebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.","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\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/","og_locale":"tr_TR","og_type":"article","og_title":"Github Actions Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131na Dinamik Parametre Ge\u00e7i\u015fi","og_description":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde otomasyon, h\u0131z\u0131 ve g\u00fcvenilirli\u011fi art\u0131rman\u0131n anahtar\u0131d\u0131r. GitHub Actions, bu otomasyonu do\u011frudan geli\u015ftirme ekosisteminize entegre ederek g\u00fc\u00e7l\u00fc bir CI\/CD platformu sunar. Ancak, projeler b\u00fcy\u00fcd\u00fck\u00e7e ve karma\u015f\u0131kla\u015ft\u0131k\u00e7a, farkl\u0131 ortamlar, hizmetler veya yap\u0131land\u0131rmalar i\u00e7in esneklik ihtiyac\u0131 ortaya \u00e7\u0131kar. Bu makale, GitHub Actions'\u0131n yeniden kullan\u0131labilir i\u015f ak\u0131\u015flar\u0131na dinamik parametreler nas\u0131l ge\u00e7irebilece\u011finizi, b\u00f6ylece s\u00fcre\u00e7lerinizi daha esnek ve g\u00fc\u00e7l\u00fc hale getirebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.","og_url":"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-16T14:31:16+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"28 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Github Actions Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131na Dinamik Parametre Ge\u00e7i\u015fi","datePublished":"2025-11-16T14:31:16+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/"},"wordCount":4074,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Git"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/","url":"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/","name":"Github Actions Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131na Dinamik Parametre Ge\u00e7i\u015fi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-16T14:31:16+00:00","description":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde otomasyon, h\u0131z\u0131 ve g\u00fcvenilirli\u011fi art\u0131rman\u0131n anahtar\u0131d\u0131r. GitHub Actions, bu otomasyonu do\u011frudan geli\u015ftirme ekosisteminize entegre ederek g\u00fc\u00e7l\u00fc bir CI\/CD platformu sunar. Ancak, projeler b\u00fcy\u00fcd\u00fck\u00e7e ve karma\u015f\u0131kla\u015ft\u0131k\u00e7a, farkl\u0131 ortamlar, hizmetler veya yap\u0131land\u0131rmalar i\u00e7in esneklik ihtiyac\u0131 ortaya \u00e7\u0131kar. Bu makale, GitHub Actions'\u0131n yeniden kullan\u0131labilir i\u015f ak\u0131\u015flar\u0131na dinamik parametreler nas\u0131l ge\u00e7irebilece\u011finizi, b\u00f6ylece s\u00fcre\u00e7lerinizi daha esnek ve g\u00fc\u00e7l\u00fc hale getirebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/github-actions-yeniden-kullanilabilir-is-akislarina-dinamik-parametre-gecisi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Github Actions Yeniden Kullan\u0131labilir \u0130\u015f Ak\u0131\u015flar\u0131na Dinamik Parametre Ge\u00e7i\u015fi"}]},{"@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\/34439","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=34439"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34439\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34439"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34439"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34439"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}