Yazılım geliştirme süreçlerinde kodun yerel makinede (localhost) çalışması yalnızca ilk adımdır. Kodun güvenli, hatasız ve hızlı bir şekilde canlı ortama (Production) aktarılması ise modern yazılım mühendisliğinin en kritik aşamalarından biridir. Manuel sunucu bağlantıları, elle alınan build'ler ve sunucuya atılan dosyalar insan hatasına oldukça açıktır.
CI/CD (Continuous Integration / Continuous Delivery & Deployment), kod değişikliklerinin test edilmesinden canlıya alınmasına kadar olan tüm aşamaları otomatize ederek teslimat hızını ve kalitesini artırır.
1. CI ve CD Neyi İfade Eder?
CI/CD süreci iki temel bileşenin bir araya gelmesinden oluşur:
- CI (Continuous Integration - Sürekli Entegrasyon): Geliştiricilerin yazdığı kodların sık sık ana dala (main/master) birleştirilmesidir. Her birleştirme işleminde otomatik build ve test süreçleri tetiklenerek olası hatalar anında tespit edilir.
- CD (Continuous Delivery - Sürekli Teslimat): Testlerden geçen kodun staging veya production ortamına dağıtıma hazır hale getirilmesidir (Manuel onay mekanizması içerebilir).
- CD (Continuous Deployment - Sürekli Dağıtım): Herhangi bir insan müdahalesi olmadan, testleri geçen kodun otomatik olarak doğrudan canlıya aktarılmasıdır.
2. Tipik Bir CI/CD Boru Hattı (Pipeline) Aşamaları
Başarılı bir CI/CD pipeline'ı genellikle şu adımlardan oluşur:
| Aşama | Yapılan İşlem | Amacı |
|---|---|---|
| 1. Lint & Format | Kod stilinin ve statik analizlerin kontrolü | Kod kalitesi ve okunabilirliği sağlamak. |
| 2. Build (Derleme) | Bağımlılıkların yüklenmesi ve projenin derlenmesi | Kodun hatasız derlendiğini doğrulamak. |
| 3. Test Execution | Unit, Integration ve E2E testlerinin koşulması | Regresyon hatalarını canlıya geçmeden önlemek. |
| 4. Package / Containerize | Docker imajının oluşturulması ve registry'ye yüklenmesi | Çalıştırılabilir bağımsız paket üretmek. |
| 5. Deploy (Dağıtım) | Sunucuların, Kubernetes cluster'ının güncellenmesi | Yeni sürümü kullanıcılara sunmak. |
3. Örnek GitHub Actions Workflow Konfigürasyonu
Bir Node.js / TypeScript projesi için örnek .github/workflows/ci-cd.yml dosyası:
##yaml name: Node.js CI/CD Pipeline
on: push: branches: [ "main" ] pull_request: branches: [ "main" ]
jobs: build-and-test: runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Node.js Environment
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install Dependencies
run: npm ci
- name: Run Linter
run: npm run lint
- name: Execute Automated Tests
run: npm test
- name: Build Project
run: npm run build
- CI/CD Süreçlerinde En İyi Pratikler Erken Başarısız Ol (Fail Fast): Hızlı sonuç veren adımları (Lint ve Unit Test) pipeline'ın en başına koyun, böylece uzun süren build adımlarını gereksiz yere çalıştırmazsınız.
Gizli Bilgileri Güvenli Yönetin (Secret Management): API anahtarlarını veya sunucu şifrelerini asla koda gömmeyin; CI/CD sağlayıcınızın Secret Management (örn. GitHub Secrets) mekanizmasını kullanın.
Ortam İzolesi (Environment Isolation): Test, Staging ve Production ortamlarını tamamen ayırın.
Sonuç
Otomatik bir CI/CD hattı kurmak, başta zaman yatırımı gerektirse de geliştirme ekibine yüksek özgüven, hızlı geri bildirim döngüsü ve sıfıra yakın dağıtım hatası kazandırır. Unutmayın: Otomatize edilmeyen her adım, gelecekte potansiyel bir insan hatasıdır.