GitHub Actions, modern geliştirme ekiplerinin Sürekli Entegrasyon ve Sürekli Dağıtım (CI/CD) süreçlerini nasıl yönettiğini kökten değiştirdi. Deponuzda yerel otomasyon kullanarak altyapı yapılandırmanızı kodda tutarken derleme, test ve sürüm süreçlerinizi akıcı hale getirebilirsiniz. Orta düzeyden ileri seviyeye kadar olan geliştiriciler için, ölçeklenebilir, güvenli ve verimli hatlar oluşturmak için iş akışı yapılandırmasının nüanslarını anlamak esastır.
Temel Yapıyı Anlama
Temelinde, bir GitHub Actions iş akışı, deposunuzdaki .github/workflows dizininde yer alan bir YAML dosyasında tanımlanır. Bu dosyalar *.yml veya *.yaml olarak adlandırılır. Yapı hiyerarşik bir deseni izler: bir iş akışı birden fazla iş (job) içerir, her iş birden fazla adım (step) içerir ve her adım belirli bir eylemi veya komutu çalıştırır.
Yeni bir iş akışı dosyası oluşturduğunuzda, iş akışının adını ve çalışmayı tetikleyen olayları belirleyerek başlarsınız. Yaygın tetikleyiciler arasında bir dalı (branch) itme (push), bir çekme isteği (pull request) oluşturma veya manuel tetikleme (manual dispatch) yer alır.
name: CI Pipeline
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: npm test
İşleri ve Çalıştırmacıları (Runners) Tanımlama
runs-on anahtarı, işin nerede çalıştırılacağını belirler. Standart GitHub barındırmalı çalıştırmacılardan (örneğin ubuntu-latest, macos-latest veya windows-latest) seçebilir veya kendi altyapınız için özel bir barındırma (self-hosted) çalıştırmacı etiketi belirleyebilirsiniz. İşler sıralı veya paralel olarak çalışabilir. Varsayılan olarak işler paralel çalışır. Belirli bir sıralamaya ihtiyacınız varsa, bağımlılıkları tanımlamak için needs anahtarını kullanırsınız.
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm run lint
test:
needs: lint # This job runs only if 'lint' succeeds
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm test
Bağlamları (Contexts) ve İfadeleri Yönetme
GitHub Actions, iş akışı, iş, adımlar ve depo hakkında bilgiye erişmenizi sağlayan çeşitli bağlamlar sunar. En sık kullanılan bağlamlar arasında github, job, steps, secrets ve env yer alır. Bu bağlamlara dayanarak değerleri dinamik olarak ayarlamak için süslü parantez içindeki ${{ }} ifadelerini kullanabilirsiniz.
Örneğin, bir uygulamayı yalnızca main dalında değişiklik yapıldığında dağıtmak isteyebilirsiniz. if özelliğini kullanarak adımları koşullu olarak çalıştırabilirsiniz:
- name: Deploy to Production
if: github.ref == 'refs/heads/main'
run: ./deploy.sh
Gizli Bilgileri ve Ortam Değişkenlerini İşleme
CI/CD hatlarında güvenlik en önemli unsurdur. Kimlik bilgilerini asla iş akışı dosyalarınızda sabit kod (hardcode) olarak kullanmamalısınız. Bunun yerine, hassas verileri güvenli bir şekilde enjekte etmek için secrets bağlamını kullanın. Gizli bilgileri, deposu ayarlarınızda Ayarlar > Gizli Bilgiler ve Değişkenler > Actions altında tanımlayın. Ardından iş akışınızda bunlara şu şekilde başvurabilirsiniz:
- name: Publish to NPM
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
run: npm publish
Ayrıca, bir iş veya iş akışındaki tüm adımlar tarafından görülebilen ortam değişkenlerini, üst düzey env anahtarını kullanarak tanımlayabilirsiniz.
Ölçeklenebilir İş Akışları İçin En İyi Uygulamalar
Projeniz büyüdükçe iş akışı karmaşıklığınız da artar. Bakım yapılabilirliği korumak için aşağıdaki en iyi uygulamaları göz önünde bulundurun:
- Bileşik Eylemleri (Composite Actions) Kullanın: Tekrarlayan adımları, yinelenmeyi azaltmak için
.github/actionsiçinde saklanan bileşik eylemlere soyutlayın. - Önbelleklemeden (Caching) Yararlanın: Sonraki çalıştırmaları hızlandırmak için bağımlılıkları (örneğin
node_modules) önbelleğe almak içinactions/cachekullanın. - Matris Derlemeleri (Matrix Builds): Kodunuzu tek bir iş tanımı içinde birden fazla işletim sistemi sürümüne veya bağımlılık sürümüne karşı test etmek için
strategy.matrixözelliğini kullanın.
strategy:
matrix:
node-version: [14.x, 16.x, 18.x]
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
Sonuç
GitHub Actions yapılandırması, sadece YAML yazmaktan ibaret değildir; dayanıklı ve verimli bir dağıtım hattı tasarlamaktır. Tetikleyicileri, iş bağımlılıklarını, bağlam kullanımını ve güvenlik uygulamalarını ustalaşarak geliştirme yaşam döngünüzü etkili bir şekilde otomatikleştirebilirsiniz. Basit iş akışlarıyla başlayın ve projenizin ihtiyaçları değiştikçe matris derlemelerini, önbellekleme ve bileşik eylemleri kademeli olarak ekleyin. GitHub Actions'ın gücü, genişletilebilirliğinde yatar ve bu da onu modern DevOps stratejileri için vazgeçilmez bir araç haline getirir.