Azərbaycan startapı üçün sıfırdan CI/CD pipeline qurmaq
Hər git push-dan sonra əl ilə deploy edən developer yoldaşlar, bu məqalə sizin üçündür. GitHub Actions ilə sıfırdan CI/CD qururuq — real kod, real ssenari.
Azərbaycan startapı üçün sıfırdan CI/CD pipeline qurmaq
Salam, developer dostlar! Bakıda bir startapda işləyirsən, komandanız 3-5 nəfərdir, hər dəfə deploy vaxtı gələndə kimsə SSH ilə serverə girib git pull yazır, sonra npm run build qoşur, sonra bir şey sınır, sonra 2 saat hotfix... Tanış gəlir? Bu məqalədə bu əzabı bitiririk.
Bu gün real bir ssenari üzərindən — Node.js (Express) backend + DigitalOcean droplet — tam işlək CI/CD pipeline quracağıq. Pulsuzdur, 30 dəqiqəyə hazırdır.
Niyə CI/CD? Niyə indi?
Əvvəlcə rəqəmlərə baxaq. 2025-ci ilin DORA (DevOps Research and Assessment) hesabatına görə:
- CI/CD istifadə edən komandalar 208 dəfə daha tez deploy edir
- Deployment uğursuzluqları 3 dəfə az olur
- Xətadan sonra recovery vaxtı 2604 dəfə qısa olur
Bakı reallığına gəlsək: əksər yerli startaplarda — istər Expressbank-ın fintech layihələri olsun, istər Birbank kimi super-app komandaları, istər kiçik e-commerce startapları — deployment hələ də əl ilə edilir. Senior developer maaşı Bakıda orta hesabla 2500-4500 AZN arasındadır. Bu insanın vaxtının 15%-i manual deploy-a gedirsə, bu ayda 375-675 AZN-lik itki deməkdir. CI/CD bunu sıfıra endirir.
Pipeline arxitekturası
Bizim pipeline belə işləyəcək:
Developer → git push → GitHub Actions → Test → Build → SSH Deploy → Server
Addımlar:
- Trigger:
mainbranch-ə push olunanda pipeline başlayır - Test: Unit testlər avtomatik çalışır
- Build: Layihə build olunur
- Deploy: SSH vasitəsilə serverə deploy olunur
- Notify: Telegram-a bildiriş gedir (bəli, Telegram — Bakıda hamı orada)
Addım 1: Layihə strukturu
Tutaq ki, belə bir Express layihəmiz var:
my-startup-api/
├── src/
│ ├── index.js
│ ├── routes/
│ └── utils/
├── tests/
│ └── health.test.js
├── package.json
└── .github/
└── workflows/
└── deploy.yml ← Bunu yaradacağıq
Əvvəlcə sadə bir test faylı olsun:
javascript// tests/health.test.js const request = require('supertest'); const app = require('../src/index'); describe('Health Check', () => { it('GET /health should return 200', async () => { const res = await request(app).get('/health'); expect(res.statusCode).toBe(200); expect(res.body.status).toBe('ok'); }); it('GET /health should return version', async () => { const res = await request(app).get('/health'); expect(res.body.version).toBeDefined(); }); });
Addım 2: GitHub Actions workflow
Bu əsas hissədir. .github/workflows/deploy.yml faylını yaradın:
yamlname: CI/CD Pipeline - Baku Startup on: push: branches: [main] pull_request: branches: [main] env: NODE_VERSION: '20' jobs: test: name: Test və Lint runs-on: ubuntu-latest steps: - name: Kodu yüklə uses: actions/checkout@v4 - name: Node.js quraşdır uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: 'npm' - name: Dependency-ləri quraşdır run: npm ci - name: Lint yoxla run: npm run lint - name: Testləri çalışdır run: npm test deploy: name: Production Deploy needs: test runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' && github.event_name == 'push' steps: - name: Kodu yüklə uses: actions/checkout@v4 - name: SSH ilə deploy et uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd /var/www/my-startup-api git pull origin main npm ci --production pm2 restart ecosystem.config.js --env production echo "Deploy tamamlandı: $(date)" - name: Telegram bildirişi if: always() uses: appleboy/telegram-action@master with: to: ${{ secrets.TELEGRAM_CHAT_ID }} token: ${{ secrets.TELEGRAM_BOT_TOKEN }} message: | ${{ job.status == 'success' && '✅' || '❌' }} Deploy: ${{ job.status }} Branch: ${{ github.ref_name }} Commit: ${{ github.event.head_commit.message }} Author: ${{ github.actor }}
Addım 3: GitHub Secrets konfiqurasiyası
GitHub repo-nuzda Settings → Secrets and variables → Actions bölməsinə keçin və bu secret-ləri əlavə edin:
| Secret adı | Dəyər |
|---|---|
SERVER_HOST | Serverinizin IP ünvanı |
SERVER_USER | SSH istifadəçi adı (məsələn, deploy) |
SSH_PRIVATE_KEY | SSH private key (tam mətn) |
TELEGRAM_BOT_TOKEN | @BotFather-dən aldığınız token |
TELEGRAM_CHAT_ID | Komanda qrup chat ID-si |
SSH key yaratmaq üçün:
bash# Lokal maşında ssh-keygen -t ed25519 -C "github-actions-deploy" # Public key-i serverə əlavə et ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@YOUR_SERVER_IP # Private key-i GitHub Secret-ə yapışdır cat ~/.ssh/id_ed25519
Addım 4: Server tərəfini hazırla
Serverdə PM2 quraşdırılmalıdır. Əgər DigitalOcean-da 6$/aylıq (təxminən 10.2 AZN) droplet istifadə edirsinizsə, bu kifayət edir:
bash# Serverdə bir dəfəlik quraşdırma npm install -g pm2 pm2 startup systemd # ecosystem.config.js yaradın module.exports = { apps: [{ name: 'startup-api', script: './src/index.js', instances: 2, exec_mode: 'cluster', env_production: { NODE_ENV: 'production', PORT: 3000 }, max_memory_restart: '256M' }] };
Nəticə: Nə qazandıq?
İndi main branch-ə hər push olunanda:
- ✅ Testlər avtomatik çalışır (2-3 dəqiqə)
- ✅ Test keçsə, kod serverə deploy olunur (30 saniyə)
- ✅ Telegram-a bildiriş gedir (komanda xəbərdar olur)
- ✅ Test uğursuz olarsa, deploy olmur (production qorunur)
Bütün bunlar tamamilə pulsuzdur — GitHub Actions public repolar üçün limitsiz, private repolar üçün ayda 2000 dəqiqə verir ki, kiçik komanda üçün artıqlaması ilə bəsdir.
Növbəti addımlar
Bu bazanı qurduqdan sonra bunları əlavə edə bilərsiniz:
- Docker: Containerized deployment üçün
docker-composeəlavə edin - Staging environment:
developbranch üçün ayrıca pipeline - Database migration: Deploy-dan əvvəl avtomatik
prisma migrate deploy - Rollback: Uğursuz deploy zamanı avtomatik əvvəlki versiyaya qayıdış
Son söz
Bakıda startap qurmaq asandır deməyəcəm — bazarı kiçikdir, investisiya azdır, developer tapmaq çətindir. Amma texniki infrastrukturunuzu düzgün qurmaq — bu sizin əlinizdədir və heç bir pul tələb etmir. 30 dəqiqəlik iş ayda saatlarla vaxtınıza qənaət edəcək.
Hər git push ilə avtomatik deploy görmək — developer olaraq həqiqətən xoşbəxtlik hissidir. Sınayın, peşman olmayacaqsınız.
Sualınız varsa, şərhlərdə yazın. Baku Stack komandası cavablayacaq! 🚀
Oxşar məqalələr
GitHub Actions ilə Avtomatik Deploy — Pulsuz Hosting, Sıfır Stress
Hər git push əmrindən sonra saytın avtomatik deploy olsun, həm də pulsuz? GitHub Actions + GitHub Pages ilə bunu 10 dəqiqəyə qurursan.
Docker ilə Next.js App Deployment — Addım-Addım Bələdçi
Next.js layihəni Docker ilə containerləşdirib production-a çıxarmağın ən sadə və düzgün yolu — real kod nümunələri ilə.
Kubernetes başlanğıcı — nə vaxt lazım olur, nə vaxt yox?
Hər layihəyə Kubernetes lazım deyil. Gəl birlikdə baxaq: K8s nə vaxt həqiqətən işə yarayır, nə vaxt isə vaxt itkisidir.