Git Repository ile Deploy Akışı: Sıfırdan Üretime Geçişte Kritik Adımlar
Git repository’lerini kullanarak uygulama deploy etmek için izlenmesi gereken en iyi uygulamalar, CI/CD pipeline kurulumu ve üretim ortamına güvenli geçiş süreçleri hakkında detaylı bir rehber.
Caner Serbest
Sistem ve Altyapı
10 dk okuma
Git Repository ile Deploy Akışı: Sıfırdan Üretime Geçişte Kritik Adımlar
Modern yazılım geliştirme süreçlerinde, kodunuzu güvenli ve verimli bir şekilde üretim ortamına deploy etmek, projenizin başarısı için kritik bir adımdır. Git repository’leri sadece kod depolama aracı değil, aynı zamanda deploy süreçlerinin merkezinde yer alan bir bileşendir. Bu rehberde, Git repository’lerini kullanarak nasıl güvenilir bir deploy akışı oluşturabileceğinizi, CI/CD pipeline’larını nasıl kurabileceğinizi ve üretim ortamına geçiş sürecinde nelere dikkat etmeniz gerektiğini adım adım inceleyeceğiz.
İçindekiler
- Git Repository Yapısının Doğru Kurulması
- Branch Stratejisinin Belirlenmesi
- CI/CD Pipeline Kurulumu
- Deploy Stratejileri ve Üretime Geçiş
- Güvenlik ve İzlenebilirlik
- Sık Karşılaşılan Sorunlar ve Çözümleri
- Sonuç ve Öneriler
Git Repository Yapısının Doğru Kurulması
Git repository’lerinin yapısı, deploy akışının temelini oluşturur. Yanlış yapılandırılmış bir repository, deploy süreçlerinde karmaşıklığa ve hatalara yol açabilir. İşte doğru bir repository yapısı oluşturmak için izlenmesi gereken adımlar:
1. Monorepo vs. Multi-repo Kararının Alınması
Projenizin büyüklüğüne ve takımın organizasyonuna bağlı olarak, monorepo (tek bir repository içinde tüm projeler) veya multi-repo (her proje için ayrı repository) yaklaşımını tercih edebilirsiniz.
Monorepo avantajları:
- Tüm kodun tek bir yerde olması, bağımlılık yönetimini kolaylaştırır.
- Değişikliklerin tüm projelerde senkronize edilmesi gerektiğinde avantaj sağlar.
- CI/CD pipeline’larının tek bir yerde yönetilmesini sağlar.
Multi-repo avantajları:
- Her proje bağımsız olarak yönetilebilir.
- Repository’ler arasında erişim kontrolü daha kolaydır.
- Farklı ekiplerin farklı projeler üzerinde çalışması daha esnektir.
Örnek:
# Monorepo yapısı
my-project/
├── backend/
├── frontend/
├── infrastructure/
└── shared/
# Multi-repo yapısı
my-project-backend/
my-project-frontend/
my-project-infrastructure/
2. .gitignore Dosyasının Doğru Yapılandırılması
Repository’nize yanlış dosyaların commit edilmesini önlemek için .gitignore dosyasını doğru şekilde yapılandırın. Örneğin:
# Node.js projeleri için
node_modules/
.env
*.log
*.swp
.DS_Store
# Docker projeleri için
docker-compose.override.yml
.env
# IDE dosyaları
.idea/
.vscode/
*.sublime-workspace
3. Commit Mesajı Kurallarının Belirlenmesi
Commit mesajları, projenin tarihçesini anlamak ve takım içi iletişimi kolaylaştırmak için kritiktir. Conventional Commits standardını kullanabilirsiniz:
<type>(<scope>): <subject>
<type> değerleri:
- feat: yeni bir özellik ekler
- fix: bir hata düzeltir
- docs: sadece dokümantasyon değişiklikleri
- style: kod stilinde değişiklikler (format, boşluklar vb.)
- refactor: kod refaktörü (yeni özellik veya hata düzeltmesi olmadan)
- perf: performans iyileştirmeleri
- test: test ekleme veya düzeltme
- chore: derleme sistemleri, paket yöneticileri gibi değişiklikler
Örnek:
feat(auth): login sayfasına Google OAuth desteği ekle
fix(api): GET /users endpoint'inde pagination hatası düzelt
Branch Stratejisinin Belirlenmesi
Doğru bir branch stratejisi, kodunuzun stabil kalmasını ve deploy süreçlerinin sorunsuz ilerlemesini sağlar. En yaygın kullanılan branch stratejileri:
1. Git Flow
Git Flow, büyük projelerde sıkça kullanılan bir branch stratejisidir. Temel branch’ler:
- main: Üretimdeki kodun bulunduğu branch (eski adıyla
master). - develop: Geliştirme branch’i, tüm yeni özelliklerin birleştirildiği yer.
- feature/*: Yeni özelliklerin geliştirildiği branch’ler.
- release/*: Üretime hazırlanan sürümler için kullanılan branch’ler.
- hotfix/*: Üretimde bulunan kritik hataların düzeltilmesi için kullanılan branch’ler.
Örnek Git Flow süreci:
# Yeni bir özellik branch'i oluştur
git checkout -b feature/user-authentication develop
# Geliştirme tamamlandıktan sonra develop branch'ine merge
git checkout develop
git merge --no-ff feature/user-authentication
# Release branch'i oluştur
git checkout -b release/1.2.0 develop
# Release branch'inde son kontroller yapıldıktan sonra main'e merge
git checkout main
git merge --no-ff release/1.2.0
# Etiket oluştur
git tag -a v1.2.0 -m "Sürüm 1.2.0"
2. GitHub Flow
GitHub Flow, daha basit ve sürekli deploy yapılabilen projeler için uygundur. Temel kurallar:
- main branch her zaman deploy edilebilir durumda olmalıdır.
- Yeni özellikler
feature/*branch’lerinde geliştirilir ve pull request üzerinden main’e merge edilir. - Kritik hatalar için doğrudan main branch’inde
hotfix/*branch’leri oluşturulabilir.
Örnek GitHub Flow süreci:
# Yeni bir özellik branch'i oluştur
git checkout -b feature/add-dark-mode main
# Geliştirme tamamlandıktan sonra pull request oluştur
git push origin feature/add-dark-mode
# Pull request review ve onayından sonra main'e merge
3. Trunk-Based Development
Trunk-Based Development, küçük ve sık deploy yapılabilen projeler için idealdir. Temel prensipler:
- Tüm geliştiriciler doğrudan
mainbranch’inde çalışır. - Küçük ve sık commit’ler yapılır.
- Feature flag’leri kullanılarak özellikler gizlenir.
Örnek Trunk-Based Development süreci:
# Doğrudan main branch'inde çalış
git checkout main
git pull origin main
# Küçük bir değişiklik yap ve commit et
git add .
git commit -m "feat: dark mode için temel stil ayarları"
git push origin main
CI/CD Pipeline Kurulumu
CI/CD (Continuous Integration/Continuous Deployment), kod değişikliklerinin otomatik olarak test edilmesini ve deploy edilmesini sağlayan bir süreçtir. Git repository’leriyle entegre çalışan CI/CD pipeline’ları, deploy akışınızın temelini oluşturur.
1. CI/CD Araçlarının Seçimi
En popüler CI/CD araçları:
| Araç | Açıklama | Avantajları | Dezavantajları |
|---|---|---|---|
| GitHub Actions | GitHub repository’leriyle doğrudan entegre | Kolay kurulum, ücretsiz plan | Sınırlı paralel işlem |
| GitLab CI/CD | GitLab repository’leriyle entegre | Tümleşik çözüm, ücretsiz plan | GitLab’a bağımlılık |
| Jenkins | Açık kaynaklı, esnek | Yüksek özelleştirme, geniş plugin desteği | Karmaşık kurulum, bakım gerektirir |
| CircleCI | Bulut tabanlı CI/CD | Kolay kullanım, hızlı işlem | Ücretli planlar pahalı olabilir |
| Azure DevOps | Microsoft’un CI/CD çözümü | Tümleşik Azure hizmetleriyle çalışır | Microsoft ekosistemine bağımlılık |
2. GitHub Actions ile CI/CD Pipeline Kurulumu
GitHub Actions, GitHub repository’leriyle doğrudan entegre olan ve ücretsiz olarak kullanılabilen bir CI/CD aracıdır. Örnek bir pipeline kurulumu:
Adım 1: .github/workflows Dizini Oluşturma
mkdir -p .github/workflows
Adım 2: Pipeline Dosyası Oluşturma
Örneğin, Node.js projesi için bir pipeline oluşturmak istiyoruz. .github/workflows/deploy.yml dosyasını oluşturun:
name: Node.js CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Node.js kurulumu
uses: actions/setup-node@v4
with:
node-version: 20
- name: Bağımlılıkları yükle
run: npm install
- name: Testleri çalıştır
run: npm test
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Node.js kurulumu
uses: actions/setup-node@v4
with:
node-version: 20
- name: Bağımlılıkları yükle
run: npm install
- name: Build işlemi
run: npm run build
- name: Deploy işlemi
run: |
echo "Deploy işlemi burada gerçekleştirilecek"
# Örneğin, AWS S3'e deploy:
# aws s3 sync ./dist s3://my-bucket --delete
Adım 3: Pipeline’ı Test Etme
Yapılan değişiklikleri commit edin ve GitHub repository’sine push edin:
git add .
git commit -m "ci: GitHub Actions pipeline ekle"
git push origin main
GitHub repository’sindeki Actions sekmesinden pipeline’ın çalıştığını görebilirsiniz.
3. GitLab CI/CD ile CI/CD Pipeline Kurulumu
GitLab CI/CD, GitLab repository’leriyle entegre olan ve ücretsiz olarak kullanılabilen bir CI/CD aracıdır. Örnek bir pipeline kurulumu:
Adım 1: .gitlab-ci.yml Dosyası Oluşturma
stages:
- test
- deploy
variables:
NODE_VERSION: "20"
test:
stage: test
image: node:$NODE_VERSION
script:
- npm install
- npm test
deploy:
stage: deploy
image: node:$NODE_VERSION
script:
- npm install
- npm run build
- echo "Deploy işlemi burada gerçekleştirilecek"
# Örneğin, AWS S3'e deploy:
# aws s3 sync ./dist s3://my-bucket --delete
only:
- main
Adım 2: Pipeline’ı Test Etme
Yapılan değişiklikleri commit edin ve GitLab repository’sine push edin:
git add .
git commit -m "ci: GitLab CI/CD pipeline ekle"
git push origin main
GitLab repository’sindeki CI/CD > Pipelines sekmesinden pipeline’ın çalıştığını görebilirsiniz.
Deploy Stratejileri ve Üretime Geçiş
Deploy stratejileri, uygulamanızın üretim ortamına nasıl geçeceğini belirler. Doğru bir deploy stratejisi, downtime’ı minimize eder ve kullanıcı deneyimini iyileştirir. En yaygın deploy stratejileri:
1. Blue-Green Deploy
Blue-Green Deploy, iki ayrı ortam kullanarak (blue ve green) sıfır downtime ile deploy yapılmasını sağlar. Süreç:
- Blue ortamı: Mevcut üretim ortamı.
- Green ortamı: Yeni sürümün deploy edildiği ortam.
- Testler tamamlandıktan sonra: Trafik green ortama yönlendirilir.
- Blue ortamı yedek olarak saklanır: Geri dönüş için.
Avantajları:
- Sıfır downtime.
- Kolay geri dönüş.
Dezavantajları:
- İki ortamın aynı anda çalışması için kaynak gerektirir.
- Veritabanı değişiklikleri için dikkatli olunmalıdır.
Örnek (AWS Elastic Beanstalk ile Blue-Green Deploy):
# Yeni sürümü green ortamına deploy et
aws elasticbeanstalk create-environment --environment-name myapp-green --version-label v2
# Trafiği green ortama yönlendir
aws elasticbeanstalk swap-environment-cnames --source-name myapp-blue --target-name myapp-green
2. Canary Deploy
Canary Deploy, yeni sürümün küçük bir kullanıcı grubuna (örneğin %5) yönlendirilmesini ve sorunsuz çalıştığı takdirde tüm kullanıcılara yayılmasını sağlar. Süreç:
- Yeni sürüm, canary grubuna deploy edilir.
- Canary grubundaki kullanıcılar yeni sürümü kullanır.
- Metrikler ve hata oranları izlenir.
- Eğer her şey yolunda ise, yeni sürüm tüm kullanıcılara yayılır.
Avantajları:
- Risk azaltma.
- Geri dönüş kolaylığı.
Dezavantajları:
- Kullanıcı deneyiminde tutarsızlık olabilir.
- İzleme ve analiz gerektirir.
Örnek (Kubernetes ile Canary Deploy):
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-canary
spec:
replicas: 1
selector:
matchLabels:
app: myapp
track: canary
template:
metadata:
labels:
app: myapp
track: canary
spec:
containers:
- name: myapp
image: myapp:v2
ports:
- containerPort: 80
3. Rolling Deploy
Rolling Deploy, mevcut ortamdaki sunucuların sırayla yeni sürümle güncellenmesini sağlar. Süreç:
- Bir sunucu yeni sürümle güncellenir.
- Güncellenen sunucu test edilir.
- Bir sonraki sunucu güncellenir.
- Tüm sunucular güncellenene kadar devam eder.
Avantajları:
- Düşük kaynak kullanımı.
- Kademeli olarak güncelleme.
Dezavantajları:
- Kullanıcılar arasında geçici tutarsızlık olabilir.
- Geri dönüş karmaşık olabilir.
Örnek (Docker Swarm ile Rolling Deploy):
# Yeni sürümü deploy et
docker service update --image myapp:v2 myapp_service
# Süreci izle
docker service ps myapp_service
4. Feature Flags ile Deploy
Feature Flags, özellikleri gizleyerek deploy yapılmasını ve kullanıcıların istedikleri zaman yeni özellikleri kullanabilmesini sağlar. Süreç:
- Yeni özellikler feature flag’leriyle birlikte deploy edilir.
- Feature flag’leri kapalı olarak bırakılır.
- İstenildiğinde feature flag’leri açılarak özellik kullanıma sunulur.
Avantajları:
- Sıfır riskli deploy.
- Kullanıcı deneyimini kontrol etme.
Dezavantajları:
- Kod karmaşıklığı artabilir.
- Feature flag’lerinin yönetimi gerektirir.
Örnek (LaunchDarkly ile Feature Flags):
// Feature flag kontrolü
const isFeatureEnabled = launchdarklyClient.variation('new-feature', user, false);
if (isFeatureEnabled) {
// Yeni özellikleri kullan
} else {
// Eski davranışı kullan
}
Güvenlik ve İzlenebilirlik
Deploy süreçlerinde güvenlik ve izlenebilirlik, projenizin güvenilirliğini ve yönetilebilirliğini artırır. İşte dikkat edilmesi gerekenler:
1. Deploy Anahtarlarının Yönetimi
Deploy işlemlerinde kullanılan API anahtarları, şifreler ve sertifikalar güvenli bir şekilde saklanmalıdır. En iyi uygulamalar:
- Environment Variables: Anahtarları koddan ayırarak environment variables olarak saklayın.
- Secret Management Araçları: AWS Secrets Manager, HashiCorp Vault, Azure Key Vault gibi araçları kullanın.
- CI/CD Entegrasyonu: CI/CD pipeline’larında secret’ları güvenli bir şekilde kullanın.
Örnek (GitHub Actions ile Secret Yönetimi):
- name: Deploy işlemi
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: |
aws s3 sync ./dist s3://my-bucket --delete
2. Log Yönetimi ve İzlenebilirlik
Deploy süreçlerinde oluşan log’ların izlenmesi, sorunların hızlıca tespit edilmesini sağlar. En iyi uygulamalar:
- Centralized Logging: Tüm log’ları tek bir yerde toplamak için ELK Stack (Elasticsearch, Logstash, Kibana) veya Splunk kullanın.
- Structured Logging: JSON formatında log’lar yazın.
- Alerting: Kritik hatalar için uyarılar oluşturun (örneğin, Prometheus + Grafana).
Örnek (Node.js ile Structured Logging):
const { createLogger, transports, format } = require('winston');
const logger = createLogger({
level: 'info',
format: format.combine(
format.timestamp(),
format.json()
),
transports: [
new transports.Console(),
new transports.File({ filename: 'combined.log' })
]
});
logger.info('Deploy işlemi başladı', { version: '1.2.0', environment: 'production' });
3. Geri Dönüş Planı ve Rollback Stratejisi
Deploy sonrasında oluşabilecek sorunlara karşı geri dönüş planı hazırlamak kritik önem taşır. Geri dönüş planı:
- Hızlı Tespit: Sorunun ne olduğunu ve nereden kaynaklandığını hızlıca tespit edin.
- Geri Dönüş Mekanizması: Mevcut stabil sürüme geri dönmek için mekanizma oluşturun.
- İletişim Planı: Kullanıcılara ve takım üyelerine durum hakkında bilgi verin.
Örnek (Kubernetes ile Rollback):
# Son deployment'ı listele
kubectl get deployments
# Rollback yap
kubectl rollout undo deployment/myapp
# Rollback durumunu izle
kubectl rollout status deployment/myapp
Sık Karşılaşılan Sorunlar ve Çözümleri
Deploy süreçlerinde karşılaşılan yaygın sorunlar ve çözümleri:
| Sorun | Nedeni | Çözümü |
|---|---|---|
| Deploy sonrası uygulama çalışmıyor | Bağımlılık eksikliği, yanlış konfigürasyon | Bağımlılıkları kontrol et, konfigürasyon dosyalarını doğrula |
| Yavaş deploy süreci | Büyük dosyalar, yavaş ağ | Dosyaları sıkıştır, CDN kullan, deploy sürecini optimize et |
| Rollback sırasında veri kaybı | Veritabanı değişiklikleri geri alınamıyor | Veritabanı değişikliklerini deploy öncesinde planla, migration script’leri kullan |
| Feature flag’leriyle ilgili sorunlar | Yanlış flag konfigürasyonu | Feature flag’lerini test ortamında doğrula, log’ları incele |
| CI/CD pipeline’ında hata | Yanlış konfigürasyon, bağımlılık sorunları | Pipeline log’larını incele, bağımlılıkları güncelle |
| Güvenlik açıkları | Eski bağımlıklar, yanlış izinler | Dependency scanning yap, güvenlik testleri uygula |
| Deploy sonrası performans düşüşü | Kaynak kısıtlamaları, yanlış ayarlar | Kaynakları artır, performans testleri uygula |
Sonuç ve Öneriler
Git repository’leriyle deploy akışı oluşturmak, modern yazılım geliştirme süreçlerinin vazgeçilmez bir parçasıdır. Doğru bir deploy akışı, kodunuzun güvenilirliğini, performansını ve yönetilebilirliğini artırır. İşte bu rehberde ele aldığımız ana noktalar:
- Git Repository Yapısı: Doğru bir repository yapısı, deploy süreçlerinin temelini oluşturur. Monorepo veya multi-repo kararını projenizin ihtiyaçlarına göre verin.
- Branch Stratejisi: Git Flow, GitHub Flow veya Trunk-Based Development gibi stratejilerden projenize en uygun olanını seçin.
- CI/CD Pipeline Kurulumu: GitHub Actions, GitLab CI/CD veya Jenkins gibi araçlarla otomatik test ve deploy süreçleri oluşturun.
- Deploy Stratejileri: Blue-Green, Canary, Rolling Deploy veya Feature Flags gibi stratejilerle sıfır downtime ve güvenli deploy’lar gerçekleştirin.
- Güvenlik ve İzlenebilirlik: Deploy süreçlerinde güvenlik ve log yönetimine önem verin. Geri dönüş planları hazırlayın.
- Sorun Giderme: Deploy süreçlerinde karşılaşılan sorunları hızlıca tespit edip çözüm üretin.
Öneriler
- Başlangıçta Basit Başlayın: İlk etapta basit bir CI/CD pipeline’ı kurun ve zamanla karmaşıklığı artırın.
- Otomatik Testlere Önem Verin: Unit testler, entegrasyon testleri ve E2E testleriyle kodunuzun kalitesini artırın.
- Güvenlik Testlerini Unutmayın: Dependency scanning, statik kod analizi ve güvenlik testleriyle güvenlik açıklarını önleyin.
- İzlenebilirlik Sağlayın: Tüm deploy süreçlerini log’layın ve izleyin.
- Takım İçi İletişimi Güçlendirin: Deploy süreçlerinde takım üyeleri arasında açık iletişim kurun.
Git repository’leriyle deploy akışı oluşturmak, teknik kariyerinizde önemli bir adım olacaktır. Bu rehberde ele aldığımız adımları takip ederek, projelerinizi daha güvenilir, verimli ve yönetilebilir hale getirebilirsiniz. İyi kodlamalar! 🚀
Bu yazı Mistral ile otomatik oluşturulmuştur.