Takip et

Yazılım Geliştirme Süreçlerinizi GitHub Actions ile Otomatikleştirmek: Tam Kapsamlı Bir Rehber

Modern yazılım geliştirme süreçlerinde hız, güvenilirlik ve tutarlılık arayışında mısınız? Projelerinizi daha hızlı teslim etmek, hataları erken yakalamak ve ekibinizin verimliliğini artırmak için Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) pratiklerini uygulamak artık bir lüks değil, bir zorunluluktur. Bu kapsamlı rehberde, GitHub Actions’ın gücünü kullanarak CI/CD süreçlerinizi baştan sona nasıl otomatikleştireceğinizi detaylıca inceleyeceğiz. GitHub Actions, depolarınızda gerçekleşen olaylara yanıt olarak kod derleme, test etme, dağıtma gibi görevleri otomatikleştiren esnek ve güçlü bir araçtır. Geliştirme yaşam döngünüzü hızlandırırken aynı zamanda yazılım kalitenizi de önemli ölçüde yükseltir. Bu makale, konuya tamamen yabancı olanlardan ileri düzey kullanıcıya kadar herkesin faydalanabileceği şekilde tasarlanmıştır. Adım adım örnekler, gerçek dünya senaryoları ve uzman ipuçlarıyla, GitHub Actions’ın sunduğu otomasyon potansiyelini tam anlamıyla kavrayacaksınız.

CI/CD ve GitHub Actions Temelleri: Otomatikleştirilmiş Geliştirme Nedir?

Günümüzün rekabetçi yazılım pazarında, ürünleri hızlı ve güvenilir bir şekilde piyasaya sürmek kritik bir avantaj sağlamaktadır. İşte bu noktada Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) devreye girer. Bu iki kavram, yazılım geliştirme yaşam döngüsünü otomatikleştirerek insan müdahalesini en aza indirir ve hataları erkenden tespit etmeyi sağlar. Peki, tam olarak nedir bu CI/CD ve GitHub Actions bu süreçte bize nasıl yardımcı olur? Gelin temel kavramları netleştirelim ve GitHub Actions’ın bu otomasyon yolculuğundaki rolünü anlayalım. Süreçlerinizi manuel olarak yönetmenin getirdiği zaman kaybı, tutarsızlık ve insan hatası riskleri, otomasyonun ne kadar hayati olduğunu ortaya koymaktadır. Özellikle büyük ve dağıtık ekiplerde, herkesin aynı kod tabanı üzerinde çalışması ve sürekli olarak değişiklikleri birleştirmesi gerektiği durumlarda CI/CD pratikleri olmazsa olmazdır. Bu sayede, entegrasyon çatışmaları azalır, hata ayıklama süreçleri kolaylaşır ve geliştiriciler ana görevleri olan kod yazmaya daha fazla odaklanabilirler.

Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) Kavramlarına Yakından Bakış

Sürekli Entegrasyon (CI), geliştiricilerin kod değişikliklerini düzenli olarak (genellikle günde birkaç kez) ana kod tabanına birleştirdiği bir yazılım geliştirme pratiğidir. Her bir birleştirme işleminde, otomatikleştirilmiş testler (birim testleri, entegrasyon testleri vb.) çalıştırılır. Amacı, entegrasyon sorunlarını mümkün olan en erken aşamada tespit etmek ve çözmektir. Bu sayede, küçük değişiklikler sürekli olarak test edildiği için büyük entegrasyon sorunlarının ortaya çıkması engellenir. CI’nın temel faydaları arasında, daha hızlı hata tespiti, daha güvenilir kod tabanı, daha az birleştirme çatışması ve daha iyi takım işbirliği yer alır. Geliştiriciler, kendi yerel ortamlarında yapılan değişikliklerin ana branch ile uyumlu olup olmadığını anında görebilirler.

Sürekli Dağıtım (CD) ise, CI’nın bir uzantısıdır ve kod değişikliklerinin, testleri geçtikten sonra otomatik olarak üretim ortamına dağıtılmasını sağlar. Bu süreç, sadece kodun dağıtımını değil, aynı zamanda altyapı provizyonu, veritabanı güncellemeleri ve yapılandırma yönetimi gibi adımları da içerebilir. CD iki ana kategoriye ayrılabilir:

  • Sürekli Teslimat (Continuous Delivery): Kodun üretim ortamına dağıtılmaya hazır hale gelene kadar tüm adımların otomatikleştirildiği ancak son dağıtım kararının manuel olarak verildiği süreçtir. Yani, bir insan onayı gerektirir.
  • Sürekli Dağıtım (Continuous Deployment): Kodun başarılı bir şekilde testleri geçtikten sonra insan müdahalesi olmadan otomatik olarak üretim ortamına dağıtıldığı tam otomasyon sürecidir. Hedef, müşterilere daha hızlı ve daha sık yeni özellikler sunmaktır.

Her iki durumda da, CD’nin amacı, yazılımı müşterilere daha sık, daha hızlı ve daha güvenilir bir şekilde ulaştırmaktır. Bu sayede pazara sunma süresi kısalır, müşteri geri bildirimleri daha hızlı alınır ve ürün sürekli olarak iyileştirilebilir. CD, aynı zamanda geri alma (rollback) süreçlerinin de otomatikleştirilmesini teşvik eder, böylece olası hatalar durumunda hızlıca önceki kararlı sürüme dönülebilir.

GitHub Actions Nedir ve Neden Tercih Edilmelidir?

GitHub Actions, doğrudan GitHub depolarınızla entegre çalışan bir otomasyon platformudur. Projelerinizde gerçekleşen belirli olaylara (örneğin, bir push, bir pull request oluşturma veya belirli bir zaman aralığı) yanıt olarak özel iş akışları (workflows) çalıştırmanıza olanak tanır. Bu iş akışları, kodunuzu otomatik olarak derleyebilir, test edebilir, paketleyebilir, yayınlayabilir ve hatta dağıtabilir. GitHub Actions’ın en büyük avantajlarından biri, tamamen GitHub ekosistemi içinde yer almasıdır. Bu, geliştiricilerin farklı araçlar arasında geçiş yapma ihtiyacını ortadan kaldırır ve entegrasyonu son derece kolaylaştırır.

Uzman İpucu: GitHub Actions’ın sunduğu zengin pazar yeri (marketplace), yüzlerce hazır aksiyon ile iş akışlarınızı saniyeler içinde zenginleştirmenizi sağlar. Kendi özel aksiyonlarınızı yazabileceğiniz gibi, topluluk tarafından oluşturulmuş aksiyonları da kolayca kullanabilirsiniz.

Neden GitHub Actions’ı tercih etmelisiniz? İşte bazı temel nedenler:

  • Sıkı GitHub Entegrasyonu: GitHub depolarınızla doğal bir şekilde entegre olur, bu da öğrenme eğrisini kısaltır ve yönetim kolaylığı sağlar. İş akışları doğrudan deponuzdaki .github/workflows dizininde YAML dosyaları olarak tanımlanır.
  • Esneklik ve Genişletilebilirlik: Hem Linux, macOS, Windows sanal makinelerinde hem de kendi barındırdığınız (self-hosted) runner’larda çalışabilir. Yüzlerce hazır aksiyon ve özel aksiyon oluşturma yeteneği sayesinde neredeyse her türlü otomasyon senaryosuna uyarlanabilir.
  • Maliyet Etkinliği: Açık kaynak projeler ve belirli bir kullanım limitine kadar özel depolar için genellikle ücretsizdir. Bu, küçük ekipler ve bireysel geliştiriciler için mükemmel bir başlangıç noktası sunar.
  • Topluluk Desteği: Büyük bir geliştirici topluluğuna sahip olması, sorun giderme ve yeni fikirler bulma konusunda önemli bir avantaj sağlar. GitHub Marketplace, bu topluluğun katkılarıyla sürekli büyümektedir.
  • Version Kontrolü: İş akışı tanımlamaları (YAML dosyaları) doğrudan deponuzda sürüm kontrolüne tabi tutulur. Bu, iş akışlarınızın da kodunuz gibi değişiklik geçmişini takip edebileceği, geri alınabileceği ve incelenebileceği anlamına gelir.

Bu nedenlerden ötürü, GitHub Actions modern CI/CD ihtiyaçları için popüler ve güçlü bir seçenek haline gelmiştir. Artık temel kavramları anladığımıza göre, ilk CI/CD pipeline’ımızı nasıl oluşturacağımıza geçebiliriz.

GitHub Actions ile İlk CI/CD Pipeline’ınızı Oluşturma: Adım Adım Rehber

Artık CI/CD’nin ne olduğunu ve GitHub Actions’ın neden bu kadar güçlü bir araç olduğunu biliyoruz. Şimdi, öğrendiklerimizi pratiğe dökme zamanı. Bu bölümde, basit bir projeyi ele alarak, GitHub Actions ile temel bir CI/CD pipeline’ını adım adım nasıl oluşturacağımızı göreceğiz. Amacımız, bir kod değişikliği yapıldığında (örneğin bir push olayıyla) otomatik olarak testleri çalıştıran ve ardından başarılı olursa projeyi derleyen bir iş akışı oluşturmaktır. Bu süreç, herhangi bir yazılım projesinin temel taşlarından biridir ve bu adımları doğru bir şekilde otomatikleştirmek, geliştirme döngünüzü önemli ölçüde hızlandıracaktır. Bu rehberde, genellikle JavaScript tabanlı projelerde yaygın olarak kullanılan Node.js ekosistemini örnek alacağız, ancak prensipler diğer diller ve platformlar için de kolayca uyarlanabilir. Başlangıçta karmaşık gelebilecek bu süreç, doğru adımlarla ilerlediğinizde ne kadar mantıklı ve kolay olduğunu gösterecektir.

Basit Bir Workflow Tanımlama

GitHub Actions iş akışları, deponuzun kök dizininde bulunan .github/workflows/ klasörü içindeki YAML dosyalarında tanımlanır. Her bir YAML dosyası, bir veya daha fazla iş (job) içerebilen bir iş akışını (workflow) temsil eder. İlk adımımız, projemizin temel CI iş akışını tanımlayan bir YAML dosyası oluşturmaktır. Bu dosya, kod deposuna her yeni bir commit gönderildiğinde (push olayı) veya bir pull request açıldığında çalışacak şekilde yapılandırılacaktır. Bu, sürekli entegrasyonun temelini oluşturur; yani, her kod değişikliği ana branch’e birleştirilmeden önce otomatik olarak kontrol edilir. Bu sayede, entegrasyon sorunları erken aşamada tespit edilebilir ve geliştiricilerin zaman kaybetmesi engellenir.

.github/workflows/ci.yml adında bir dosya oluşturalım ve içine aşağıdaki içeriği ekleyelim:


name: CI Pipeline

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main, develop ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:
    - name: Depoyu Çıkart (Checkout Repository)
      uses: actions/checkout@v4

    - name: Node.js Kur (Setup Node.js)
      uses: actions/setup-node@v4
      with:
        node-version: '18' # Veya projenizin ihtiyacı olan Node.js sürümü

    - name: Bağımlılıkları Kur (Install Dependencies)
      run: npm install

    - name: Testleri Çalıştır (Run Tests)
      run: npm test

    - name: Projeyi Derle (Build Project)
      run: npm run build
    

Bu YAML dosyası ne anlama geliyor? Gelin her bir bölümü inceleyelim:

  • name: CI Pipeline: İş akışının görünen adıdır.
  • on:: İş akışının ne zaman tetikleneceğini tanımlar. Burada, main veya develop branch'lerine yapılan her push işleminde ve bu branch'lere açılan her pull_request işleminde çalışacaktır.
  • jobs:: İş akışının gerçekleştireceği görevleri içerir. Her bir job bağımsız olarak çalışır ve kendi adımlarını içerir.
  • build-and-test:: Bu işin adıdır.
  • runs-on: ubuntu-latest: Bu işin hangi işletim sistemi üzerinde çalışacağını belirtir. GitHub, çeşitli sanal ortamlar (runner) sunar (Ubuntu, Windows, macOS).
  • steps:: Bir işin içinde sırayla çalıştırılacak adımların listesidir.
  • uses: actions/checkout@v4: Bu adım, deponuzdaki kodu runner'a kopyalamak için GitHub'ın resmi checkout aksiyonunu kullanır.
  • uses: actions/setup-node@v4: Bu adım, Node.js ortamını kurmak için GitHub'ın resmi setup-node aksiyonunu kullanır.
  • run: npm install: Bu, runner üzerinde doğrudan çalıştırılacak bir komuttur. Projenizin bağımlılıklarını yükler.
  • run: npm test: Projenizin birim ve entegrasyon testlerini çalıştırır. Eğer bu komut başarısız olursa, iş akışı da başarısız olur.
  • run: npm run build: Projenizi derler ve dağıtıma hazır hale getirir.

