Ana içeriğe geç

CI/CD

Bu projede CI/CD (Continuous Integration / Continuous Deployment - Sürekli Entegrasyon ve Sürekli Dağıtım) süreçleri GitHub Actions üzerinden yönetilmektedir. Geliştiriciler kodlarını belirli branch’lere push’ladıklarında otomatik olarak tetiklenen workflow’lar sayesinde uygulamanın güncellenmesi, test edilmesi ve dağıtımı gerçekleştirilir.

Ortamlar (Environments)

Şu anda 2 ana ortamımız mevcut:

  • dev
  • prod

Yakın gelecekte, release’ler için bir preprod ortamı eklenmesi planlanmaktadır.

Dosya yapısı şu şekildedir:

.github
└── workflows
├── dev-deployment.yml
├── main-deployment.yml
└── preprod-deployment.yml

Örnek Workflow: Dev Ortamı

Aşağıda backend için kullanılan bir GitHub Actions workflow örneğini görebilirsiniz. Bu yapı, dev branch’ine yapılan push’larda otomatik olarak tetiklenir ve kodun bastion sunucusu üzerinden uygulama sunucusuna (App VM) dağıtılmasını sağlar.

name: "DEV Deployment Flow"

on:
push:
branches: [dev]

jobs:
build:
name: "Bastion to App Deployment"
runs-on: ubuntu-latest

steps:
- name: "📍 Checkout DEV Branch"
uses: actions/checkout@v4
with:
ref: dev
fetch-depth: 0

- name: "🚀 Connect to Bastion & Deploy to App VM"
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.BASTION_HOST }}
username: ${{ secrets.BASTION_USER }}
key: ${{ secrets.BASTION_KEY }}
port: ${{ secrets.BASTION_PORT }}
script: |
echo "🔌 Connected to Bastion. Jumping to App VM via 'dev_app'..."

ssh -T dev_app << 'ENDSSH'
set -e

echo "📂 Navigating to /var/www/backend..."
cd /var/www/backend

echo "⬇️ Pulling latest code..."
git pull origin dev

echo "🟢 Loading NVM and Node 24..."
[ -s "$HOME/.nvm/nvm.sh" ] && \. "$HOME/.nvm/nvm.sh"
nvm use 24

echo "📦 Installing dependencies..."
npm ci --legacy-peer-deps

echo "🔨 Building Application..."
npm run build

echo "🔄 Restarting re_api..."
pm2 restart re_api

echo "✅ Deployment Scripts Finished Successfully."
ENDSSH

- name: "✈️ Telegram Notification"
if: success()
run: |
COMMIT_MSG=$(git log -1 --pretty=format:'%s')
SAFE_COMMIT_MSG=$(echo "$COMMIT_MSG" | sed 's/"/\\"/g')

MESSAGE="🔥 *[NEW API]* DEV Deployment Successful%0A%0A📝 *Commit:* \`$SAFE_COMMIT_MSG\`"

curl -s -X POST "https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage" \
-d chat_id="${{ secrets.TELEGRAM_CHAT_ID }}" \
-d text="$MESSAGE" \
-d parse_mode="Markdown"

Adım Adım Deployment Süreci

Bu workflow’da gerçekleşen temel adımlar aşağıdaki gibidir:

  1. Checkout: Son yapılan değişikliklerin bulunduğu dev branch’i çekilir.
  2. Bastion ile Bağlantı: SSH ile bastion sunucusuna, oradan da uygulama sunucusuna erişim sağlanır.
  3. Klasöre Geçiş: Backend kodlarının bulunduğu /var/www/backend dizinine gidilir.
  4. Kodların Güncellenmesi: Git ile son değişiklikler çekilir (git pull origin dev).
  5. Environment Setup: Node.js için NVM’den gerekli versiyon (24) yüklenir ve aktif edilir.
  6. Bağımlılıkların Kurulması: Tüm frontend/backend bağımlılıkları temiz şekilde kurulur (npm ci --legacy-peer-deps).
  7. Build: Uygulama build edilir (npm run build).
  8. Servis Restartı: PM2 ile uygulama servisi yeniden başlatılır (pm2 restart re_api).
  9. Telegram Bildirimi: Dağıtım başarıyla tamamlanınca, son commit mesajı ile birlikte Telegram’dan ilgili kanala otomatik olarak bilgi verilir.

Gizli Değişkenler (Secrets)

Workflow’un güvenli şekilde çalışması için aşağıdaki environment secret’lar, GitHub organizasyonunda tanımlanmalıdır:

  • BASTION_HOST
  • BASTION_USER
  • BASTION_KEY
  • BASTION_PORT
  • TELEGRAM_BOT_TOKEN
  • TELEGRAM_CHAT_ID

Her ortam (örneğin: prod, dev, preprod) için farklı workflow dosyaları oluşturulabilir ve bunlarda gerekli özelleştirmeler (branch adı, ortam değişkenleri vs) yapılabilir.