CI/CD (GitHub Actions)

Avtomatik test va build

Endi workflow'ni haqiqiy foydali qilamiz: Node.js loyihasini o'rnatib, testlarni ishga tushirib, build qilamiz. Bu โ€” har bir Node loyihasining CI asosini tashkil qiladi.

Node.js muhitini o'rnatish (setup-node)

Runner mashinasida Node bo'lishi mumkin, lekin biz aniq versiyani nazorat qilmoqchimiz. Buning uchun actions/setup-node action ishlatiladi:

steps:
  - name: Kodni yuklab olish
    uses: actions/checkout@v4

  - name: Node.js o'rnatish
    uses: actions/setup-node@v4
    with:
      node-version: '20'

with: โ€” action'ga parametr uzatish usuli. Bu yerda node-version: '20' deb Node'ning 20-versiyasini o'rnatamiz.

Versiyani tirnoq ichida ('20') yozing. YAML 20.10 kabi sonlarni noto'g'ri o'qishi mumkin, tirnoq esa buni oldini oladi.

npm ci โ€” bog'liqliklarni o'rnatish

CI muhitida npm install emas, npm ci ishlatiladi. Farqi muhim:

  - name: Bog'liqliklarni o'rnatish
    run: npm ci
npm ci ishlashi uchun repoda package-lock.json bo'lishi shart. Uni .gitignore ga qo'ymang โ€” lock fayl repoda bo'lishi kerak.

Test va build qadamlari

Bog'liqliklar o'rnatilgach, testlar va build ishga tushadi. Bu package.jsondagi skriptlarga bog'liq:

// package.json ichida:
"scripts": {
  "test": "jest",
  "build": "vite build",
  "lint": "eslint ."
}

Endi workflow'da shu skriptlarni chaqiramiz:

  - name: Linter
    run: npm run lint

  - name: Testlar
    run: npm test

  - name: Build
    run: npm run build

Agar biror qadam noldan farqli chiqish kodi (exit code) qaytarsa โ€” masalan test buzilsa โ€” job to'xtaydi va keyingi qadamlar ishlamaydi. Aynan shu bizga kerak.

To'liq CI workflow

Barcha qadamlarni .github/workflows/ci.yml ga birlashtiramiz:

name: CI

on:
  push:
    branches: [ main ]
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Node.js o'rnatish
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Bog'liqliklar
        run: npm ci

      - name: Linter
        run: npm run lint

      - name: Testlar
        run: npm test

      - name: Build
        run: npm run build

Matrix โ€” bir nechta Node versiyasi

Loyihangiz Node 18, 20 va 22 da ishlashini tekshirmoqchimisiz? Matrix yordamida bitta job'ni har bir versiya uchun avtomatik takrorlaysiz:

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [18, 20, 22]
    steps:
      - uses: actions/checkout@v4

      - name: Node ${{ matrix.node-version }} o'rnatish
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}

      - run: npm ci
      - run: npm test

Bu workflow uchta parallel job yaratadi: biri Node 18 uchun, biri 20, biri 22. Ular bir vaqtda ishlaydi. ${{ matrix.node-version }} โ€” matrix'dagi joriy qiymatga murojaat.

Matrix faqat Node versiyasi uchun emas โ€” operatsion tizim (os: [ubuntu-latest, windows-latest]) yoki boshqa o'zgaruvchilar uchun ham ishlatiladi. Ular kombinatsiyalarga bo'linadi.

Kesh (cache) โ€” tezlashtirish

Har safar npm ci bog'liqliklarni noldan yuklab oladi โ€” bu sekin. actions/setup-node o'rnatilgan keshni qo'llab-quvvatlaydi:

  - name: Node.js o'rnatish (kesh bilan)
    uses: actions/setup-node@v4
    with:
      node-version: '20'
      cache: 'npm'

cache: 'npm' qatori npm keshini saqlaydi va keyingi ishga tushirishlarda qayta ishlatadi. package-lock.json o'zgarmasa, bog'liqliklar keshdan olinadi โ€” bu ancha tez.

Kesh avtomatik package-lock.json hash'i asosida boshqariladi. Lock fayl o'zgarsa, kesh yangilanadi. Siz hech narsa qilmaysiz โ€” faqat cache: 'npm' qatorini qo'shasiz.

Status badge โ€” README'da nishon

CI holatini README'da ko'rsatuvchi badge (nishon) qo'shishingiz mumkin. U yashil (o'tdi) yoki qizil (buzildi) bo'ladi. Markdown ko'rinishi:

![CI](https://github.com/USER/REPO/actions/workflows/ci.yml/badge.svg)

USER โ€” GitHub foydalanuvchi nomi, REPO โ€” repo nomi, ci.yml โ€” workflow fayl nomi. Badge har doim asosiy shoxchaning oxirgi holatini ko'rsatadi.

Badge'ni GitHub'da Actions → workflow → o'ng yuqoridagi "..." menyusidan "Create status badge" orqali avtomatik yaratib olishingiz mumkin.

Xulosa