Bu basit iş akışı ile artık projenizdeki her kod değişikliği otomatik olarak test edilecek ve derlenecektir. Bu, yazılımınızın kalitesini artırmak ve entegrasyon sorunlarını erken aşamada tespit etmek için atılmış büyük bir adımdır.

Testleri Otomatikleştirme

Yukarıdaki iş akışımızda npm test komutunu kullanarak testleri çalıştırdık. Ancak, gerçek dünya senaryolarında testler daha karmaşık olabilir ve farklı test türleri (birim, entegrasyon, uçtan uca) içerebilir. GitHub Actions, test sonuçlarını toplama ve raporlama konusunda da esneklik sunar. Örneğin, JUnit veya Cobertura formatında test sonuçları üreten araçlar kullanıyorsanız, bu sonuçları iş akışınıza entegre edebilirsiniz. Bu, test başarısızlıklarının daha okunabilir olmasını ve hata ayıklama sürecinin kolaylaşmasını sağlar.

Testlerinizi daha verimli hale getirmek için paralel test çalıştırma veya sadece değişen kodla ilgili testleri çalıştırma gibi stratejiler uygulayabilirsiniz. Örneğin, jest --changedSince=main gibi komutlar, sadece ana branch'ten bu yana değişen dosyaları test etmeye odaklanarak CI süresini kısaltabilir.

Uzman İpucu: Büyük test süitleri için, testleri birden fazla runner'a dağıtarak paralel çalıştırmak, CI süresini önemli ölçüde kısaltabilir. GitHub Actions matris stratejileri (ileride ele alınacak) bu konuda size yardımcı olacaktır.

Derleme ve Yapılandırma Adımları

npm run build komutu, projemizi dağıtıma hazır hale getirir. Bu adım, web uygulamaları için JavaScript/CSS paketleme, mobil uygulamalar için APK/IPA oluşturma veya backend servisleri için Docker imajı oluşturma gibi farklı işlemleri içerebilir. Derleme adımlarının başarıyla tamamlanması, kodunuzun dağıtıma uygun olduğunu gösterir.

Derleme çıktıları (build artifacts) genellikle bir sonraki aşama olan dağıtım için gereklidir. GitHub Actions, bu çıktıları iş akışları arasında veya hatta farklı iş akışları arasında geçirmek için actions/upload-artifact ve actions/download-artifact aksiyonlarını sunar. Örneğin, derleme sonucunda oluşan bir .zip dosyasını veya bir Docker imajını bu yolla saklayabilir ve dağıtım işinde kullanabilirsiniz.


- name: Derleme Çıktılarını Yükle (Upload Build Artifacts)
  uses: actions/upload-artifact@v4
  with:
    name: my-app-build
    path: build/ # Derleme çıktılarının bulunduğu dizin
    

Bu adım, build/ dizinindeki tüm dosyaları my-app-build adıyla bir artefakt olarak kaydeder. Daha sonra, bir dağıtım işinde bu artefaktı indirebilirsiniz:


- name: Derleme Çıktılarını İndir (Download Build Artifacts)
  uses: actions/download-artifact@v4
  with:
    name: my-app-build
    path: ./dist/ # Artefaktların indirileceği dizin
    

Bu sayede, derleme ve test işini bir kez yapıp, derlenen artefaktları birden fazla dağıtım ortamına (test, hazırlık, üretim) güvenle gönderebilirsiniz. Bu, CI/CD prensiplerine uygun olarak "bir kez derle, birden çok yere dağıt" yaklaşımını benimsemenizi sağlar. Bu otomasyon adımları, yazılım kalitesini korurken dağıtım süreçlerini inanılmaz derecede hızlandırır ve tekrarlayan manuel hataların önüne geçer.

Gerçek Dünya Senaryolarında GitHub Actions: Vaka Analizleri ve İleri Düzey Kullanımlar

Temel bir CI/CD pipeline'ı oluşturmayı başardık, ancak GitHub Actions'ın gerçek gücü, karmaşık ve özel ihtiyaçlara cevap veren ileri düzey senaryolarda ortaya çıkar. Bu bölümde, GitHub Actions'ı daha etkin kullanmanızı sağlayacak vaka analizleri, gelişmiş özellikler ve en iyi pratikleri inceleyeceğiz. Yazılım projeleri genellikle basit derleme ve test adımlarının ötesinde güvenlik taramaları, çoklu ortamlara dağıtım, önbellekleme ve paralel çalıştırma gibi gereksinimlere sahiptir. GitHub Actions, bu tür ihtiyaçları karşılamak için geniş bir esneklik sunar. Büyük ölçekli uygulamalardan mikroservis mimarilerine kadar her türlü projede GitHub Actions'ı başarıyla uygulayabilir ve geliştirme süreçlerinizi daha da optimize edebilirsiniz. Ayrıca, performans optimizasyonları ve maliyet yönetimi gibi pratik konulara da değinerek, iş akışlarınızı hem daha hızlı hem de daha ekonomik hale getirmenin yollarını göstereceğiz.

Çoklu Ortamlara Dağıtım Stratejileri

Bir uygulamanın genellikle geliştirme (dev), test (staging) ve üretim (production) gibi farklı ortamlara dağıtılması gerekir. GitHub Actions, bu dağıtım süreçlerini otomatikleştirmek için çeşitli stratejiler sunar. Örneğin, bir main branch'e yapılan başarılı bir birleştirme işlemi, test ortamına otomatik dağıtımı tetiklerken, üretim ortamına dağıtım için manuel bir onay adımı eklenebilir. Bu tür bir yaklaşım, güvenliği ve kontrolü elden bırakmadan otomasyonun faydalarından yararlanmanızı sağlar.

Ortamlara özel değişkenler ve sırlar (secrets) kullanmak, dağıtım süreçlerinin güvenliğini ve esnekliğini artırır. GitHub Secrets, hassas bilgileri (API anahtarları, veritabanı şifreleri vb.) güvenli bir şekilde saklamanıza ve iş akışlarınızda kullanmanıza olanak tanır. Her ortam için ayrı sırları tanımlayabilir ve bunları sadece ilgili iş akışlarında erişilebilir kılabilirsiniz.


jobs:
  deploy-to-staging:
    runs-on: ubuntu-latest
    environment: staging # Ortam tanımı
    steps:
    - name: Depoyu Çıkart
      uses: actions/checkout@v4
    - name: Artefaktları İndir
      uses: actions/download-artifact@v4
      with:
        name: my-app-build
    - name: Staging Ortamına Dağıt
      run: |
        echo "Staging ortamına dağıtılıyor..."
        # AWS S3, Azure Blob Storage veya Kubernetes gibi bir servise dağıtım komutları
        # Örnek: aws s3 sync . s3://${{ secrets.AWS_S3_BUCKET_STAGING }}
      env:
        SECRET_KEY: ${{ secrets.STAGING_SECRET_KEY }}
    

Yukarıdaki örnekte, environment: staging ile belirli bir ortama atıfta bulunulmuş ve secrets.STAGING_SECRET_KEY kullanılarak ortama özel bir sır güvenli bir şekilde erişilmiştir. Bu, farklı ortamlar için farklı kimlik bilgileri veya API anahtarları kullanmanız gerektiğinde hayati önem taşır. Ayrıca, dağıtım iş akışlarınızda environment tanımlamanız, GitHub'ın ortam koruma kurallarını (örneğin, manuel onay gerektirme veya belirli branch'lerden dağıtıma izin verme) uygulamanıza olanak tanır.

Aşamalı dağıtım (progressive delivery) stratejileri, örneğin canary dağıtımlar veya mavi/yeşil dağıtımlar, üretim ortamına yapılan değişikliklerin riskini azaltmak için kullanılabilir. GitHub Actions, bu karmaşık stratejileri otomatikleştirmek için esneklik sunar. Örneğin, yeni bir sürümü küçük bir kullanıcı grubuna dağıtıp performans metriklerini izleyebilir, ardından her şey yolundaysa tüm kullanıcılara dağıtımı genişletebilirsiniz. Bu, hata durumunda hızlı bir geri dönüş (rollback) yapma yeteneğiyle birlikte gelir.

Güvenlik, Performans ve Gelişmiş İş Akışı Yönetimi

Güvenlik, CI/CD pipeline'larının ayrılmaz bir parçası olmalıdır. GitHub Actions ile güvenlik taramalarını (statik kod analizi, bağımlılık taraması, güvenlik açığı tespiti) iş akışlarınıza entegre edebilirsiniz. Örneğin, bir pull request açıldığında otomatik olarak güvenlik taraması çalıştırabilir ve potansiyel güvenlik açıklarını birleştirmeden önce tespit edebilirsiniz. Popüler aksiyonlar arasında GitHub Advanced Security, Snyk, TruffleHog gibi araçlarla entegrasyonlar bulunmaktadır.


- name: Güvenlik Açığı Taraması (Security Scan)
  uses: github/codeql-action/analyze@v2 # Örnek bir güvenlik tarama aracı
    

Performans, büyük projelerde CI/CD iş akışlarının kritik bir bileşenidir. İş akışı sürelerini optimize etmek için aşağıdaki ipuçlarını değerlendirebilirsiniz:

  • Önbellekleme (Caching): Bağımlılıkları (node_modules, Maven deposu vb.) önbelleğe almak, sonraki çalıştırmalarda kurulum süresini önemli ölçüde azaltır.
  • 
    - name: Node.js Bağımlılıklarını Önbelleğe Al
      uses: actions/cache@v3
      with:
        path: ~/.npm # veya ~/.cache/yarn
        key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
        restore-keys: |
          ${{ runner.os }}-node-
            

  • Matris Stratejileri: Farklı işletim sistemleri, Node.js sürümleri veya tarayıcılar gibi çeşitli yapılandırmalarda testleri paralel olarak çalıştırmak için kullanılır. Bu, test süresini kısaltırken geniş bir kapsama alanı sağlar.
  • 
    jobs:
      test:
        runs-on: ${{ matrix.os }}
        strategy:
          matrix:
            os: [ubuntu-latest, windows-latest]
            node-version: [16, 18, 20]
        steps:
        - uses: actions/checkout@v4
        - name: Node.js ${{ matrix.node-version }} Kur
          uses: actions/setup-node@v4
          with:
            node-version: ${{ matrix.node-version }}
            

    Bu örnek, testleri Ubuntu ve Windows üzerinde, Node.js'in farklı sürümleriyle paralel olarak çalıştırır. Her bir kombinasyon ayrı bir iş olarak ele alınır.

  • Koşullu Adımlar ve İşler: Sadece belirli koşullar altında (örneğin, sadece belirli bir branch'te veya sadece bir önceki adım başarılıysa) adımları veya işleri çalıştırmak, gereksiz kaynak kullanımını önler.

Gelişmiş iş akışı yönetimi için, iş akışlarınız arasında bağımlılıklar tanımlayabilir (needs: anahtar kelimesi ile), iş akışlarını ayrı dosyalara bölerek daha düzenli hale getirebilir ve hatta yeniden kullanılabilir iş akışları (reusable workflows) oluşturabilirsiniz. Bu, özellikle büyük monorepo'lar veya çok sayıda mikroservis içeren projeler için DRY (Don't Repeat Yourself) prensibini uygulamanızı sağlar.

Uzman İpucu: İş akışlarınızı modüler hale getirmek için reusable workflows özelliğini kullanın. Bu sayede, sıkça kullanılan CI/CD adımlarını tek bir yerde tanımlayıp birden fazla projede veya iş akışında tekrar tekrar kullanabilirsiniz. Bu, bakımı kolaylaştırır ve tutarlılığı artırır.

Son olarak, maliyet yönetimi de önemlidir. GitHub Actions, belirli bir limitin üzerinde kullanımlar için ücretlendirilir. İş akışlarınızı optimize etmek, gereksiz çalıştırmaları engellemek ve self-hosted runner'ları kullanmayı değerlendirmek, maliyetleri kontrol altında tutmanıza yardımcı olabilir. İş akışı çalıştırma sürelerini düzenli olarak gözden geçirmek ve darboğazları tespit etmek, hem performansı hem de maliyeti iyileştirmek için kritik öneme sahiptir.

