CI/CD Pipeline Kurulum Rehberi: Otomatik Test ve Canlıya Alma
Modern yazılım süreçlerinde CI/CD pipeline kurulumu, otomatik test entegrasyonu ve sıfır kesintiyle canlıya alma adımlarını içeren kapsamlı teknik rehber.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
Modern Yazılımda CI/CD: Dijital Strateji ve Trendler
CI/CD (Sürekli Entegrasyon / Sürekli Dağıtım), modern dijital strateji hedeflerinin omurgasıdır. Kod kalitesini artırır, insan hatasını sıfırlar, release döngülerini dakikalara indirir. Güncel trendler GitOps, DevSecOps entegrasyonları ve konteyner tabanlı orkestrasyon üzerine kuruludur. Bu rehber, production-grade bir pipeline kurulumunu baştan sona ele alır.
1. CI/CD Mimarisinin Temel Bileşenleri
- Source Control (VCS): Git (GitHub, GitLab, Bitbucket). Değişiklik tetikleyicisi.
- CI Sunucusu / Runner: GitHub Actions, GitLab CI, Jenkins. İşleri çalıştıran izole ortam.
- Test Otomasyonu: Unit, integration, linter, statik analiz (SAST).
- Artifact Registry: Docker Hub, AWS ECR, GitHub Packages. Sürümlenmiş derleme çıktıları.
- Deployment Target: Kubernetes, VPS, AWS ECS/Lambda.
2. Adım Adım Pipeline Kurulumu
Adım 1: Versiyon Kontrol ve Branching Modeli
Trunk-based development veya basitleştirilmiş GitFlow kullanın. main branch doğrudan production ortamını yansıtır. Her özellik bir feature/* dalında geliştirilir ve Pull Request (PR) üzerinden merge edilir.
Adım 2: Otomasyon Konfigürasyonu (GitHub Actions Örneği)
Proje kök dizininde .github/workflows/ci-cd.yml dosyasını oluşturun:
name: Build, Test and Deploy
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
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'
- run: npm ci
- run: npm run lint
- run: npm test
deploy:
needs: test
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build and Push Docker Image
run: |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
docker build -t myapp:${{ github.sha }} .
docker push myapp:${{ github.sha }}
- name: Deploy to Server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
docker pull myapp:${{ github.sha }}
docker stop app || true
docker rm app || true
docker run -d --name app -p 80:3000 myapp:${{ github.sha }}Adım 3: Sıfır Kesinti (Zero-Downtime) Dağıtımı
Trafik kesintisini önlemek için Blue-Green Deployment veya Rolling Update stratejilerini kullanın. Ters vekil sunucuyu (Nginx/Traefik) yeni konteyner hazır olana kadar eski sürüme yönlendirin.
- Healthcheck: Uygulama ayağa kalkmadan trafiği yönlendirmeyin. Docker ve Kubernetes health probe tanımlarını eksiksiz girin.
- Database Migrations: Şema değişikliklerini geriye dönük uyumlu (backward-compatible) tasarlayın. Kolon silmeden önce deprecated işaretleyin.
3. DevSecOps: Pipeline Güvenliği
- Secret Management: Asla hardcoded token kullanmayın. GitHub Secrets, HashiCorp Vault veya AWS Secrets Manager kullanın.
- Dependency Scanning:
npm audit, Snyk veya Trivy ile bağımlılık zafiyetlerini otomatik tarayın. - Container Scanning: Docker imajlarındaki OS seviyesi açıkları derleme aşamasında tespit edin.
4. Monitoring ve Rollback Stratejisi
Hatalı deployment durumunda panik yok; otomasyon var. İzleme araçları (Prometheus, Grafana, Sentry) 5xx hata oranında artış gördüğünde otomatik rollback webhook'u tetiklemelidir. Minimum gereksinim: Tek komutla bir önceki Docker hash değerine dönebilen CI workflow'u hazır tutun.