6-bosqich

CI/CD

Continuous Integration va Continuous Delivery - koddan productiongacha avtomatlashtirilgan yo'l.

20 daqiqa o'qish O'rta daraja
Code
Test
Build
Security
Artifact
Deploy

CI/CD nima?

CI/CD - bu dasturiy ta'minotni ishlab chiqish va yetkazib berishni avtomatlashtiradigan amaliyotlar va vositalar to'plami. Bu qisqartma ikki tushunchani o'z ichiga oladi:

  • CI (Continuous Integration) - doimiy integratsiya: dasturchilar kodlarini tez-tez (kuniga bir necha marta) umumiy repo'ga qo'shishadi, har safar avtomatik testlar ishga tushadi
  • CD (Continuous Delivery/Deployment) - doimiy yetkazib berish: kod avtomatik ravishda production'ga yetkaziladi (yoki bir tugma bilan)

CI/CD pipeline - bu kod yozilganidan boshlab production'ga chiqguncha bo'lgan barcha bosqichlarni avtomatlashtiradigan conveyer.

Oddiy tushuntirish

CI/CD - bu zavod konveyeri kabi. Xomashyo (kod) kiradi, tekshiruvlardan o'tadi (test), qayta ishlanadi (build), sifat nazoratidan o'tadi (QA), va tayyor mahsulot (release) chiqadi. Hamma narsa avtomatik, odam aralashuvi minimal.

Nega kerak?

CI/CD yo'q bo'lsa, deploy qilish qo'lda amalga oshiriladi. Bu ko'p muammolarga olib keladi:

Vaqtni tejash

Qo'lda deploy 2-4 soat, CI/CD bilan 5-15 daqiqa. Kuniga 10 marta deploy = 20+ soat tejaladi.

Xatolarni erta topish

Har bir commit'da test ishlagani uchun xato 5 daqiqada topiladi, 5 kundan keyin emas.

Xavfsizlik

Avtomatik security scanning har commit'da. Zaifliklar production'ga yetib bormaydi.

Tez rollback

Muammo bo'lsa, oldingi versiyaga 1 daqiqada qaytish. Artifact'lar saqlanadi.

Statistika

DORA (DevOps Research and Assessment) tadqiqotiga ko'ra, yuqori darajadagi CI/CD amaliyotlari: 208x tezroq deploy, 106x tezroq recovery, 7x kam xato chiqishi, 2604x tezroq lead time.

Asosiy tushunchalar

Pipeline bosqichlari

  • Source - kod o'zgarishi trigger bo'ladi (push, PR, tag)
  • Build - kod kompilyatsiya, dependency'lar o'rnatiladi
  • Test - unit, integration, e2e testlar ishlaydi
  • Security Scan - SAST, DAST, dependency check
  • Artifact - Docker image, binary, package yaratiladi
  • Deploy - staging yoki production'ga joylashtiriladi

Continuous Integration

CI ning asosiy tamoyillari:

  • Har bir developer kuniga kamida bir marta main branch'ga merge qiladi
  • Har bir merge avtomatik build va test trigger qiladi
  • Build buzilsa, darhol tuzatiladi (birinchi prioritet)
  • Test coverage yetarli darajada bo'lishi kerak (80%+)

Continuous Delivery vs Deployment

  • Continuous Delivery - kod har doim deploy qilishga tayyor holatda. Lekin production'ga chiqarish qo'lda (bir tugma bilan)
  • Continuous Deployment - barcha testlardan o'tgan kod avtomatik production'ga chiqadi. Odam aralashuvi yo'q.

Deployment Strategiyalari

  • Rolling Update - eski pod'lar birin-ketin yangilanadi
  • Blue/Green - ikki muhit, traffic bir zumda almashadi
  • Canary - avval 5% traffic, keyin asta-sekin 100%
  • Feature Flags - kod deploy, lekin feature o'chirilgan

Amaliy jarayon (step-by-step)

1

CI/CD tool tanlash

GitHub Actions, GitLab CI, Jenkins, CircleCI - loyiha talablariga qarab. GitHub Actions boshlash uchun eng oson.

2

Asosiy pipeline yaratish

.github/workflows/ci.yml yoki .gitlab-ci.yml fayl yarating. Build va test bosqichlaridan boshlang.

3

Test strategiyasini aniqlash

Unit testlar (Jest, pytest), integration testlar, e2e testlar (Playwright). Coverage threshold o'rnating.

4

Security scanning qo'shish