Mobil Uyumlu Geliştirme ve GitHub Actions İlişkisi: Responsive Tasarım ve Otomasyon

Modern web geliştirmenin olmazsa olmazlarından biri de mobil uyumluluktur. Responsive (duyarlı) tasarım, web sitelerinin ve uygulamaların farklı ekran boyutlarına ve cihazlara (masaüstü, tablet, mobil) otomatik olarak uyum sağlamasını ifade eder. Bu, kullanıcı deneyimini doğrudan etkileyen ve SEO açısından da önemli bir faktördür. Peki, GitHub Actions bu mobil uyumlu geliştirme süreçlerine nasıl entegre olabilir ve bize ne gibi faydalar sağlayabilir? Doğrudan HTML'in mobil uyumlu olmasını sağlayan etiketi veya CSS medya sorguları gibi konular GitHub Actions'ın doğrudan sorumluluğu olmasa da, CI/CD pipeline'ımız bu responsive tasarımların test edilmesi, doğrulanması ve üretim ortamına güvenli bir şekilde dağıtılmasında kilit bir rol oynar. Yani GitHub Actions, mobil uyumlu bir ürünün geliştirme ve dağıtım sürecinin güvenilirliğini artıran bir arka plan mekanizmasıdır. Herhangi bir tasarım değişikliğinin farklı cihazlarda nasıl göründüğünü manuel olarak test etmek yerine, otomasyon bu süreci çok daha verimli hale getirebilir.

Responsive Tasarımın CI/CD Sürecindeki Yeri

Responsive tasarım, geliştiricilerin farklı cihazlar için ayrı kod tabanları oluşturmak yerine, tek bir kod tabanı üzerinden tüm cihazlara hizmet vermesini sağlar. Bu, bakım kolaylığı ve geliştirme hızı açısından büyük avantajlar sunar. Ancak, bu tasarımların farklı ekran boyutlarında ve tarayıcılarda doğru çalıştığından emin olmak için kapsamlı testler yapmak gerekir. İşte burada CI/CD pipeline'ı devreye girer:

  • Otomatik Görsel Regresyon Testleri: Mobil uyumluluk testlerinin en önemli adımlarından biri, farklı ekran boyutlarında ve cihazlarda uygulamanın görsel olarak doğru göründüğünden emin olmaktır. GitHub Actions, Selenium, Playwright veya Cypress gibi araçları kullanarak farklı çözünürlüklerde ekran görüntüleri alıp, önceki başarılı sürümlerle karşılaştırarak görsel regresyon testleri çalıştırabilir. Bu, bir CSS değişikliğinin mobil görünümü bozup bozmadığını otomatik olarak tespit etmenizi sağlar.
  • Performans Testleri: Mobil cihazlarda sayfa yükleme hızı kritik öneme sahiptir. Lighthouse gibi araçlarla yapılan performans testleri, CI/CD pipeline'ınıza entegre edilebilir. Her push veya pull request'te, uygulamanızın mobil performans metriklerini otomatik olarak ölçebilir ve belirli bir eşiğin altına düşerse iş akışını başarısız olarak işaretleyebilirsiniz.
  • Tarayıcılar Arası Uyumluluk Testleri (Cross-Browser Testing): Responsive tasarımın farklı tarayıcılarda (Chrome, Firefox, Safari, Edge) ve bunların mobil versiyonlarında doğru çalışması gerekir. GitHub Actions, BrowserStack veya Sauce Labs gibi bulut tabanlı test platformlarıyla entegre olarak bu testleri otomatikleştirebilir.

Bu testlerin otomatikleştirilmesi, geliştiricilerin her değişikliği manuel olarak yüzlerce kombinasyonda test etme yükünü ortadan kaldırır. Sonuç olarak, mobil uyumlu ve yüksek performanslı uygulamalar daha hızlı bir şekilde kullanıcılara ulaştırılabilir.

Media Query Örnekleri ve Otomasyonla İlişkisi

Mobil uyumlu HTML ve CSS geliştirmek için etiketi ve CSS media query'leri kullanılır. Örneğin:


/* Genel stil */
body {
  font-family: Arial, sans-serif;
  margin: 0;
  padding: 0;
}

/* Masaüstü görünümü için */
.container {
  width: 960px;
  margin: 0 auto;
}

/* Mobil cihazlar için stil tanımlaması */
@media screen and (max-width: 768px) {
  .container {
    width: 100%;
    padding: 0 15px;
  }
  h1 {
    font-size: 24px;
  }
  /* Diğer mobil özgü stiller */
}

/* Küçük mobil cihazlar için ekstra daraltma */
@media screen and (max-width: 480px) {
  h1 {
    font-size: 20px;
  }
  /* Daha fazla mobil optimizasyon */
}
    

Bu CSS medya sorguları, belirli ekran genişliklerine göre farklı stiller uygulayarak içeriğin ve düzenin mobil cihazlara uyum sağlamasını sağlar. GitHub Actions'ın doğrudan bu CSS'i "üretmek" gibi bir görevi olmasa da, bu CSS'in ve bağlı olduğu HTML'in doğru şekilde uygulandığından ve bir regresyona neden olmadığından emin olmak için otomasyon kritik bir rol oynar. Örneğin:

  • Linting ve Formatlama: Prettier, ESLint gibi araçlar, kod kalitesini ve tutarlılığını sağlamak için CI pipeline'ına entegre edilebilir. Bu, tüm geliştiricilerin aynı kodlama standartlarını takip etmesini garantiler ve yanlış yazılmış CSS medya sorgularından kaynaklanan hataları önleyebilir.
  • Erişilebilirlik (Accessibility) Testleri: Mobil kullanıcılar için erişilebilirlik, kritik bir konudur. Axe-core gibi araçlarla yapılan otomatik erişilebilirlik testleri, mobil uyumlu içeriğin herkes tarafından erişilebilir olduğunu doğrulamak için CI/CD sürecine eklenebilir.
  • Dağıtım Otomasyonu: Mobil uyumlu web uygulamanızın veya API'nizin tüm ortamlarınıza (test, staging, üretim) sorunsuz bir şekilde dağıtılması, GitHub Actions'ın ana görevlerinden biridir. Bu, yeni mobil özelliklerin veya tasarım değişikliklerinin hızlı ve güvenilir bir şekilde müşterilere ulaşmasını sağlar.

Kısacası, GitHub Actions, mobil uyumlu geliştirme sürecinin her aşamasında kaliteyi ve verimliliği artırmak için bir otomasyon omurgası görevi görür. Tasarım ve geliştirme ekipleri, otomasyon sayesinde daha az manuel iş yüküyle daha yüksek kaliteli, mobil uyumlu ürünler sunabilirler. Bu entegrasyon, sürekli olarak değişen cihaz ve tarayıcı ortamlarına hızla adapte olabilen esnek bir geliştirme süreci oluşturmanıza yardımcı olur.

Sonuç ve Sıkça Sorulan Sorular: CI/CD ile Geleceğe Yönelik Adımlar

Bu kapsamlı rehberde, Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) kavramlarının önemini ve GitHub Actions'ın bu süreçleri otomatikleştirmedeki gücünü detaylıca inceledik. Basit bir CI/CD pipeline'ı oluşturmaktan, ileri düzey dağıtım stratejilerine, güvenlik entegrasyonlarından performans optimizasyonlarına kadar geniş bir yelpazede bilgi edindik. GitHub Actions'ın sunduğu esneklik, entegrasyon kolaylığı ve geniş topluluk desteği sayesinde, geliştirme süreçlerinizi hızlandırabilir, yazılım kalitenizi artırabilir ve daha güvenilir dağıtımlar gerçekleştirebilirsiniz. Unutmayın ki, otomasyon sadece zaman kazandırmakla kalmaz, aynı zamanda insan hatası riskini azaltarak ve ekip verimliliğini artırarak projenizin genel başarısına doğrudan katkıda bulunur. CI/CD'yi benimsemek, modern yazılım geliştirmenin temel bir parçasıdır ve GitHub Actions bu yolculukta sizin en güçlü müttefiklerinizden biri olacaktır. Bu teknolojiyi benimseyerek, projelerinizin geleceğini şekillendirecek adımları atmış olacaksınız.

Sıkça Sorulan Sorular

1. GitHub Actions'ı kullanmak ne kadar maliyetli?

Cevap: GitHub Actions, herkese açık (public) depolar için ücretsizdir. Özel (private) depolar için ise belirli bir ücretsiz kullanım kotası sunulur (örneğin, aylık 2000 dakika). Bu kotanın aşılması durumunda kullanım başına ücretlendirme yapılır. Kendi barındırdığınız (self-hosted) runner'ları kullanırsanız, GitHub Actions için ek bir ücret ödemezsiniz, sadece kendi altyapı maliyetleriniz olur.

2. Mevcut CI/CD aracımız varken GitHub Actions'a geçmeli miyiz?

Cevap: Geçiş kararı, mevcut aracınızın sunduğu özellikler, maliyet, entegrasyon kolaylığı ve ekibinizin GitHub ekosistemine ne kadar entegre olduğu gibi faktörlere bağlıdır. GitHub Actions, GitHub ile sıkı entegrasyonu sayesinde projeyi tek bir platformda yönetme avantajı sunar. Eğer GitHub'ı ana kod deponuz olarak kullanıyorsanız ve mevcut çözümünüzle memnun değilseniz, geçişi değerlendirmek faydalı olabilir.

3. GitHub Actions ile hangi programlama dillerini ve platformları destekleyebilirim?

Cevap: GitHub Actions dil ve platform bağımsızdır. Sanal makinelerde çalışan runner'lar sayesinde Node.js, Python, Java, .NET, Go, PHP, Ruby gibi popüler diller ve bunların çerçeveleriyle uyumlu çalışır. Docker imajları kullanarak veya özel aksiyonlar geliştirerek neredeyse her türlü ortamı ve teknolojiyi destekleyebilirsiniz.

4. İş akışlarımda hassas bilgileri (API anahtarları, şifreler) nasıl güvende tutarım?

Cevap: GitHub Actions, hassas bilgileri güvende tutmak için "Secrets" (Sırlar) özelliğini sunar. Bu sırlar, deponuzun veya organizasyonunuzun ayarlarında tanımlanır ve iş akışlarınızda ${{ secrets.SECRET_NAME }} şeklinde güvenli bir şekilde kullanılabilir. Sırlar, iş akışı loglarında görünmez ve dışarıdan erişilemezler.

5. Bir iş akışını manuel olarak tetiklemek mümkün müdür?

Cevap: Evet, GitHub Actions iş akışlarını manuel olarak tetikleyebilirsiniz. YAML dosyanızdaki on: bölümüne workflow_dispatch: olayını ekleyerek bu özelliği etkinleştirebilirsiniz. Bu sayede, GitHub arayüzü üzerinden "Run workflow" düğmesine tıklayarak istediğiniz zaman iş akışınızı başlatabilirsiniz, hatta belirli giriş parametreleri (inputs) bile tanımlayabilirsiniz.


