CI/CD
Continuous Integration va Continuous Delivery - koddan productiongacha avtomatlashtirilgan yo'l.
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.
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.
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)
CI/CD tool tanlash
GitHub Actions, GitLab CI, Jenkins, CircleCI - loyiha talablariga qarab. GitHub Actions boshlash uchun eng oson.
Asosiy pipeline yaratish
.github/workflows/ci.yml yoki .gitlab-ci.yml fayl yarating. Build va test bosqichlaridan boshlang.
Test strategiyasini aniqlash
Unit testlar (Jest, pytest), integration testlar, e2e testlar (Playwright). Coverage threshold o'rnating.
Security scanning qo'shish
Dependabot, Snyk, SonarQube - dependency va code vulnerabilities uchun.
Artifact yaratish
Docker image build, tag (git SHA yoki semantic version), registry'ga push (GHCR, ECR, GCR).
Staging deploy
Avval staging muhitga avtomatik deploy. Smoke testlar, manual QA imkoniyati.
Production deploy
Manual approval yoki avtomatik (Continuous Deployment). Rollback strategiyasi tayyor bo'lsin.
Monitoring va alerting
Deploy'dan keyin health check, error rate, latency kuzatilsin. Anomaly bo'lsa - alert.
Eng ko'p uchraydigan xatolar
Pipeline bor, lekin testlar yo'q yoki juda kam. CI faqat build tekshiradi. Bu foydasiz - xatolar production'ga yetib boradi.
Pipeline 30+ daqiqa ishlaydi. Developerlar feedback'ni kutib turishadi yoki pipeline'ni ignore qilishadi. Target: 10 daqiqadan kam.
API key, password .yml faylda. Hacker uchun ochiq eshik. GitHub/GitLab Secrets yoki Vault ishlating.
Yangi deploy ishlamayapti, lekin orqaga qaytish jarayoni aniq emas. Panic. Oldingi artifact'lar saqlanmagan.
"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
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:
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):
# 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.