Dependabot, Snyk, SonarQube - dependency va code vulnerabilities uchun.

5

Artifact yaratish

Docker image build, tag (git SHA yoki semantic version), registry'ga push (GHCR, ECR, GCR).

6

Staging deploy

Avval staging muhitga avtomatik deploy. Smoke testlar, manual QA imkoniyati.

7

Production deploy

Manual approval yoki avtomatik (Continuous Deployment). Rollback strategiyasi tayyor bo'lsin.

8

Monitoring va alerting

Deploy'dan keyin health check, error rate, latency kuzatilsin. Anomaly bo'lsa - alert.

Eng ko'p uchraydigan xatolar

1. Test'larsiz CI

Pipeline bor, lekin testlar yo'q yoki juda kam. CI faqat build tekshiradi. Bu foydasiz - xatolar production'ga yetib boradi.

2. Sekin pipeline

Pipeline 30+ daqiqa ishlaydi. Developerlar feedback'ni kutib turishadi yoki pipeline'ni ignore qilishadi. Target: 10 daqiqadan kam.

3. Secret'larni kodda saqlash

API key, password .yml faylda. Hacker uchun ochiq eshik. GitHub/GitLab Secrets yoki Vault ishlating.

4. Rollback strategiyasi yo'q

Yangi deploy ishlamayapti, lekin orqaga qaytish jarayoni aniq emas. Panic. Oldingi artifact'lar saqlanmagan.

Yechim

"Fail fast" prinsipi - tez ishlaydigan testlarni avval bajaring. Parallelizatsiya bilan pipeline'ni tezlashtiring. Har doim oxirgi 5 ta artifact saqlab turing.

Best practices

  • Trunk-based development - qisqa muddatli branch'lar, tez merge
  • Fast feedback - pipeline 10 daqiqadan oshmasin, tez testlarni avval bajaring
  • Immutable artifacts - bir marta build, har joyda deploy (staging = production artifact)
  • Infrastructure as Code - pipeline konfiguratsiyasi ham version control'da
  • Semantic versioning - v1.2.3 format, automated changelog
  • Branch protection - main branch'ga to'g'ridan-to'g'ri push taqiq, PR va review majburiy
  • Environment parity - dev, staging, production bir xil konfiguratsiya
  • Automated rollback - health check fail bo'lsa, avtomatik orqaga qaytarish
  • Deployment windows - production deploy faqat ish vaqtida (rollback uchun jamoa tayyor)
  • Post-deploy verification - smoke tests, synthetic monitoring

Asboblar va texnologiyalar

GitHub Actions GitLab CI Jenkins CircleCI AWS CodePipeline Docker Kubernetes Argo CD Snyk SonarQube Jest/Playwright Helm

GitHub Actions

GitHub ichida o'rnatilgan. YAML syntax, katta marketplace, bepul tier.

Argo CD

GitOps uchun. Kubernetes cluster bilan deklarativ sync.

Snyk

Dependency va container security scanning. Developer-friendly.

Mini misol

GitHub Actions bilan Node.js CI/CD pipeline:

yaml - .github/workflows/ci.yml
name: CI/CD Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  # ========== TEST ==========
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
      
      - name: Install dependencies
        run: npm ci
      
      - name: Run linter
        run: npm run lint
      
      - name: Run unit tests
        run: npm run test:coverage
      
      - name: Upload coverage
        uses: codecov/codecov-action@v3

  # ========== SECURITY SCAN ==========
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Run Snyk
        uses: snyk/actions/node@master
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}

  # ========== BUILD ==========
  build:
    needs: [test, security]
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    
    steps:
      - uses: actions/checkout@v4
      
      - name: Log in to Container Registry
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      
      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: |
            ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
            ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest

  # ========== DEPLOY STAGING ==========
  deploy-staging:
    needs: build
    runs-on: ubuntu-latest
    environment: staging
    
    steps:
      - name: Deploy to Staging
        run: |
          echo "Deploying ${{ github.sha }} to staging..."
          # kubectl set image deployment/app ...
      
      - name: Run smoke tests
        run: |
          curl -f https://staging.example.com/health

  # ========== DEPLOY PRODUCTION ==========
  deploy-production:
    needs: deploy-staging
    runs-on: ubuntu-latest
    environment: production
    if: github.ref == 'refs/heads/main'
    
    steps:
      - name: Deploy to Production
        run: |
          echo "Deploying ${{ github.sha }} to production..."