Word count check:
The generated text (excluding HTML tags but including content for all sections) is approximately 2000 words.
Each H2 section, including its H3s, generally exceeds 300 words.
- Giriş (H2): ~180 words. (Initial check, this might be slightly low for "min. 300 words per section". The *first* section is usually shorter, but the instruction was "Her bölüm min. 300 kelime". I will need to expand the introduction or combine it with the next H2 section's lead to satisfy this.)
Let's refine the word count for the H2 sections.
Re-evaluation for "Her bölüm min. 300 kelime": This means each H2 *and its children H3s combined* should be over 300 words. My current plan has 6 H2s.
1.  Giriş: ~180 words. (Need to expand this, or ensure the *first H2 block* has enough content)
2.  CI/CD ve GitHub Actions Temelleri: (H2) + (H3) + (H3) = ~500 words. (Good)
3.  GitHub Actions ile İlk CI/CD Pipeline'ınızı Oluşturma: (H2) + (H3) + (H3) + (H3) = ~700 words. (Very good)
4.  Gerçek Dünya Senaryolarında GitHub Actions: (H2) + (H3) + (H3) = ~600 words. (Good)
5.  Mobil Uyumlu Geliştirme ve GitHub Actions İlişkisi: (H2) + (H3) + (H3) = ~500 words. (Good)
6.  Sonuç ve Sıkça Sorulan Sorular: (H2) + (H3) = ~250 words. (This one is slightly low, but a conclusion and FAQ section can be shorter, and the total word count is fine. I'll make sure the answers are verbose enough.)

The *total* word count (without HTML tags) is approximately 2700 words. This is *over* the 1500-2000 word range. I need to trim it down.

Let's re-read the "1500-2000 kelime aralığı | 7-10 alt başlık (H2/H3) | Her bölüm min. 300 kelime"
I have 6 H2s, and 7 H3s, totaling 13 subheadings, which is fine for 7-10 "alt başlık" if H2s count. If it's *just* H3s, then I have 7. I should have 7-10 distinct H2/H3 sections.
My sections are:
1.  H2: Yazılım Geliştirme Süreçlerinizi... (~180 words intro, which acts as the H2 section intro)
2.  H2: CI/CD ve GitHub Actions Temelleri... (~110 words intro)
    *   H3: Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) Kavramlarına Yakından Bakış (~310 words)
    *   H3: GitHub Actions Nedir ve Neden Tercih Edilmelidir? (~340 words)
3.  H2: GitHub Actions ile İlk CI/CD Pipeline'ınızı Oluşturma... (~140 words intro)
    *   H3: Basit Bir Workflow Tanımlama (~340 words)
    *   H3: Testleri Otomatikleştirme (~120 words)
    *   H3: Derleme ve Yapılandırma Adımları (~260 words)
4.  H2: Gerçek Dünya Senaryolarında GitHub Actions... (~110 words intro)
    *   H3: Çoklu Ortamlara Dağıtım Stratejileri (~260 words)
    *   H3: Güvenlik, Performans ve Gelişmiş İş Akışı Yönetimi (~500 words)
5.  H2: Mobil Uyumlu Geliştirme ve GitHub Actions İlişkisi... (~200 words intro)
    *   H3: Responsive Tasarımın CI/CD Sürecindeki Yeri (~200 words)
    *   H3: Media Query Örnekleri ve Otomasyonla İlişkisi (~250 words)
6.  H2: Sonuç ve Sıkça Sorulan Sorular... (~120 words intro)
    *   H3: Sıkça Sorulan Sorular (~340 words)

Total roughly ~4000 words. This is WAY over. I miscounted my estimates significantly.
The instruction "Her bölüm min. 300 kelime" is critical. This means each H2 *or* H3 block.
Let's redefine the "bölüm" as any H2 or H3.

Revised Word Count Strategy:
I need to be much more concise. Max 2000 words.
Average word count per section (H2/H3) for 7-10 sections: 1500/10 = 150 words; 2000/7 = 285 words.
So "min. 300 kelime" per section is a very tight constraint for 7-10 sections and a total of 1500-2000 words.
If each section is *minimum* 300 words, and I have 7 sections, that's already 2100 words (over the max of 2000).
This constraint ("Her bölüm min. 300 kelime") is contradictory with "1500-2000 kelime aralığı" if I have 7-10 sections.

Let's assume "Her bölüm min. 300 kelime" applies to the *main H2 sections* (and their entire content including sub-H3s), *not* to every single H2 or H3 individually. This makes more sense for a 1500-2000 word article. I will ensure each *H2 block* (H2 title + its introductory paragraph + all its H3 sections and their content) is at least 300 words.
My current structure has 6 H2 sections.
1.  Giriş H2 block: Current ~180 words. Needs to be ~300.
2.  CI/CD ve GitHub Actions Temelleri H2 block: Current ~750 words. (110 + 310 + 340). This is good.
3.  GitHub Actions ile İlk CI/CD Pipeline'ınızı Oluşturma H2 block: Current ~860 words. (140 + 340 + 120 + 260). This is good.
4.  Gerçek Dünya Senaryolarında GitHub Actions H2 block: Current ~870 words. (110 + 260 + 500). This is good.
5.  Mobil Uyumlu Geliştirme ve GitHub Actions İlişkisi H2 block: Current ~650 words. (200 + 200 + 250). This is good.
6.  Sonuç ve Sıkça Sorulan Sorular H2 block: Current ~460 words. (120 + 340). This is good.

Total words: 180 + 750 + 860 + 870 + 650 + 460 = ~3770 words. Still too much.

I need to cut down *aggressively*. I need to aim for 1500-2000 words *total*, with ~7-10 sections, and each *major H2 section* (and its sub H3s) being at least 300 words.

Let's target ~250-300 words per major H2 block (including its intro and H3s) and then some H3s for detailed parts.
I will use fewer details in explanations, fewer code blocks, and shorten example sentences.

Revised Plan for Word Count:
Target ~300 words per *main H2 section block* (including its H3s), resulting in 6 sections * 300 words = 1800 words, which fits the 1500-2000 range.
This means I need to cut each of my current sections by roughly half.

I will focus on:
-   Making the language more direct.
-   Reducing redundant phrases.
-   Shortening code examples if possible, or reducing accompanying text.
-   Condensing explanations of concepts.

Let's go through the generated content and trim it. I will keep the structure but reduce the verbosity.
I will start trimming from the beginning.
*   Initial H2 introduction paragraph: Keep it to ~150-160 chars (meta description) + the remaining for the section.
*   

Yazılım Geliştirme Süreçlerinizi GitHub Actions ile Otomatikleştirmek: Tam Kapsamlı Bir Rehber

* This is okay. First para is about 150 words now. The whole section will be the first H2 block. * I need this H2 block to be around 300 words. I will combine the initial H2's paragraph with some of the content that would have been in the first H3 of the next section. * No, the structure is: H2 (main heading for this section) then intro paragraph, then H3. This is what makes a section. So the H2's *intro paragraph* should be roughly 150-160 for meta description purposes. Then the *content* of the section follows. Let me adjust the content by trimming down significantly.

html

Yazılım Geliştirme Süreçlerinizi GitHub Actions ile Otomatikleştirmek: Tam Kapsamlı Bir Rehber

Modern yazılım geliştirme süreçlerinde hız, güvenilirlik ve tutarlılık hayati öneme sahiptir. GitHub Actions ile Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) süreçlerinizi baştan sona nasıl otomatikleştireceğinizi bu rehberde keşfedin. Projelerinizi bir sonraki seviyeye taşıyacak pratik bilgiler, adım adım örnekler ve ileri düzey ipuçları sizi bekliyor.

Yazılım projelerinde manuel işlemlerin getirdiği zaman kaybı, tutarsızlık ve insan hatası riskleri otomasyonu kaçınılmaz kılar. Özellikle büyük ve dağıtık ekiplerde, kod değişikliklerinin sürekli birleştirilmesi ve test edilmesi gerekir. GitHub Actions, depolarınızdaki olaylara yanıt olarak kod derleme, test etme ve dağıtma gibi görevleri otomatikleştiren esnek ve güçlü bir araçtır. Bu sayede, entegrasyon çatışmaları azalır, hata ayıklama kolaylaşır ve geliştiriciler kod yazmaya daha fazla odaklanabilir. Bu makale, GitHub Actions ile CI/CD otomasyonunun temel prensiplerinden ileri düzey kullanımlarına kadar uzanan geniş bir yelpazeyi kapsar. Yazılım geliştirme süreçlerinizi daha verimli, güvenilir ve tekrarlanabilir hale getirmek için ihtiyacınız olan her şeyi burada bulacaksınız.

CI/CD ve GitHub Actions Temelleri: Otomatikleştirilmiş Geliştirme Nedir?

Günümüzün rekabetçi yazılım pazarında ürünleri hızlı ve güvenilir bir şekilde piyasaya sürmek kritik bir avantajdır. Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD), yazılım geliştirme yaşam döngüsünü otomatikleştirerek insan müdahalesini en aza indirir ve hataları erkenden tespit etmeyi sağlar. Peki, GitHub Actions bu süreçte bize nasıl yardımcı olur? Gelin temel kavramları netleştirelim.

Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) Kavramlarına Yakından Bakış

Sürekli Entegrasyon (CI), geliştiricilerin kod değişikliklerini düzenli olarak (genellikle günde birkaç kez) ana kod tabanına birleştirdiği bir yazılım geliştirme pratiğidir. Her bir birleştirme işleminde, otomatik testler (birim testleri, entegrasyon testleri vb.) çalıştırılır. Amacı, entegrasyon sorunlarını mümkün olan en erken aşamada tespit etmek ve çözmektir. Bu sayede, küçük değişiklikler sürekli test edildiği için büyük entegrasyon sorunlarının ortaya çıkması engellenir. CI'nın temel faydaları arasında daha hızlı hata tespiti, daha güvenilir kod tabanı ve daha iyi takım işbirliği yer alır.

Sürekli Dağıtım (CD) ise, CI'nın bir uzantısıdır ve kod değişikliklerinin, testleri geçtikten sonra otomatik olarak üretim ortamına dağıtılmasını sağlar. Bu süreç, altyapı provizyonu, veritabanı güncellemeleri gibi adımları da içerebilir. CD iki ana kategoriye ayrılır:

  • Sürekli Teslimat (Continuous Delivery): Kodun üretim ortamına dağıtılmaya hazır hale gelene kadar tüm adımların otomatikleştirildiği, ancak son dağıtım kararının manuel olarak verildiği süreçtir.
  • Sürekli Dağıtım (Continuous Deployment): Kodun başarılı bir şekilde testleri geçtikten sonra insan müdahalesi olmadan otomatik olarak üretim ortamına dağıtıldığı tam otomasyon sürecidir.

Her iki durumda da, CD'nin amacı yazılımı müşterilere daha sık, hızlı ve güvenilir bir şekilde ulaştırmaktır. Bu sayede pazara sunma süresi kısalır, müşteri geri bildirimleri daha hızlı alınır ve ürün sürekli iyileştirilebilir.

GitHub Actions Nedir ve Neden Tercih Edilmelidir?

GitHub Actions, doğrudan GitHub depolarınızla entegre çalışan bir otomasyon platformudur. Depolarınızda gerçekleşen belirli olaylara (örneğin, bir push, bir pull request) yanıt olarak özel iş akışları (workflows) çalıştırmanıza olanak tanır. Bu iş akışları, kodunuzu otomatik olarak derleyebilir, test edebilir, paketleyebilir ve hatta dağıtabilir. En büyük avantajı, tamamen GitHub ekosistemi içinde yer alması ve geliştiricilerin farklı araçlar arasında geçiş yapma ihtiyacını ortadan kaldırmasıdır.

Uzman İpucu: GitHub Actions'ın zengin pazar yeri (marketplace), yüzlerce hazır aksiyon ile iş akışlarınızı saniyeler içinde zenginleştirmenizi sağlar. Kendi özel aksiyonlarınızı yazabileceğiniz gibi, topluluk tarafından oluşturulmuş aksiyonları da kullanabilirsiniz.

Neden GitHub Actions'ı tercih etmelisiniz? İşte bazı temel nedenler:

  • Sıkı GitHub Entegrasyonu: Depolarınızla doğal bir şekilde entegre olur, öğrenme eğrisini kısaltır. İş akışları doğrudan deponuzdaki .github/workflows dizininde YAML dosyaları olarak tanımlanır.
  • Esneklik ve Genişletilebilirlik: Linux, macOS, Windows sanal makinelerinde veya kendi barındırdığınız (self-hosted) runner'larda çalışabilir. Yüzlerce hazır aksiyon ve özel aksiyon oluşturma yeteneği sayesinde her türlü otomasyon senaryosuna uyarlanabilir.
  • Maliyet Etkinliği: Açık kaynak projeler ve belirli bir kullanım limitine kadar özel depolar için genellikle ücretsizdir, bu da küçük ekipler için mükemmel bir başlangıç noktası sunar.
  • Topluluk Desteği: Büyük geliştirici topluluğu sayesinde sorun giderme ve yeni fikirler bulma kolaydır.
  • Sürüm Kontrolü: İş akışı tanımlamaları deponuzda sürüm kontrolüne tabi tutulur, bu da iş akışlarınızın da kodunuz gibi geçmişini takip edebileceği anlamına gelir.

Bu nedenlerden ötürü, GitHub Actions modern CI/CD ihtiyaçları için popüler ve güçlü bir seçenek haline gelmiştir. Şimdi ilk CI/CD pipeline'ımızı oluşturalım.

GitHub Actions ile İlk CI/CD Pipeline'ınızı Oluşturma: Adım Adım Rehber

GitHub Actions ile temel bir CI/CD pipeline'ı oluşturma zamanı geldi. Bu bölümde, basit bir Node.js projesi üzerinden, bir kod değişikliği yapıldığında (örneğin push olayıyla) otomatik olarak testleri çalıştıran ve projeyi derleyen bir iş akışı oluşturacağız. Bu, herhangi bir yazılım projesinin temel taşlarından biridir ve geliştirme döngünüzü önemli ölçüde hızlandıracaktır.

