Skip to content
Bloga dön
Rehber Git CI/CD Deploy GitHub Actions GitLab CI Jenkins DevOps Yazılım Mühendisliği Otomatikleştirme Mistral

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ı

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 main branch’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çıklamaAvantajlarıDezavantajları
GitHub ActionsGitHub repository’leriyle doğrudan entegreKolay kurulum, ücretsiz planSınırlı paralel işlem
GitLab CI/CDGitLab repository’leriyle entegreTümleşik çözüm, ücretsiz planGitLab’a bağımlılık
JenkinsAçık kaynaklı, esnekYüksek özelleştirme, geniş plugin desteğiKarmaşık kurulum, bakım gerektirir
CircleCIBulut tabanlı CI/CDKolay kullanım, hızlı işlemÜcretli planlar pahalı olabilir
Azure DevOpsMicrosoft’un CI/CD çözümüTümleşik Azure hizmetleriyle çalışırMicrosoft 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ç:

  1. Blue ortamı: Mevcut üretim ortamı.
  2. Green ortamı: Yeni sürümün deploy edildiği ortam.
  3. Testler tamamlandıktan sonra: Trafik green ortama yönlendirilir.
  4. 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ç:

  1. Yeni sürüm, canary grubuna deploy edilir.
  2. Canary grubundaki kullanıcılar yeni sürümü kullanır.
  3. Metrikler ve hata oranları izlenir.
  4. 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ç:

  1. Bir sunucu yeni sürümle güncellenir.
  2. Güncellenen sunucu test edilir.
  3. Bir sonraki sunucu güncellenir.
  4. 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ç:

  1. Yeni özellikler feature flag’leriyle birlikte deploy edilir.
  2. Feature flag’leri kapalı olarak bırakılır.
  3. İ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ı:

  1. Hızlı Tespit: Sorunun ne olduğunu ve nereden kaynaklandığını hızlıca tespit edin.
  2. Geri Dönüş Mekanizması: Mevcut stabil sürüme geri dönmek için mekanizma oluşturun.
  3. İ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:

SorunNedeniÇözümü
Deploy sonrası uygulama çalışmıyorBağımlılık eksikliği, yanlış konfigürasyonBağımlılıkları kontrol et, konfigürasyon dosyalarını doğrula
Yavaş deploy süreciBü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ıyorVeritabanı değişikliklerini deploy öncesinde planla, migration script’leri kullan
Feature flag’leriyle ilgili sorunlarYanlış flag konfigürasyonuFeature flag’lerini test ortamında doğrula, log’ları incele
CI/CD pipeline’ında hataYanlış 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ış izinlerDependency scanning yap, güvenlik testleri uygula
Deploy sonrası performans düşüşüKaynak kısıtlamaları, yanlış ayarlarKaynakları 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:

  1. 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.
  2. Branch Stratejisi: Git Flow, GitHub Flow veya Trunk-Based Development gibi stratejilerden projenize en uygun olanını seçin.
  3. CI/CD Pipeline Kurulumu: GitHub Actions, GitLab CI/CD veya Jenkins gibi araçlarla otomatik test ve deploy süreçleri oluşturun.
  4. Deploy Stratejileri: Blue-Green, Canary, Rolling Deploy veya Feature Flags gibi stratejilerle sıfır downtime ve güvenli deploy’lar gerçekleştirin.
  5. Güvenlik ve İzlenebilirlik: Deploy süreçlerinde güvenlik ve log yönetimine önem verin. Geri dönüş planları hazırlayın.
  6. 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.