GitHub Actions ile CI/CD: Kodunuzu Otomatik Olarak Test Edin, Derleyin ve Dağıtın

Manuel dağıtımların ve 'benim makinemde çalışıyordu' bahanelerinin sonu geldi. Bu kapsamlı rehberde, GitHub Actions kullanarak projenizi nasıl otomatik olarak test edeceğinizi, derleyeceğinizi ve canlıya alacağınızı, sıfırdan bir CI/CD pipeline'ı oluşturarak öğrenin.
Giriş: 'Benim Makinemde Çalışıyordu' Efsanesinin Sonu
Yazılım geliştirme döngüsünün en can sıkıcı anlarından biri, günlerce uğraştığınız kodun takım arkadaşınızın makinesinde veya daha da kötüsü, sunucuda çalışmamasıdır. Farklı ortamlar, eksik bağımlılıklar ve manuel yapılan dağıtım hataları... İşte bu kaosun ortasında CI/CD (Sürekli Entegrasyon / Sürekli Dağıtım) bir kurtarıcı gibi parlar. Ve GitHub'ın kendi çatısı altında sunduğu GitHub Actions, bu süreci inanılmaz derecede basit ve erişilebilir hale getiriyor.
Bu rehber, sizi manuel dağıtımların ve belirsizliklerin karanlık dehlizlerinden çıkarıp, kodunuzun her bir commit'te otomatik olarak test edildiği, derlendiği ve dağıtıma hazır hale getirildiği aydınlık bir dünyaya taşıyacak. Kemerlerinizi bağlayın, otomasyon yolculuğuna çıkıyoruz!
1. Kod & Push
Geliştirici kodu yazar ve depoya gönderir.
git push
2. GitHub Actions
CI/CD iş akışı tetiklenir ve adımları çalıştırır.
3. Canlı Uygulama
Uygulama başarıyla sunucuda yayında.
✓ Başarılı
Bölüm 1: Kavramları Netleştirelim - CI/CD ve GitHub Actions Nedir?
- Sürekli Entegrasyon (Continuous Integration - CI): Geliştiricilerin kod değişikliklerini sık sık merkezi bir depoda (repository) birleştirmesi pratiğidir. Her birleştirme, otomatik bir derleme (build) ve test süreci tarafından doğrulanır. Amaç, entegrasyon hatalarını erken tespit etmektir.
- Sürekli Dağıtım/Teslimat (Continuous Deployment/Delivery - CD): CI sürecini başarıyla geçen kod değişikliklerinin otomatik olarak bir test veya üretim ortamına dağıtılmasıdır. Sürekli Teslimat, dağıtımın bir tuşa basılarak manuel yapılmasını, Sürekli Dağıtım ise tamamen otomatik yapılmasını ifade eder.
- GitHub Actions: Kısacası, GitHub deponuzdaki olaylara (commit, pull request açılışı, vb.) tepki olarak otomatik iş akışları (workflows) çalıştırmanızı sağlayan bir otomasyon aracıdır. Bu iş akışları, CI/CD pipeline'ları oluşturmak için mükemmeldir.
Bölüm 2: İlk Workflow'umuzu Yazıyoruz - YAML'ın Gücü
GitHub Actions iş akışları, deponuzdaki .github/workflows/ dizininde bulunan YAML dosyaları ile tanımlanır. Şimdi basit bir Node.js projesi için bir CI pipeline'ı oluşturalım. Bu pipeline, her yeni commit'te veya pull request'te projenin bağımlılıklarını kuracak ve testleri çalıştıracak.
Dosya: .github/workflows/ci.yml
name: Node.js CI
# Bu iş akışının ne zaman tetikleneceğini belirler
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
# Çalıştırılacak işleri (jobs) tanımlar
jobs:
build:
# İşin çalışacağı sanal makineyi belirtir
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x, 20.x] # Farklı Node.js versiyonlarında test et
# İşin adımlarını (steps) tanımlar
steps:
# 1. Adım: Depodaki kodu sanal makineye kopyala
- name: Checkout repository
uses: actions/checkout@v3
# 2. Adım: Belirtilen Node.js versiyonunu kur
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: 'npm' # Bağımlılıkları cache'le
# 3. Adım: Proje bağımlılıklarını kur
- name: Install dependencies
run: npm ci
# 4. Adım: Testleri çalıştır
- name: Run tests
run: npm test
Bu dosyayı deponuza eklediğiniz an, GitHub Actions sihrini göstermeye başlayacaktır. Her 'push' veya 'pull request'te, "Actions" sekmesinde bu iş akışının çalıştığını görebilirsiniz.
Bölüm 3: CD Adımını Eklemek - Bir React Uygulamasını Otomatik Dağıtma
CI pipeline'ımız harika çalışıyor. Şimdi de 'main' branch'ine bir kod birleştirildiğinde, projemizi derleyip bir sunucuya (örneğin Netlify veya Vercel'e) otomatik olarak dağıtan CD adımını ekleyelim. Vercel CLI kullanarak bunu nasıl yapacağımıza bakalım.
Dosya: .github/workflows/deploy.yml
name: Deploy to Vercel
# Sadece 'main' branch'ine push yapıldığında tetiklenir
on:
push:
branches: [ "main" ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: '20.x'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build project
run: npm run build
# Vercel'e dağıtım adımı
- name: Deploy to Vercel
run: npx vercel --prod --token=${{ secrets.VERCEL_TOKEN }}
env:
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
Sırlar Nerede Saklanıyor?
Yukarıdaki kodda ${{ secrets.VERCEL_TOKEN }} gibi bir ifade fark ettiniz. API token'ları gibi hassas bilgileri asla YAML dosyasına doğrudan yazmamalısınız. Bunun yerine, GitHub deponuzun "Settings > Secrets and variables > Actions" bölümüne giderek bu bilgileri güvenli bir şekilde saklayabilirsiniz. GitHub Actions, bu 'secret'ları iş akışınız çalışırken güvenli bir şekilde kullanılabilir hale getirir.
Bölüm 4: Yaygın Hatalar ve En İyi Pratikler
- Secrets Log'lara Sızdırmak: Bir 'secret'ı doğrudan
echogibi bir komutla basmaya çalışırsanız, GitHub bunu loglarda maskelemeye çalışır, ancak bu her zaman garantili değildir. Secret'ları sadece ilgili CLI komutlarının veya action'ların parametrelerinde kullanın. - Cache Kullanmamak: Her seferinde
npm installçalıştırmak, özellikle büyük projelerde dakikalar sürebilir.actions/setup-nodeveyaactions/cachegibi action'lar ile bağımlılıklarınızı cache'leyerek iş akışlarınızı önemli ölçüde hızlandırın. - Tek Bir Dev Job Dosyası: CI, CD, Linting gibi farklı görevleri tek bir devasa YAML dosyasında birleştirmek yerine, her birini kendi mantıksal dosyasına ayırın (
ci.yml,deploy.yml). Bu, yönetimi kolaylaştırır. - Rol ve İzinleri Ayarlamamak: Özellikle açık kaynak projelerde, her pull request'in production'a dağıtım yapacak secret'lara erişmesini istemezsiniz. Farklı iş akışları için farklı izin seviyeleri belirleyin ve
pull_request_targetgibi tehlikeli olabilecek tetikleyicileri dikkatli kullanın.
Sonuç: Otomasyon Sadece Bir Araç Değil, Bir Kültürdür
GitHub Actions ile bir CI/CD pipeline'ı kurmak, ilk başta karmaşık görünebilir. Ancak bir kez kurduğunuzda, size ve ekibinize inanılmaz bir hız, güvenlik ve verimlilik kazandırır. Hatalar azalır, kod kalitesi artar ve en önemlisi, "acaba bu kod sunucuda çalışacak mı?" endişesi ortadan kalkar. Otomasyon, sadece YAML dosyaları yazmak değil, aynı zamanda daha iyi, daha güvenilir ve daha hızlı yazılım üretme kültürünü benimsemektir.