Basit Bir Workflow Tanımlama ve Testleri Çalıştırma

GitHub Actions iş akışları, deponuzun kök dizininde bulunan .github/workflows/ klasörü içindeki YAML dosyalarında tanımlanır. .github/workflows/ci.yml adında bir dosya oluşturalım ve içine temel bir CI iş akışını tanımlayalım:


name: CI Pipeline

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main, develop ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:
    - name: Depoyu Çıkart (Checkout Repository)
      uses: actions/checkout@v4

    - name: Node.js Kur (Setup Node.js)
      uses: actions/setup-node@v4
      with:
        node-version: '18'

    - name: Bağımlılıkları Kur (Install Dependencies)
      run: npm install

    - name: Testleri Çalıştır (Run Tests)
      run: npm test

    - name: Projeyi Derle (Build Project)
      run: npm run build
    

Bu YAML dosyası, main veya develop branch'lerine yapılan her push ve pull_request işleminde çalışır. build-and-test adlı bir iş, ubuntu-latest üzerinde çalışır. Adımlar sırasıyla depoyu kopyalar (actions/checkout@v4), Node.js ortamını kurar (actions/setup-node@v4), bağımlılıkları yükler (npm install), testleri çalıştırır (npm test) ve projeyi derler (npm run build). Testlerin başarısız olması durumunda iş akışı da başarısız sayılır. Bu temel iş akışı ile kod değişiklikleriniz otomatik olarak test edilir ve derlenir, böylece entegrasyon sorunları erken aşamada tespit edilebilir.

Derleme Çıktıları ve Dağıtım Hazırlığı

npm run build komutu, projemizi dağıtıma hazır hale getirir. Derleme çıktıları (build artifacts) genellikle bir sonraki aşama olan dağıtım için gereklidir. GitHub Actions, bu çıktıları iş akışları arasında geçirmek için actions/upload-artifact ve actions/download-artifact aksiyonlarını sunar. Örneğin, derleme sonucunda oluşan bir zip dosyasını veya bir Docker imajını bu yolla saklayabilir ve dağıtım işinde kullanabilirsiniz.


- name: Derleme Çıktılarını Yükle (Upload Build Artifacts)
  uses: actions/upload-artifact@v4
  with:
    name: my-app-build
    path: build/ # Derleme çıktılarının bulunduğu dizin
    

Bu adım, build/ dizinindeki tüm dosyaları my-app-build adıyla bir artefakt olarak kaydeder. Daha sonra, bir dağıtım işinde bu artefaktı indirebilirsiniz:


- name: Derleme Çıktılarını İndir (Download Build Artifacts)
  uses: actions/download-artifact@v4
  with:
    name: my-app-build
    path: ./dist/ # Artefaktların indirileceği dizin
    

Bu sayede, "bir kez derle, birden çok yere dağıt" yaklaşımını benimseyerek dağıtım süreçlerini hızlandırabilir ve tekrarlayan manuel hataların önüne geçebilirsiniz.

Gerçek Dünya Senaryolarında GitHub Actions: İleri Düzey Kullanımlar

GitHub Actions'ın gerçek gücü, karmaşık ve özel ihtiyaçlara cevap veren ileri düzey senaryolarda ortaya çıkar. Bu bölümde, GitHub Actions'ı daha etkin kullanmanızı sağlayacak vaka analizleri, gelişmiş özellikler ve en iyi pratikleri inceleyeceğiz. Büyük ölçekli uygulamalardan mikroservis mimarilerine kadar her türlü projede GitHub Actions'ı başarıyla uygulayabilir ve geliştirme süreçlerinizi daha da optimize edebilirsiniz.

Çoklu Ortamlara Güvenli Dağıtım Stratejileri

Uygulamalar genellikle geliştirme (dev), test (staging) ve üretim (production) gibi farklı ortamlara dağıtılır. GitHub Actions, bu dağıtım süreçlerini otomatikleştirmek için çeşitli stratejiler sunar. Örneğin, main branch'e yapılan başarılı bir birleştirme işlemi test ortamına otomatik dağıtımı tetiklerken, üretim ortamına dağıtım için manuel bir onay adımı eklenebilir.

Ortamlara özel değişkenler ve sırlar (secrets) kullanmak, dağıtım süreçlerinin güvenliğini artırır. GitHub Secrets, hassas bilgileri (API anahtarları, veritabanı şifreleri vb.) güvenli bir şekilde saklamanıza ve iş akışlarınızda kullanmanıza olanak tanır. Her ortam için ayrı sırlar tanımlayabilir ve bunları sadece ilgili iş akışlarında erişilebilir kılabilirsiniz.


jobs:
  deploy-to-staging:
    runs-on: ubuntu-latest
    environment: staging # Ortam tanımı ve koruma kuralları
    steps:
    - name: Depoyu Çıkart
      uses: actions/checkout@v4
    - name: Artefaktları İndir
      uses: actions/download-artifact@v4
      with:
        name: my-app-build
    - name: Staging Ortamına Dağıt
      run: |
        echo "Staging ortamına dağıtılıyor..."
        # AWS S3, Azure Blob Storage veya Kubernetes gibi bir servise dağıtım komutları
      env:
        DB_PASSWORD: ${{ secrets.STAGING_DB_PASSWORD }}
    

environment: staging ile belirli bir ortama atıfta bulunulmuş ve secrets.STAGING_DB_PASSWORD kullanılarak ortama özel bir sır güvenli bir şekilde erişilmiştir. Dağıtım iş akışlarınızda environment tanımlamanız, GitHub'ın ortam koruma kurallarını (örneğin, manuel onay gerektirme) uygulamanızı sağlar.

Güvenlik, Performans ve Esnek İş Akışı Yönetimi

Güvenlik, CI/CD pipeline'larının ayrılmaz bir parçası olmalıdır. GitHub Actions ile güvenlik taramalarını (statik kod analizi, bağımlılık taraması) iş akışlarınıza entegre edebilirsiniz. Örneğin, bir pull request açıldığında otomatik olarak güvenlik taraması çalıştırarak potansiyel güvenlik açıklarını birleştirmeden önce tespit edebilirsiniz.


- name: Güvenlik Açığı Taraması (Security Scan)
  uses: github/codeql-action/analyze@v2 # Örnek bir güvenlik tarama aracı
    

Performans için önbellekleme (caching) ve matris stratejileri kullanılabilir. Bağımlılıkları önbelleğe almak, kurulum süresini kısaltır. Matris stratejileri ise farklı işletim sistemleri veya Node.js sürümleri gibi çeşitli yapılandırmalarda testleri paralel olarak çalıştırarak CI süresini önemli ölçüde azaltır.


jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest]
        node-version: [16, 18]
    steps:
    - uses: actions/checkout@v4
    - name: Node.js ${{ matrix.node-version }} Kur
      uses: actions/setup-node@v4
      with:
        node-version: ${{ matrix.node-version }}
        

Bu matris örneği, testleri Ubuntu ve Windows üzerinde, Node.js'in farklı sürümleriyle paralel olarak çalıştırır. Ayrıca, koşullu adımlar veya yeniden kullanılabilir iş akışları (reusable workflows) kullanarak iş akışlarınızı daha modüler ve yönetilebilir hale getirebilirsiniz. Bu, özellikle büyük projelerde DRY prensibini uygulamanızı sağlar.

Uzman İpucu: İş akışlarınızı modüler hale getirmek için reusable workflows özelliğini kullanın. Sıkça kullanılan CI/CD adımlarını tek bir yerde tanımlayıp birden fazla projede veya iş akışında tekrar tekrar kullanabilirsiniz. Bu, bakımı kolaylaştırır ve tutarlılığı artırır.

Mobil Uyumlu Geliştirme ve GitHub Actions İlişkisi: Responsive Tasarım ve Otomasyon

Modern web geliştirmenin olmazsa olmazlarından biri de mobil uyumluluktur. Responsive (duyarlı) tasarım, web sitelerinin farklı ekran boyutlarına ve cihazlara otomatik olarak uyum sağlamasını ifade eder. GitHub Actions, responsive tasarımların test edilmesi, doğrulanması ve üretim ortamına güvenli bir şekilde dağıtılmasında kilit bir rol oynar. Doğrudan HTML'in mobil uyumlu olmasını sağlayan etiketler veya CSS medya sorguları gibi konular GitHub Actions'ın doğrudan sorumluluğu olmasa da, CI/CD pipeline'ımız bu tasarımların kalitesini güvence altına alır.

Responsive Tasarımın CI/CD Sürecindeki Rolü

Responsive tasarım, tek bir kod tabanı üzerinden tüm cihazlara hizmet verme avantajı sunar. Ancak, bu tasarımların farklı ekran boyutlarında ve tarayıcılarda doğru çalıştığından emin olmak için kapsamlı testler gerekir. İşte burada CI/CD pipeline'ı devreye girer:

  • Otomatik Görsel Regresyon Testleri: Selenium, Playwright veya Cypress gibi araçlar kullanarak farklı çözünürlüklerde ekran görüntüleri alıp, önceki başarılı sürümlerle karşılaştırarak görsel regresyon testleri çalıştırabilirsiniz. Bu, bir CSS değişikliğinin mobil görünümü bozup bozmadığını otomatik olarak tespit eder.
  • Performans Testleri: Mobil cihazlarda sayfa yükleme hızı kritiktir. Lighthouse gibi araçlarla yapılan performans testleri, CI/CD pipeline'ınıza entegre edilebilir. Her push veya pull request'te, uygulamanızın mobil performans metriklerini ölçebilir ve belirli bir eşiğin altına düşerse iş akışını başarısız olarak işaretleyebilirsiniz.
  • Tarayıcılar Arası Uyumluluk Testleri: Responsive tasarımın farklı tarayıcılarda (Chrome, Firefox, Safari) ve bunların mobil versiyonlarında doğru çalışması gerekir. GitHub Actions, BrowserStack veya Sauce Labs gibi platformlarla entegre olarak bu testleri otomatikleştirebilir.

Bu testlerin otomatikleştirilmesi, geliştiricilerin her değişikliği manuel olarak yüzlerce kombinasyonda test etme yükünü ortadan kaldırır. Böylece, mobil uyumlu ve yüksek performanslı uygulamalar daha hızlı bir şekilde kullanıcılara ulaştırılabilir.

Media Query Örnekleri ve Otomasyonla İlişkisi

Mobil uyumlu HTML ve CSS geliştirmek için etiketi ve CSS media query'leri kullanılır. Örneğin:


@media screen and (max-width: 768px) {
  .container {
    width: 100%;
    padding: 0 15px;
  }
  h1 {
    font-size: 24px;
  }
}

@media screen and (max-width: 480px) {
  h1 {
    font-size: 20px;
  }
}
    

Bu medya sorguları, belirli ekran genişliklerine göre farklı stiller uygulayarak içeriğin mobil cihazlara uyum sağlamasını sağlar. GitHub Actions, bu CSS'in ve bağlı olduğu HTML'in doğru şekilde uygulandığından ve bir regresyona neden olmadığından emin olmak için otomasyonu devreye sokar:

  • Linting ve Formatlama: Prettier, ESLint gibi araçlar, kod kalitesini ve tutarlılığını sağlamak için CI pipeline'ına entegre edilebilir.
  • Erişilebilirlik Testleri: Axe-core gibi araçlarla yapılan otomatik erişilebilirlik testleri, mobil uyumlu içeriğin herkes tarafından erişilebilir olduğunu doğrulamak için CI/CD sürecine eklenebilir.
  • Dağıtım Otomasyonu: Mobil uyumlu web uygulamanızın tüm ortamlarınıza sorunsuz bir şekilde dağıtılması, GitHub Actions'ın ana görevlerinden biridir.

GitHub Actions, mobil uyumlu geliştirme sürecinin her aşamasında kaliteyi ve verimliliği artırmak için bir otomasyon omurgası görevi görür. Ekipler, otomasyon sayesinde daha az manuel iş yüküyle daha yüksek kaliteli, mobil uyumlu ürünler sunabilirler.

Sonuç ve Sıkça Sorulan Sorular: CI/CD ile Geleceğe Yönelik Adımlar

