CI/CD Nedir?
CI (Continuous Integration): Her kod değişikliğinde otomatik test ve build yapılması. CD (Continuous Deployment): Başarılı build'lerin otomatik olarak sunucuya deploy edilmesi.
CI/CD olmadan geliştirme süreci şöyle görünür: "Kod yaz → Manuel test → FTP ile yükle → Dua et." CI/CD ile: "Kod push et → Her şey otomatik çalışır."
GitHub Actions ile CI/CD
GitHub Actions, GitHub'a entegre ücretsiz bir CI/CD platformudur. Özellikle açık kaynak projeler için tamamen ücretsizdir.
Temel Kavramlar
- Workflow → Pipeline tanımı (YAML dosyası)
- Job → Pipeline'daki görev grubu
- Step → Görev içindeki adımlar
- Runner → Kodun çalıştığı sanal makine
Adım Adım CI/CD Pipeline
Aşağıdaki örnek, bir Next.js uygulamasını test edip Docker Hub'a push eden ve ardından Kubernetes'e deploy eden tam bir pipeline'dır.
# .github/workflows/deploy.yml
name: Build & Deploy
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
IMAGE_NAME: vivayazilim/web-app
jobs:
test:
name: Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run type check
run: npm run type-check
- name: Run tests
run: npm test
build-and-push:
name: Build Docker Image
runs-on: ubuntu-latest
needs: test
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v5
with:
push: true
tags: |
${{ env.IMAGE_NAME }}:latest
${{ env.IMAGE_NAME }}:${{ github.sha }}
deploy:
name: Deploy to Kubernetes
runs-on: ubuntu-latest
needs: build-and-push
steps:
- uses: actions/checkout@v4
- name: Set up kubectl
uses: azure/setup-kubectl@v3
- name: Configure kubeconfig
run: |
mkdir -p ~/.kube
echo "${{ secrets.KUBECONFIG }}" > ~/.kube/config
- name: Deploy
run: |
kubectl set image deployment/web-app \
web-app=${{ env.IMAGE_NAME }}:${{ github.sha }}
kubectl rollout status deployment/web-app
Secrets Yönetimi
GitHub Actions'ta hassas bilgileri (API key, şifre, kubeconfig) Secrets olarak saklayın:
- Repo → Settings → Secrets and variables → Actions
- New repository secret → İsim ve değer girin
- Workflow'da
${{ secrets.SECRET_NAME }}ile kullanın
# Doğru kullanım
password: ${{ secrets.DOCKER_PASSWORD }}
# YANLIŞ — asla kodda gömülü şifre bırakmayın
password: "my-super-secret-password" # ❌
PR'larda Otomatik Test
Pull Request'lerde testlerin otomatik çalışması için:
on:
pull_request:
branches: [main, develop]
Bu ayar sayesinde PR'lar merge edilmeden önce testler yeşil olmak zorundadır.
Deployment Stratejileri
| Strateji | Avantaj | Dezavantaj | |---|---|---| | Rolling Update | Zero-downtime | Geri alma yavaş | | Blue-Green | Anında geri alma | 2x kaynak | | Canary | Kademeli trafik | Karmaşık |
Küçük takımlar için Rolling Update ile başlamanızı öneririz.
Maliyetler
| Platform | Bedava Limit | Ücretli | |---|---|---| | GitHub Actions | 2.000 dk/ay | $0.008/dk | | GitLab CI | 400 dk/ay | $0.005/dk | | CircleCI | 6.000 dk/ay | $15/kullanıcı |
Çoğu KOBİ için GitHub Actions bedava limiti yeterlidir.
Sonuç
CI/CD kurulum yatırımı; manuel deploy hatalarını, üretim ortamı sürprizlerini ve "dün çalışıyordu" krizlerini ortadan kaldırır. Viva Yazılım DevOps danışmanlığı ile pipeline kurulumunu birlikte yapabiliriz.