CI/CD Nedir? GitHub Actions ile Otomatik Deploy
CI/CD nedir, neden önemli? GitHub Actions ile test, build ve otomatik deploy’u adım adım kurun. Örnek workflow dosyasıyla.
CI/CD Nedir? GitHub Actions ile Otomatik Deploy
Meta Description
CI/CD nedir? GitHub Actions ile test, build ve otomatik deploy’u adım adım kurun. Hataları azaltın, yayın hızını artırın.
Giriş (Introduction)
Ürünü yayınlamak çoğu ekipte hâlâ “sunucuya bağlan, komut çalıştır, umarım bozulmaz” ritüeliyle ilerliyor. Bir noktada tek bir yanlış komut, eksik env değişkeni veya unutulan migration; hem kullanıcıyı hem ekibi yakabiliyor.
İşte bu yüzden CI/CD (Continuous Integration / Continuous Delivery-Deployment) artık “kurumsal lüks” değil, küçük ekipler ve girişimler için bile bir hayatta kalma standardı. Bu yazıda CI/CD nedir sorusunu netleştirip, GitHub Actions ile sıfırdan otomatik deploy kurgusunu adım adım kuracağız.
Okuyunca şunları yapabilir olacaksınız: her push’ta testlerin otomatik çalışması, build alınması, sürümün paketlenmesi ve güvenli şekilde sunucuya deploy edilmesi.
Ana İçerik
1) CI/CD Nedir? (Kısa ama Net)
CI (Continuous Integration): Koda her değişiklik geldiğinde (push/PR), otomatik olarak testlerin çalışması ve hataların erken yakalanması.
CD (Continuous Delivery/Deployment):
- Continuous Delivery: Build çıktısı otomatik hazırlanır; prod’a almak tek onay ile olur.
- Continuous Deployment: Testler geçerse prod’a otomatik alınır.
Bunu neden yapmalıyım?
- Yayın süresi kısalır (dakikalar)
- “Bende çalışıyordu” problemleri azalır
- Geri alma (rollback) daha kolay olur
- Yeni geliştirici onboarding’i hızlanır
LSI anahtar kelimeler: otomatik deploy, pipeline, build & test otomasyonu, release yönetimi, GitHub Actions workflow.
2) GitHub Actions Neden Popüler? Alternatiflerle Kıyas
GitHub Actions’ın en büyük avantajı, kodun zaten GitHub’ta olduğu yerde pipeline’ın da yönetilmesi.
| Araç | Artı | Eksi | Kimler için iyi? |
|---|---|---|---|
| GitHub Actions | GitHub’a entegre, ücretsiz kotalar, marketplace | Karmaşık senaryolarda YAML yönetimi zorlaşabilir | Startup, open-source, küçük-orta ekip |
| GitLab CI | CI/CD odaklı güçlü | GitLab’a taşınma gerekebilir | DevOps olgun ekip |
| Jenkins | Esnek ve güçlü | Bakımı zahmetli | Büyük, özelleşmiş altyapılar |
3) Hedef Senaryo: Node.js API’yi Sunucuya Otomatik Deploy
Gerçek hayatta sık görülen bir senaryo kuralım:
- Repo: Node.js (örnek: Express/Nest)
- Her
mainpush’unda:npm ci- test
- build
- paketle
- sunucuya kopyala
- servisi yeniden başlat (PM2/systemd)
Not: Docker kullanan ekiplerde “paketle” kısmı yerine image build/push + server pull yapılır. Bu yazıda Docker’sız klasik VPS senaryosu üzerinden gideceğim.
4) Ön Hazırlık: Sunucuyu ve Güvenliği Doğru Ayarla
4.1 Sunucuda bir deploy kullanıcısı
Prod sunucuda root ile deploy yerine ayrı kullanıcı idealdir:
deployadlı kullanıcı- Uygulama dizini:
/var/www/myapp
4.2 SSH key ve GitHub Secrets
GitHub Actions’ın sunucuya bağlanması için SSH private key gerekir.
GitHub repo → Settings → Secrets and variables → Actions içine ekleyin:
SSH_HOST(örn:1.2.3.4)SSH_USER(örn:deploy)SSH_KEY(private key içeriği)SSH_PORT(opsiyonel, örn22)
Güvenlik ipucu: Private key şifresiz olabilir ama bu key sadece deploy için sınırlı yetkide olmalı.
5) GitHub Actions Workflow: CI/CD Pipeline Dosyası
Repo içine şu dosyayı ekleyin:
.github/workflows/deploy.yml
Aşağıdaki örnek; test + build + rsync ile gönderme + restart akışını kurar:
name: CI/CD Deploy
on:
push:
branches: ["main"]
jobs:
build-test-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build
run: npm run build
- name: Prepare SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -p ${{ secrets.SSH_PORT || 22 }} ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts
- name: Upload files (rsync)
run: |
rsync -avz --delete \
--exclude ".git" \
--exclude "node_modules" \
-e "ssh -p ${{ secrets.SSH_PORT || 22 }}" \
./ ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:/var/www/myapp
- name: Install & restart on server
run: |
ssh -p ${{ secrets.SSH_PORT || 22 }} ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'EOF'
set -e
cd /var/www/myapp
npm ci --omit=dev
# örnek: migration gerekiyorsa
# npm run migrate
# PM2 kullanıyorsanız:
pm2 restart myapp || pm2 start dist/main.js --name myapp
pm2 save
EOF
5.1 Bu workflow neyi çözüyor?
- CI tarafı: Her push’ta test koşuyor → hatayı prod’a gitmeden yakalıyorsunuz.
- CD tarafı: Kod otomatik aktarılıyor + servis otomatik restart.
5.2 Yaygın hata: known_hosts ve ilk SSH bağlantısı
ssh-keyscan satırı, Actions runner’ın sunucuya ilk bağlantıda “Are you sure you want to continue connecting?” sorusuna takılmasını engeller.
6) Versiyonlama, Rollback ve “Korkmadan Yayın” Pratikleri
CI/CD kurunca yayın hızlanır; ama esas kazanım kontrol.
6.1 Tag/Release stratejisi
- Her anlamlı sürümde Git tag atın:
v1.4.0 - İsterseniz workflow’u
on: push: tags:ile sadece tag’lerde deploy edecek hale getirin.
6.2 Basit rollback fikri
Sunucuda her deploy öncesi bir önceki sürümü klasör olarak saklayabilirsiniz:
/var/www/myapp_current/var/www/myapp_releases/2026-01-16_1200- symlink ile switch
Bu yaklaşım, “bir önceki sürüme dön” ihtiyacını dakikalara indirir.
6.3 Ortam değişkenleri (env) yönetimi
Env değerlerini repoya koymayın. Sunucuda /.env ayrı dursun veya secret manager kullanın.
Kural: CI/CD kodu taşır, sırları taşımaz.
7) Gerçek Hayattan Örnek: “Cuma Akşamı Deploy” Kabusunu Bitirmek
Bir SaaS ekibinde klasik senaryo: Cuma 18:30’da manuel deploy, biri migration’ı unutur, servis açılır ama bazı endpoint’ler 500 döner. Panik, rollback, hafta sonu nöbet.
CI/CD ile:
- PR aşamasında testler kırmızıysa merge olmaz
main’e giren kod otomatik build edilir- Deploy adımı standarttır, “kim hangi komutu çalıştırdı” belirsizliği yoktur
- Gerekirse tag’li sürüme dönersiniz
Sonuç: yayın süreci kişiye bağlı olmaktan çıkar, sisteme bağlı olur.
Sık Sorulan Sorular (FAQ)
1) CI/CD nedir, gerçekten küçük projeye değer mi?
Evet. Küçük projelerde manuel hatalar daha maliyetlidir çünkü çoğu zaman ayrı bir DevOps kişi yoktur. CI/CD “tek kişilik ekip” için bile sigortadır.
2) GitHub Actions ücretsiz mi?
Public repolarda geniş ölçüde ücretsizdir. Private repolarda planınıza göre dakika kotası vardır. Çoğu küçük-orta proje için yeterli olur.
3) Prod’a otomatik deploy riskli değil mi?
Risk, otomasyon değil; kontrolsüz yayındır. Test, onay (manual approval), tag ile deploy gibi mekanizmalarla güvenli hale getirilebilir.
4) Docker kullanıyorsam bu akış değişir mi?
Evet. Dosya rsync yerine image build/push, sunucuda pull + container restart akışı kullanılır. Mantık aynı: test → build → deploy.
Sonuç
Bu yazıda CI/CD nedir sorusunu netleştirip, GitHub Actions ile otomatik deploy kurgusunu uçtan uca kurdunuz: test, build, sunucuya aktarım ve servis restart.
Şimdi aksiyon zamanı: Workflow’u kendi projenize uyarlayın (dizin, PM2 adı, build komutu). Takıldığınız noktayı yorum olarak yazın; kullandığınız stack’i (Node/Nest/React vs.) belirtin, birlikte netleştirelim. Ayrıca ekipte birine paylaşın—CI/CD en hızlı “takım standardı” olunca değer üretir.