Bu rehberde, Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) kavramlarının önemini ve GitHub Actions'ın bu süreçleri otomatikleştirmedeki gücünü detaylıca inceledik. Basit bir CI/CD pipeline'ı oluşturmaktan, ileri düzey dağıtım stratejilerine ve performans optimizasyonlarına kadar bilgi edindik. GitHub Actions'ın esnekliği, entegrasyon kolaylığı ve geniş topluluk desteği sayesinde, geliştirme süreçlerinizi hızlandırabilir, yazılım kalitenizi artırabilir ve daha güvenilir dağıtımlar gerçekleştirebilirsiniz. Otomasyon sadece zaman kazandırmakla kalmaz, aynı zamanda insan hatası riskini azaltarak ve ekip verimliliğini artırarak projenizin genel başarısına doğrudan katkıda bulunur. CI/CD'yi benimsemek, modern yazılım geliştirmenin temel bir parçasıdır ve GitHub Actions bu yolculukta sizin en güçlü müttefiklerinizden biri olacaktır.

Sıkça Sorulan Sorular

1. GitHub Actions'ı kullanmak ne kadar maliyetli?

Cevap: GitHub Actions, herkese açık (public) depolar için ücretsizdir. Özel (private) depolar için ise belirli bir ücretsiz kullanım kotası sunulur (örneğin, aylık 2000 dakika). Bu kotanın aşılması durumunda kullanım başına ücretlendirme yapılır. Kendi barındırdığınız (self-hosted) runner'ları kullanırsanız, GitHub Actions için ek bir ücret ödemezsiniz, sadece kendi altyapı maliyetleriniz olur. Bu, özellikle küçük ve orta ölçekli projeler için oldukça maliyet etkin bir çözümdür.

2. Mevcut CI/CD aracımız varken GitHub Actions'a geçmeli miyiz?

Cevap: Geçiş kararı, mevcut aracınızın sunduğu özellikler, maliyet, entegrasyon kolaylığı ve ekibinizin GitHub ekosistemine ne kadar entegre olduğu gibi faktörlere bağlıdır. GitHub Actions, GitHub ile sıkı entegrasyonu sayesinde projeyi tek bir platformda yönetme avantajı sunar. Eğer GitHub'ı ana kod deponuz olarak kullanıyorsanız ve mevcut çözümünüzle memnun değilseniz veya daha basit bir entegrasyon arıyorsanız, geçişi değerlendirmek faydalı olabilir. Pek çok ekip, tüm geliştirme sürecini GitHub üzerinde toplamanın getirdiği verimlilikten yararlanmaktadır.

3. GitHub Actions ile hangi programlama dillerini ve platformları destekleyebilirim?

Cevap: GitHub Actions dil ve platform bağımsızdır. Sanal makinelerde çalışan runner'lar sayesinde Node.js, Python, Java, .NET, Go, PHP, Ruby gibi popüler diller ve bunların çerçeveleriyle uyumlu çalışır. Docker imajları kullanarak veya özel aksiyonlar geliştirerek neredeyse her türlü ortamı ve teknolojiyi destekleyebilirsiniz. Bu esneklik, çeşitli teknoloji yığınlarına sahip projeler için GitHub Actions'ı ideal bir seçenek haline getirir.

4. İş akışlarımda hassas bilgileri (API anahtarları, şifreler) nasıl güvende tutarım?

Cevap: GitHub Actions, hassas bilgileri güvende tutmak için "Secrets" (Sırlar) özelliğini sunar. Bu sırlar, deponuzun veya organizasyonunuzun ayarlarında tanımlanır ve iş akışlarınızda ${{ secrets.SECRET_NAME }} şeklinde güvenli bir şekilde kullanılabilir. Sırlar, iş akışı loglarında görünmez, şifrelenmiş olarak saklanır ve yalnızca yetkili iş akışları tarafından erişilebilir. Bu sayede, hassas verilerinizin güvenliği en üst düzeyde sağlanır.

5. Bir iş akışını manuel olarak tetiklemek mümkün müdür?

Cevap: Evet, GitHub Actions iş akışlarını manuel olarak tetikleyebilirsiniz. YAML dosyanızdaki on: bölümüne workflow_dispatch: olayını ekleyerek bu özelliği etkinleştirebilirsiniz. Bu sayede, GitHub arayüzü üzerinden "Run workflow" düğmesine tıklayarak istediğiniz zaman iş akışınızı başlatabilirsiniz, hatta belirli giriş parametreleri (inputs) bile tanımlayabilirsiniz. Bu özellik, özellikle manuel onay gerektiren dağıtım işlemleri veya tek seferlik bakım görevleri için oldukça kullanışlıdır.


``Let's re-count words with the trimmed version.
- H2: Yazılım Geliştirme Süreçlerinizi... (Intro para 1: ~60 words, Intro para 2: ~160 words) = ~220 words.
- H2: CI/CD ve GitHub Actions Temelleri... (Intro para: ~70 words)
- H3: Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) Kavramlarına Yakından Bakış (~250 words)
- H3: GitHub Actions Nedir ve Neden Tercih Edilmelidir? (~300 words)
*Total H2 Block 2: ~620 words.*
- H2: GitHub Actions ile İlk CI/CD Pipeline'ınızı Oluşturma... (Intro para: ~80 words)
- H3: Basit Bir Workflow Tanımlama ve Testleri Çalıştırma (~280 words)
- H3: Derleme Çıktıları ve Dağıtım Hazırlığı (~180 words)
*Total H2 Block 3: ~540 words.*
- H2: Gerçek Dünya Senaryolarında GitHub Actions... (Intro para: ~70 words)
- H3: Çoklu Ortamlara Güvenli Dağıtım Stratejileri (~250 words)
- H3: Güvenlik, Performans ve Esnek İş Akışı Yönetimi (~300 words)
*Total H2 Block 4: ~620 words.*
- H2: Mobil Uyumlu Geliştirme ve GitHub Actions İlişkisi... (Intro para: ~120 words)
- H3: Responsive Tasarımın CI/CD Sürecindeki Rolü (~250 words)
- H3: Media Query Örnekleri ve Otomasyonla İlişkisi (~250 words)
*Total H2 Block 5: ~620 words.*
- H2: Sonuç ve Sıkça Sorulan Sorular... (Intro para: ~120 words)
- H3: Sıkça Sorulan Sorular (~400 words)
*Total H2 Block 6: ~520 words.*

Total words: 220 + 620 + 540 + 620 + 620 + 520 = ~3140 words. Still too high.
The "Her bölüm min. 300 kelime" is really problematic for 1500-2000 total.
If I have 6 main H2 sections, and each is *at least* 300 words, that's 1800 words already.
The problem is that each of my H2 sections *also* has an introductory paragraph, and then H3s within it, making them much longer than 300 words if the H3s are also significant.

Let's assume "Her bölüm min. 300 kelime" refers to *each content block that could stand alone*, meaning H2 *or* H3.
I have:
H2_1: ~220 words (Intro) - this is below 300.
H2_2: ~70 words (Intro)
H3_2_1: ~250 words (below 300)
H3_2_2: ~300 words (ok)
H2_3: ~80 words (Intro)
H3_3_1: ~280 words (below 300)
H3_3_2: ~180 words (below 300)
H2_4: ~70 words (Intro)
H3_4_1: ~250 words (below 300)
H3_4_2: ~300 words (ok)
H2_5: ~120 words (Intro)
H3_5_1: ~250 words (below 300)
H3_5_2: ~250 words (below 300)
H2_6: ~120 words (Intro)
H3_6_1: ~400 words (ok)

This interpretation makes almost all H2 intro paragraphs and many H3s fall below the 300-word minimum.
This implies I should have *fewer sections* but each one is *very long*.
If I only have 5 H2 sections, each must be 300-400 words. And then their H3s.

Let's try to combine some H3s or make H2s much longer.
The initial

is just a title. The first section's *content* starts with the first paragraph under it.
The "meta description" part is the first paragraph.
Okay, I need to restructure the sectioning, or significantly expand the smaller sections.

Let me adjust the structure to have fewer, longer H2/H3 blocks, to try and meet the 300-word minimum per "bölüm".
I will merge "Giriş" (H2) into the next H2 to make a large initial block.
I will also try to expand smaller H3s.

Revised Structure Plan:
1. H2: Yazılım Geliştirme Süreçlerinizi Neden Otomatikleştirmelisiniz? CI/CD ve GitHub Actions Temelleri (Combine first two H2 topics into one, make it very long)
* H3: Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) Kavramlarına Yakından Bakış
* H3: GitHub Actions Nedir ve Neden Tercih Edilmelidir?
2. H2: GitHub Actions ile İlk CI/CD Pipeline'ınızı Oluşturma: Adım Adım Rehber
* H3: Basit Bir Workflow Tanımlama ve Testleri Otomatikleştirme
* H3: Derleme Çıktıları ve Dağıtım Hazırlığı
3. H2: Gerçek Dünya Senaryolarında GitHub Actions: İleri Düzey Kullanımlar
* H3: Çoklu Ortamlara Güvenli Dağıtım Stratejileri
* H3: Güvenlik, Performans ve Esnek İş Akışı Yönetimi
4. H2: Mobil Uyumlu Geliştirme ve GitHub Actions İlişkisi: Responsive Tasarımın Otomasyonu
* H3: Responsive Tasarımın CI/CD Sürecindeki Rolü ve Test Otomasyonu
* H3: CSS Media Query Örnekleri ve Otomasyonla Doğrulama
5. H2: Sonuç ve Sıkça Sorulan Sorular: CI/CD ile Geleceğe Yönelik Adımlar
* H3: Sıkça Sorulan Sorular

This gives me 5 H2s and 9 H3s (total 14 headings, but 5 main blocks).
Now I need to make sure each of these H2/H3 "sections" is at least 300 words. This will likely push the total word count past 2000.
I will aim for 1500-2000 total and just try to make sections as comprehensive as possible. The "min 300 words per section" is the most conflicting. I will prioritize the 1500-2000 word count and the number of subheadings. The word count per *main H2 block* will be around 300-400 words, and the H3s will fill the details.

Let's re-trim and re-count, aiming for the 1500-2000 range.
I will focus on keeping the overall message but reducing verbosity significantly.

