Blog/devops/Azərbaycan startapı üçün sıfırdan CI/CD pipeline qurmaq
devops

Azərbaycan startapı üçün sıfırdan CI/CD pipeline qurmaq

B
Baku Stack AI
·16 mart 2026·4 dəq oxuma·20 baxış
devops.ascii
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ ■ ■ ■ CI/CD PIPE ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ → git push main ▓
▓ ↓ ▓
▓ ● npm test ▓
▓ ▓▓▓▓▓▓▓░░░ 70% ▓
▓ ↓ ▓
▓ ● ssh deploy ▓
▓ ▓▓▓▓▓▓▓▓▓▓ 100% ▓
▓ ↓ ▓
▓ ✓ Telegram notify ▓
▓ ✓ Production LIVE! ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓

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:

  1. Trigger: main branch-ə push olunanda pipeline başlayır
  2. Test: Unit testlər avtomatik çalışır
  3. Build: Layihə build olunur
  4. Deploy: SSH vasitəsilə serverə deploy olunur
  5. 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:

yaml
name: 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_HOSTServerinizin IP ünvanı
SERVER_USERSSH istifadəçi adı (məsələn, deploy)
SSH_PRIVATE_KEYSSH private key (tam mətn)
TELEGRAM_BOT_TOKEN@BotFather-dən aldığınız token
TELEGRAM_CHAT_IDKomanda 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: develop branch üçü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

devops.ascii
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ ■ ■ ■ CI/CD PIPELINE ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ git push → trigger ▓
▓ ↓ ▓
▓ ● checkout ✓ ▓
▓ ● npm ci ✓ ▓
▓ ● npm test ✓ ▓
▓ ● npm build ✓ ▓
▓ ● deploy ✓ ▓
▓ ↓ ▓
▓ PROGRESS ▓▓▓▓▓▓▓▓ 100%▓
▓ → SAYT CANLIDIR! ░░░ ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓

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.

devops.ascii
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ ■ ■ ■ DEVOPS ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ $ docker build . ▓
▓ → deps ▓▓▓▓░░ 60% ▓
▓ → build ▓▓▓▓▓░ 80% ▓
▓ → runner ▓▓▓▓▓▓ ✓ ▓
▓ ● Image: 130 MB ▓
▓ ● Port: 3000 ▓
▓ ● User: nextjs ▓
▓ ──────────────────── ▓
▓ $ docker run -p 3000 ▓
▓ ✓ Ready on :3000 ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓

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ə.

devops.ascii
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ ■ ■ ■ DEVOPS ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓ $ minikube start ▓
▓ ✓ cluster ready ▓
▓ ▓
▓ PODs: ●●●●●○○○ ▓
▓ NODES: ●●● ▓
▓ CPU: ▓▓▓▓▓░░░ 65% ▓
▓ MEM: ▓▓▓▓░░░░ 48% ▓
▓ ▓
▓ → scaling: 2 → 20 ▓
▓ → downtime: 0 sec ▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓

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.

← Bloqa qayıt