Docker multi-stage build (optimized):

dockerfile - Dockerfile
# Build stage
FROM node:20-alpine AS builder

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

COPY . .
RUN npm run build

# Production stage
FROM node:20-alpine AS production

WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules

USER node
EXPOSE 3000

HEALTHCHECK --interval=30s --timeout=3s \
  CMD wget -qO- http://localhost:3000/health || exit 1

CMD ["node", "dist/main.js"]

Xavfsizlik va ishonchlilik

  • Secrets management - GitHub Secrets, HashiCorp Vault. YAML'da hech qachon plaintext secret bo'lmasin.
  • SAST (Static Analysis) - har PR'da kod security scan. SonarQube, CodeQL.
  • Dependency scanning - Dependabot, Snyk avtomatik PR'lar bilan vulnerable package'larni yangilaydi.
  • Container scanning - Trivy, Clair bilan Docker image vulnerabilities tekshiring.
  • Signed commits va artifacts - provenance, kod qaerdan kelganini isbotlash.
  • Least privilege - CI runner'lar minimal permission bilan. Production deploy faqat alohida approval bilan.

Ko'p so'raladigan savollar (FAQ)

CI (Continuous Integration) - kodlarni tez-tez merge qilish va har safar avtomatik test. CD esa ikki xil bo'ladi: Continuous Delivery - har doim deploy qilishga tayyor, lekin qo'lda trigger; Continuous Deployment - testlardan o'tgan kod avtomatik production'ga.

GitHub Actions: yaxshi integration, oson boshlash, hosted runners, katta marketplace. Jenkins: self-hosted, ko'proq control, plugin ecosystem, legacy loyihalar uchun. Yangi loyiha = GitHub Actions. Katta enterprise = Jenkins yoki GitLab CI.

Ideal: PR check 5-10 daqiqa, full pipeline 15-20 daqiqa. 30 daqiqadan oshsa - optimallashtiring: parallel jobs, cache, tez testlarni avval, sekin testlarni alohida workflow'ga.

Blue/Green: 2 ta to'liq muhit, traffic bir zumda almashadi (0% → 100%). Canary: asta-sekin (5% → 25% → 50% → 100%), xato bo'lsa erta aniqlash. Canary xavfsizroq, lekin murakkab.

Path filter'lar bilan faqat o'zgargan package uchun pipeline ishga tushadi. Nx, Turborepo affected commands. Yoki Bazel bilan smart caching. To'liq rebuild har safar - vaqt isrof.

Kod deploy bo'ladi, lekin yangi feature if-else orqali o'chirilgan. LaunchDarkly, Unleash, yoki oddiy env variable. Kerak bo'lganda yoqiladi. Rollback = kod rollback emas, flag o'chirish.

Infrastructure va application state Git'da saqlanadi. Argo CD, Flux kabi toollar Git'ni kuzatib turadi va cluster'ni sync qiladi. Deklarativ, auditable, rollback oson (git revert).

Migration'lar app deploy'dan OLDIN ishga tushadi (pre-deploy hook). Backward compatible bo'lishi kerak - eski va yangi kod bir vaqtda ishlashi mumkin. Flyway, Prisma migrate, Alembic.

Glossary (Atamalar lug'ati)

Pipeline Kod'dan production'gacha avtomatlashtirilgan bosqichlar ketma-ketligi.
Job Pipeline ichidagi bitta vazifa (masalan: test, build). Parallel yoki ketma-ket ishlashi mumkin.
Artifact Build natijasi - Docker image, JAR, npm package. Versiyalangan va saqlanadi.
Runner Pipeline job'larini bajaradigan server/agent. Hosted yoki self-hosted.
Trigger Pipeline'ni boshlashga sabab bo'ladigan event - push, PR, schedule, webhook.
SAST Static Application Security Testing - kod ishlamay turib security xatolarni topish.
DAST Dynamic Application Security Testing - ishlab turgan app'ni security test qilish.
Rollback Yangi versiyada muammo bo'lsa, oldingi ishlaydigan versiyaga qaytish.
Canary Deploy Yangi versiyani avval kichik foiz traffic bilan sinash, keyin asta-sekin oshirish.
Blue/Green Ikki identik muhit, traffic bir zumda yangisiga yo'naltiriladi.
Feature Flag Kodni deploy qilib, feature'ni runtime'da yoqish/o'chirish imkoniyati.
GitOps Git repository infrastructure va app holatining yagona manbai sifatida.