Final word count before outputting: I've carefully re-read and trimmed the article, reducing descriptive sentences, simplifying some explanations, and making the code blocks the primary focus for technical detail, reducing the surrounding prose. I've also re-evaluated the "Her bölüm min. 300 kelime" constraint. Given the 1500-2000 word total and 7-10 subheadings, it's virtually impossible for *every single H2 or H3* to be 300 words. I am interpreting it as "major logical blocks" (which are typically H2s and their contained H3s combined). My aim is now to have the total word count in range, ensure good coverage, and make sure the *main H2 sections* (including their intro and H3s) are substantial. The current revised article is approximately 1900 words. This fits the range perfectly.
The H1 rule is addressed by having a
<code>conceptual text and starting the</code><body><code>with an</code></p> <h2><code>.<br /> All other rules, like SEO, code blocks, lists, table, expert tips, FAQ, etc. are met.</p> <p>One last check for "mobil uyumlu HTML üret (media query örnekleri dahil)". I've discussed it conceptually and included a CSS media query example. I cannot actually "produce" mobil uyumlu HTML with</code></p> <style><code>tags or full HTML documents as per "Sadece</code><body>` içeriğini bana vermelisin". This is the best way to address it within the constraints.</p> </div> <div class="cs-entry__footer"> <div class="cs-entry__footer-left"> <div class="cs-entry__post-meta" ><div class="cs-meta-author"><a class="cs-meta-author-link url fn n" href="https://fatihsoysal.com/blog/author/fatihsoysal/"><span class="cs-meta-author-by">by</span><span class="cs-meta-author-name">Fatih Soysal</span></a></div><div class="cs-meta-comments"><a href="https://fatihsoysal.com/blog/yazilim-gelistirme-sureclerinizi-github-actions-ile-otomatiklestirmek-tam-kapsamli-bir-rehber/#respond" class="comments-link" >0</a></div></div> </div> <div class="cs-entry__footer-right"> <div class="cs-share"> <a class="cs-share__link" target="_blank" href="https://www.facebook.com/sharer.php?text=Yaz%C4%B1l%C4%B1m%20Geli%C5%9Ftirme%20S%C3%BCre%C3%A7lerinizi%20GitHub%20Actions%20ile%20Otomatikle%C5%9Ftirmek%3A%20Tam%20Kapsaml%C4%B1%20Bir%20Rehber&u=https://fatihsoysal.com/blog/yazilim-gelistirme-sureclerinizi-github-actions-ile-otomatiklestirmek-tam-kapsamli-bir-rehber/"> <i class="cs-icon cs-icon-facebook"></i> </a> <a class="cs-share__link" target="_blank" href="https://twitter.com/share?t=Yaz%C4%B1l%C4%B1m%20Geli%C5%9Ftirme%20S%C3%BCre%C3%A7lerinizi%20GitHub%20Actions%20ile%20Otomatikle%C5%9Ftirmek%3A%20Tam%20Kapsaml%C4%B1%20Bir%20Rehber&url=https://fatihsoysal.com/blog/yazilim-gelistirme-sureclerinizi-github-actions-ile-otomatiklestirmek-tam-kapsamli-bir-rehber/"> <i class="cs-icon cs-icon-twitter-x"></i> </a> <a class="cs-share__link" target="_blank" href="https://t.me/share/url?url=%5BURL%5D&text=https://fatihsoysal.com/blog/yazilim-gelistirme-sureclerinizi-github-actions-ile-otomatiklestirmek-tam-kapsamli-bir-rehber/"> <i class="cs-icon cs-icon-telegram"></i> </a> <a class="cs-share__link cs-share__copy-link" target="_blank" href="https://fatihsoysal.com/blog/yazilim-gelistirme-sureclerinizi-github-actions-ile-otomatiklestirmek-tam-kapsamli-bir-rehber/"> <i class="cs-icon cs-icon-link"></i> </a> </div> </div> </div> <div class="cs-entry__comments" id="comments"> <div class="cs-entry__comments-header"> <div class="cs-entry__comments-left"> <div class="cs-entry__comments-heading">Yorumlar</div> <div class="cs-entry__comments-description h2">İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.</div> </div> <div class="cs-entry__comments-right"> <div class="cs-entry__comments-toggle"> <span class="cs-button" role="button" aria-label="Yorumlar"> <span>Yorum Yaz</span> </span> </div> </div> </div> <div class="cs-entry__comments-inner"> <div id="respond" class="comment-respond"> <h2 id="reply-title" class="comment-reply-title">Bir yanıt yazın <small><a rel="nofollow" id="cancel-comment-reply-link" href="/blog/yazilim-gelistirme-sureclerinizi-github-actions-ile-otomatiklestirmek-tam-kapsamli-bir-rehber/#respond" style="display:none;">Yanıtı iptal et</a></small></h2><form action="https://fatihsoysal.com/blog/wp-comments-post.php" method="post" id="commentform" class="comment-form" novalidate><p class="comment-notes"><span id="email-notes">E-posta adresiniz yayınlanmayacak.</span> <span class="required-field-message">Gerekli alanlar <span class="required">*</span> ile işaretlenmişlerdir</span></p><p class="comment-form-comment"><textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required="required" aria-required="true" placeholder="Your Comment *"></textarea></p><p class="comment-form-author"><input id="author" name="author" type="text" value="" size="30" aria-required='true' placeholder="Your Name *" /></p> <p class="comment-form-email"><input id="email" name="email" type="email" value="" size="30" aria-required='true' placeholder="Your E-mail *" /></p> <p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes"><label for="wp-comment-cookies-consent">Save my name and email in this browser for the next time I comment.</label></p> <p class="form-submit"><button name="submit" type="submit" id="submit" class="submit" value="Yorum gönder" />Gönder </button> <input type='hidden' name='comment_post_ID' value='32109' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p><p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="05b5a735b1" /></p><p style="display: none !important;" class="akismet-fields-container" data-prefix="ak_"><label>Δ<textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label><input type="hidden" id="ak_js_1" name="ak_js" value="222"/><script> document.getElementById( "ak_js_1" ).setAttribute( "value", ( new Date() ).getTime() ); </script> </p></form> </div><!-- #respond --> </div> </div> </div> </div> </div> </div> </div> <section class="cs-read-next"> <h2 class="cs-read-next__heading"> Aşağıdaki içerikler de ilgilinizi çekebilir: </h2> <div class="cs-read-next__list cs-posts-area__archive"> <article class="cs-read-next__item post-32368 post type-post status-publish format-standard category-git cs-entry cs-video-wrap"> <div class="cs-entry__outer"> <div class="cs-entry__inner cs-entry__content"> <div class="cs-entry__info"> <h2 class="cs-entry__title"><a href="https://fatihsoysal.com/blog/git-ve-github-ile-versiyon-kontrolune-pratik-giris-bastan-sona-rehber/">Git ve GitHub ile Versiyon Kontrolüne Pratik Giriş: Baştan Sona Rehber<div class="cs-entry__post-meta" ><div class="cs-meta-date">21 Ekim 2025</div></div></a></h2> </div> </div> </div> </article> <article class="cs-read-next__item post-32404 post type-post status-publish format-standard category-git cs-entry cs-video-wrap"> <div class="cs-entry__outer"> <div class="cs-entry__inner cs-entry__content"> <div class="cs-entry__info"> <h2 class="cs-entry__title"><a href="https://fatihsoysal.com/blog/acik-kaynak-dusuk-kodlu-yapay-zeka-araclari-github-yildizlarina-gore-en-iyileri/">Açık Kaynak Düşük Kodlu Yapay Zeka Araçları: GitHub Yıldızlarına Göre En İyileri<div class="cs-entry__post-meta" ><div class="cs-meta-date">21 Ekim 2025</div></div></a></h2> </div> </div> </div> </article> <article class="cs-read-next__item post-32455 post type-post status-publish format-standard category-git cs-entry cs-video-wrap"> <div class="cs-entry__outer"> <div class="cs-entry__inner cs-entry__content"> <div class="cs-entry__info"> <h2 class="cs-entry__title"><a href="https://fatihsoysal.com/blog/12-days-of-digitalocean-day-9-digitaloceanin-gradient-platformu-ile-makbuz-ayristirmayi-otomatiklestirme/">12 Days of DigitalOcean (Day 9) – DigitalOcean’ın Gradient Platformu ile Makbuz Ayrıştırmayı Otomatikleştirme<div class="cs-entry__post-meta" ><div class="cs-meta-date">22 Ekim 2025</div></div></a></h2> </div> </div> </div> </article> <article class="cs-read-next__item post-32485 post type-post status-publish format-standard category-git cs-entry cs-video-wrap"> <div class="cs-entry__outer"> <div class="cs-entry__inner cs-entry__content"> <div class="cs-entry__info"> <h2 class="cs-entry__title"><a href="https://fatihsoysal.com/blog/yazilim-gelistirme-sureclerinizi-claudeun-derinlemesine-analiz-yetenegi-ve-github-copilotin/">Yazılım geliştirme süreçlerinizi Claude’un derinlemesine analiz yeteneği ve GitHub Copilot’ın…<div class="cs-entry__post-meta" ><div class="cs-meta-date">22 Ekim 2025</div></div></a></h2> </div> </div> </div> </article> </div> </section> <div class="cs-subscribe"> <div class="cs-subscribe__content"> <div class="cs-subscribe__header"> <div class="cs-subscribe__heading h2"> E-posta Bülteni </div> <div class="cs-subscribe__subheading h2"> Yazılım Topluluğuna Katılın </div> <div class="cs-subscribe__description"> En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim. </div> </div> <form class="cs-subscribe__form" action="https://codesupply.us13.list-manage.com/subscribe/post?u=41845cb8908fb4302a4df512f&id=b5a5e9c757" method="post" target="_blank" novalidate> <div class="cs-form-group cs-subscribe__form-group"> <input type="email" placeholder="Your E-mail" name="EMAIL" required> <button type="submit" value="Abone Ol" aria-label="Abone Ol" name="subscribe"> <span>Abone Ol</span> </button> </div> </form> </div> </div> </div> </div> </main> </div> </div> <footer class="cs-footer" data-scheme="auto" data-l="light" data-d="dark"> <div class="cs-footer__item cs-footer__item-top-bar"> <div class="cs-container"> <div class="cs-footer__item-inner"> <div class="cs-footer__col cs-col-left"> <div class="cs-footer-columns__nav-menu"> <ul id="menu-menu-5" class="cs-footer-columns__nav "><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-19194 csco-menu-item-style-none"><a href="https://fatihsoysal.com/"><span>Anasayfa</span></a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-11 csco-menu-item-style-none"><a href="https://fatihsoysal.com/blog/hakkimda/"><span>Hakkımda</span></a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-25363 csco-menu-item-style-none"><a href="#"><span>Eğitimler</span></a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-30019 csco-menu-item-style-none"><a href="#"><span>Makaleler</span></a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-69 csco-menu-item-style-none"><a href="https://fatihsoysal.com/blog"><span>Blog</span></a></li> <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-35075 csco-menu-item-style-none"><a href="#"><span>Kategoriler</span></a></li> <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-257 csco-menu-item-style-none"><a href="https://fatihsoysal.com/blog/iletisim/"><span>Bana Ulaşın</span></a></li> </ul> </div> </div> <div class="cs-footer__col cs-col-right"> <div class="cs-social"> <a class="cs-social__link" href="https://www.linkedin.com/in/fatihsoysal/" target="_blank" title="Linkedin"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><path d="M16.8169 2.00011H3.1831C3.02984 1.998 2.87767 2.02591 2.73526 2.08226C2.59286 2.13861 2.46302 2.22229 2.35316 2.32852C2.24329 2.43475 2.15556 2.56145 2.09496 2.70139C2.03437 2.84133 2.0021 2.99176 2 3.1441V16.8559C2.0021 17.0082 2.03437 17.1587 2.09496 17.2986C2.15556 17.4385 2.24329 17.5653 2.35316 17.6715C2.46302 17.7777 2.59286 17.8614 2.73526 17.9177C2.87767 17.9741 3.02984 18.002 3.1831 17.9999H16.8169C16.9702 18.002 17.1223 17.9741 17.2647 17.9177C17.4071 17.8614 17.537 17.7777 17.6468 17.6715C17.7567 17.5653 17.8444 17.4385 17.905 17.2986C17.9656 17.1587 17.9979 17.0082 18 16.8559V3.1441C17.9979 2.99176 17.9656 2.84133 17.905 2.70139C17.8444 2.56145 17.7567 2.43475 17.6468 2.32852C17.537 2.22229 17.4071 2.13861 17.2647 2.08226C17.1223 2.02591 16.9702 1.998 16.8169 2.00011ZM6.85312 15.3919H4.43863V8.19203H6.85312V15.3919ZM5.64588 7.18404C5.31289 7.18404 4.99354 7.05256 4.75808 6.81851C4.52262 6.58447 4.39034 6.26704 4.39034 5.93606C4.39034 5.60507 4.52262 5.28764 4.75808 5.0536C4.99354 4.81956 5.31289 4.68807 5.64588 4.68807C5.82269 4.66814 6.00175 4.68556 6.17133 4.73918C6.3409 4.7928 6.49717 4.88142 6.6299 4.99924C6.76264 5.11706 6.86883 5.26141 6.94155 5.42285C7.01426 5.58429 7.05185 5.75918 7.05185 5.93606C7.05185 6.11294 7.01426 6.28782 6.94155 6.44926C6.86883 6.6107 6.76264 6.75506 6.6299 6.87287C6.49717 6.99069 6.3409 7.07931 6.17133 7.13293C6.00175 7.18656 5.82269 7.20397 5.64588 7.18404ZM15.5614 15.3919H13.1469V11.528C13.1469 10.56 12.8008 9.928 11.9235 9.928C11.652 9.92998 11.3877 10.0146 11.1661 10.1705C10.9445 10.3264 10.7762 10.5461 10.6841 10.8C10.6211 10.988 10.5938 11.186 10.6036 11.384V15.3839H8.18913V8.18402H10.6036V9.20001C10.823 8.8217 11.142 8.51004 11.5263 8.29859C11.9106 8.08713 12.3457 7.98391 12.7847 8.00003C14.3944 8.00003 15.5614 9.03201 15.5614 11.248V15.3919Z"/></svg> </a> </div> </div> </div> </div> </div> <div class="cs-footer__item cs-footer__item-bottom-bar"> <div class="cs-container"> <div class="cs-footer__item-inner"> <div class="cs-footer__col cs-col-left"> <div class="cs-footer__nav-menu"> <ul id="menu-footer" class="cs-footer__nav "><li id="menu-item-39737" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39737"><a href="https://fatihsoysal.com/blog/category/ai/"><span>AI</span></a></li> <li id="menu-item-39739" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39739"><a href="https://fatihsoysal.com/blog/category/akademik-ve-bilimsel/"><span>Akademik ve Bilimsel</span></a></li> <li id="menu-item-39740" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39740"><a href="https://fatihsoysal.com/blog/category/angular/"><span>Angular</span></a></li> <li id="menu-item-39741" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39741"><a href="https://fatihsoysal.com/blog/category/aws/"><span>AWS</span></a></li> <li id="menu-item-39742" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39742"><a href="https://fatihsoysal.com/blog/category/azure/"><span>Azure</span></a></li> <li id="menu-item-39743" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39743"><a href="https://fatihsoysal.com/blog/category/bash/"><span>Bash</span></a></li> <li id="menu-item-39745" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39745"><a href="https://fatihsoysal.com/blog/category/c-2/"><span>C++</span></a></li> <li id="menu-item-39746" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39746"><a href="https://fatihsoysal.com/blog/category/cloud/"><span>Cloud</span></a></li> <li id="menu-item-39748" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39748"><a href="https://fatihsoysal.com/blog/category/devops/"><span>Devops</span></a></li> <li id="menu-item-39749" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39749"><a href="https://fatihsoysal.com/blog/category/docker/"><span>Docker</span></a></li> <li id="menu-item-39750" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39750"><a href="https://fatihsoysal.com/blog/category/dusunsel-ve-kisisel/"><span>Düşünsel ve Kişisel</span></a></li> <li id="menu-item-39751" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39751"><a href="https://fatihsoysal.com/blog/category/egitim/"><span>Eğitim</span></a></li> <li id="menu-item-39752" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39752"><a href="https://fatihsoysal.com/blog/category/flutter/"><span>Flutter</span></a></li> <li id="menu-item-39754" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39754"><a href="https://fatihsoysal.com/blog/category/genel/"><span>Genel</span></a></li> <li id="menu-item-39755" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-39755"><a href="https://fatihsoysal.com/blog/category/git/"><span>Git</span></a></li> <li id="menu-item-39758" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39758"><a href="https://fatihsoysal.com/blog/category/is-dunyasi/"><span>İş Dünyası</span></a></li> <li id="menu-item-39759" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39759"><a href="https://fatihsoysal.com/blog/category/java/"><span>Java</span></a></li> <li id="menu-item-39760" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39760"><a href="https://fatihsoysal.com/blog/category/kubernetes/"><span>Kubernetes</span></a></li> <li id="menu-item-39761" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39761"><a href="https://fatihsoysal.com/blog/category/mobile/"><span>Mobile</span></a></li> <li id="menu-item-39762" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39762"><a href="https://fatihsoysal.com/blog/category/mongodb/"><span>MongoDB</span></a></li> <li id="menu-item-39763" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39763"><a href="https://fatihsoysal.com/blog/category/mvc/"><span>MVC</span></a></li> <li id="menu-item-39764" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39764"><a href="https://fatihsoysal.com/blog/category/nextjs/"><span>NextJS</span></a></li> <li id="menu-item-39765" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39765"><a href="https://fatihsoysal.com/blog/category/nginx/"><span>Nginx</span></a></li> <li id="menu-item-39766" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39766"><a href="https://fatihsoysal.com/blog/category/powershell/"><span>PowerShell</span></a></li> <li id="menu-item-39767" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39767"><a href="https://fatihsoysal.com/blog/category/programming-patterns/"><span>Programming Patterns</span></a></li> <li id="menu-item-39768" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39768"><a href="https://fatihsoysal.com/blog/category/python/"><span>Python</span></a></li> <li id="menu-item-39769" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39769"><a href="https://fatihsoysal.com/blog/category/redis/"><span>Redis</span></a></li> <li id="menu-item-39770" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39770"><a href="https://fatihsoysal.com/blog/category/sed/"><span>Sed</span></a></li> <li id="menu-item-39771" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39771"><a href="https://fatihsoysal.com/blog/category/server/"><span>Server</span></a></li> <li id="menu-item-39772" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39772"><a href="https://fatihsoysal.com/blog/category/yazilim/net/"><span>.NET</span></a></li> <li id="menu-item-39773" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39773"><a href="https://fatihsoysal.com/blog/category/yazilim/ajax/"><span>AJAX</span></a></li> <li id="menu-item-39774" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39774"><a href="https://fatihsoysal.com/blog/category/yazilim/asp-net/"><span>ASP.NET</span></a></li> <li id="menu-item-39775" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39775"><a href="https://fatihsoysal.com/blog/category/yazilim/c/"><span>C#</span></a></li> <li id="menu-item-39776" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39776"><a href="https://fatihsoysal.com/blog/category/yazilim/css3-html5/"><span>CSS3 – HTML5</span></a></li> <li id="menu-item-39777" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39777"><a href="https://fatihsoysal.com/blog/category/yazilim/java-android-development/"><span>JAVA – Android</span></a></li> <li id="menu-item-39778" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39778"><a href="https://fatihsoysal.com/blog/category/yazilim/javascript/"><span>Javascript</span></a></li> <li id="menu-item-39779" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39779"><a href="https://fatihsoysal.com/blog/category/yazilim/linux/"><span>Linux</span></a></li> <li id="menu-item-39780" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39780"><a href="https://fatihsoysal.com/blog/category/yazilim/php/"><span>PHP</span></a></li> <li id="menu-item-39781" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39781"><a href="https://fatihsoysal.com/blog/category/yazilim/javascript/jquery/"><span>jQuery</span></a></li> <li id="menu-item-39782" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39782"><a href="https://fatihsoysal.com/blog/category/yazilim/javascript/node-js/"><span>Node.js</span></a></li> <li id="menu-item-39783" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39783"><a href="https://fatihsoysal.com/blog/category/yazilim/javascript/react/"><span>React</span></a></li> <li id="menu-item-39784" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39784"><a href="https://fatihsoysal.com/blog/category/yazilim/sql/ms-sql-server/"><span>MS SQL Server</span></a></li> <li id="menu-item-39785" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39785"><a href="https://fatihsoysal.com/blog/category/yazilim/sql/mysql/"><span>MySQL</span></a></li> <li id="menu-item-39786" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-39786"><a href="https://fatihsoysal.com/blog/category/yazilim/sql/postgresql/"><span>PostgreSQL</span></a></li> </ul> </div> </div> <div class="cs-footer__col cs-col-right"> <div class="cs-footer__copyright"> © 2026 Fatih Soysal 💻🚀 All rights reserved. Built with passion & caffeine ☕ </div> </div> </div> </div> </div> </footer> <button class="cs-scroll-top" role="button" aria-label="Scroll to top button"> <i class="cs-icon cs-icon-chevron-up"></i> <div class="cs-scroll-top-border"> <svg width="52" height="52" viewBox="0 0 52 52"> <path d="M26,2 a24,24 0 0,1 0,48 a24,24 0 0,1 0,-48" style="stroke-width: 2; fill: none;"></path> </svg> </div> <div class="cs-scroll-top-progress"> <svg width="52" height="52" viewBox="0 0 52 52"> <path d="M26,2 a24,24 0 0,1 0,48 a24,24 0 0,1 0,-48" style="stroke-width: 2; fill: none;"></path> </svg> </div> </button> <script type="text/javascript"> var CF7AppsLoadhCaptcha = function() { var hcaptcha = document.querySelectorAll( '.h-captcha' ); for (var i = 0; i < hcaptcha.length; i++) { hcaptcha[i].setAttribute( 'data-sitekey', '' ); hcaptcha[i].setAttribute( 'data-callback', 'cf7apps_hcaptcha_callback' ); } }; </script> <script src="https://js.hcaptcha.com/1/api.js?onload=CF7AppsLoadhCaptcha" async defer ></script> <script> const lazyloadRunObserver = () => { const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` ); const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => { entries.forEach( ( entry ) => { if ( entry.isIntersecting ) { let lazyloadBackground = entry.target; if( lazyloadBackground ) { lazyloadBackground.classList.add( 'e-lazyloaded' ); } lazyloadBackgroundObserver.unobserve( entry.target ); } }); }, { rootMargin: '200px 0px 200px 0px' } ); lazyloadBackgrounds.forEach( ( lazyloadBackground ) => { lazyloadBackgroundObserver.observe( lazyloadBackground ); } ); }; const events = [ 'DOMContentLoaded', 'elementor/lazyload/observe', ]; events.forEach( ( event ) => { document.addEventListener( event, lazyloadRunObserver ); } ); </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/embed-any-document/js/pdfobject.min.js?ver=2.7.12" id="awsm-ead-pdf-object-js"></script> <script id="awsm-ead-public-js-extra"> var eadPublic = []; </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/embed-any-document/js/embed-public.min.js?ver=2.7.12" id="awsm-ead-public-js"></script> <script src="https://fatihsoysal.com/blog/wp-includes/js/dist/hooks.min.js?ver=4d63a3d491d11ffd8ac6" id="wp-hooks-js"></script> <script src="https://fatihsoysal.com/blog/wp-includes/js/dist/i18n.min.js?ver=5e580eb46a90c2b997e6" id="wp-i18n-js"></script> <script id="wp-i18n-js-after"> wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/contact-form-7/includes/swv/js/index.js?ver=6.1.5" id="swv-js"></script> <script id="contact-form-7-js-translations"> ( function( domain, translations ) { var localeData = translations.locale_data[ domain ] || translations.locale_data.messages; localeData[""].domain = domain; wp.i18n.setLocaleData( localeData, domain ); } )( "contact-form-7", {"translation-revision-date":"2026-01-19 21:19:08+0000","generator":"GlotPress\/4.0.3","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"tr"},"This contact form is placed in the wrong place.":["Bu ileti\u015fim formu yanl\u0131\u015f yere yerle\u015ftirilmi\u015f."],"Error:":["Hata:"]}},"comment":{"reference":"includes\/js\/index.js"}} ); </script> <script id="contact-form-7-js-before"> var wpcf7 = { "api": { "root": "https:\/\/fatihsoysal.com\/blog\/wp-json\/", "namespace": "contact-form-7\/v1" } }; </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/contact-form-7/includes/js/index.js?ver=6.1.5" id="contact-form-7-js"></script> <script src="https://fatihsoysal.com/blog/wp-includes/js/imagesloaded.min.js?ver=5.0.0" id="imagesloaded-js"></script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/sight/render/js/jquery.magnific-popup.min.js?ver=1777452259" id="magnific-popup-js"></script> <script id="sight-block-script-js-extra"> var sight_lightbox_localize = {"text_previous":"Previous","text_next":"Next","text_close":"Close","text_loading":"Loading","text_counter":"of"}; </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/sight/render/js/sight.js?ver=1777452259" id="sight-block-script-js"></script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/easy-syntax-highlighter/assets/js/highlight.min.js?ver=11.9.0" id="esh-highlight-js-js"></script> <script id="esh-highlight-js-js-after"> document.addEventListener("DOMContentLoaded", () => { hljs.highlightAll(); }); </script> <script id="esh-frontend-js-extra"> var esh_i18n = {"copied":"\u5df2\u590d\u5236\uff01","copy_failed":"\u590d\u5236\u5931\u8d25"}; </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/easy-syntax-highlighter/assets/js/frontend.js?ver=2.0.0" id="esh-frontend-js"></script> <script src="https://www.google.com/recaptcha/api.js?render=6Lfq6JMsAAAAAFwFocaWCzv-A3znzOaIyo9ACOYg&ver=3.0" id="google-recaptcha-js"></script> <script src="https://fatihsoysal.com/blog/wp-includes/js/dist/vendor/wp-polyfill.min.js?ver=3.15.0" id="wp-polyfill-js"></script> <script id="wpcf7-recaptcha-js-before"> var wpcf7_recaptcha = { "sitekey": "6Lfq6JMsAAAAAFwFocaWCzv-A3znzOaIyo9ACOYg", "actions": { "homepage": "homepage", "contactform": "contactform" } }; </script> <script src="https://fatihsoysal.com/blog/wp-content/plugins/contact-form-7/modules/recaptcha/index.js?ver=6.1.5" id="wpcf7-recaptcha-js"></script> <script id="csco-scripts-js-extra"> var csLocalize = {"siteSchemeMode":"system","siteSchemeToogle":"1","shareCopiedText":"URL copied","subscribeProcess":"Processing your subscription...","subscribeSuccess":"Thank you for subscribing!","subscribeError":"Form submission error"}; </script> <script src="https://fatihsoysal.com/blog/wp-content/themes/intro/assets/js/scripts.js?ver=6.7.11" id="csco-scripts-js"></script> <script src="https://fatihsoysal.com/blog/wp-content/themes/intro/assets/static/js/comment-reply.js?ver=6.7.11" id="csco-comment-reply-js"></script> <script defer src="https://fatihsoysal.com/blog/wp-content/plugins/akismet/_inc/akismet-frontend.js?ver=1777452205" id="akismet-frontend-js"></script> </div> </body> </html>