Monorepo CI/CD'de Sadece Değişenleri Derle
Monorepo'da naif bir CI/CD pipeline her commit'te tüm repo'yu yeniden derler. Proje büyüdükçe build süresi artar, tam da başarı gösterdikçe pipeline yavaşlar. Bu sorunun çözümü: etkilenen bölümleri tespit et, bağımlılık ağında genişlet, sadece o dilimi derle ve test et.
İlk adım basit: GitHub Actions'da path filter kullan. Örneğin, `packages/api` klasörü değişirse sadece API testleri çalışsın, frontend dokunmasın. Dosya yollarına göre workflow tetiklemek hızlı bir başlangıç.
```yaml
on:
push:
paths:
- 'packages/api/**'
- '.github/workflows/api.yml'
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: npm test --workspace=@myapp/api
```
Ancak repo büyüdükçe bağımlılıklar karmaşıklaşır. A paketi B'ye, B de C'ye bağlıysa, C değişince A ve B'yi de derlemen gerekir. Path filter bunu otomatik yapamaz.
Bu noktada Nx, Turborepo ya da Bazel devreye girer. Bu araçlar dependency graph'ı okur, etkilenen paketleri ve onlara bağlı olanları bulur. Remote caching sayesinde daha önceki build'ler yeniden kullanılır, hiç derlemek gerekmez.
```bash
# Nx ile: sadece etkilenen paketleri derle
nx affected --target=build --base=main
```
Main branch'i korumak da önemli. Required checks koy: tüm etkilenen testler geçmeli. Merge queue (GitHub'da "merge groups") ekle, böylece aynı anda birden fazla PR'ın race condition'ı yaşamaması sağla.
Pratik ipucu: Başla path filter'larla, metrikler takip et (build süresi, cache hit oranı). Grafik karmaşıklaştığında, mesela 50+ paket varsa, build tool'a geç. Zaten yatırım küçük, fayda büyük.
0 yorum