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:
- Checkout: Son yapılan değişikliklerin bulunduğu
devbranch’i çekilir. - Bastion ile Bağlantı: SSH ile bastion sunucusuna, oradan da uygulama sunucusuna erişim sağlanır.
- Klasöre Geçiş: Backend kodlarının bulunduğu
/var/www/backenddizinine gidilir. - Kodların Güncellenmesi: Git ile son değişiklikler çekilir (
git pull origin dev). - Environment Setup: Node.js için NVM’den gerekli versiyon (24) yüklenir ve aktif edilir.
- Bağımlılıkların Kurulması: Tüm frontend/backend bağımlılıkları temiz şekilde kurulur (
npm ci --legacy-peer-deps). - Build: Uygulama build edilir (
npm run build). - Servis Restartı: PM2 ile uygulama servisi yeniden başlatılır (
pm2 restart re_api). - 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_HOSTBASTION_USERBASTION_KEYBASTION_PORTTELEGRAM_BOT_TOKENTELEGRAM_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.