5-bo‘lim

Matritsali qurish

Bitta kodni bir nechta versiya va platformada sinash, include va exclude, fail-fast va parallellik chegarasi.

🕑 9 daqiqa o‘qish 📄 617 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Eng sodda matritsa
  2. Ikki o'lchovli matritsa
  3. Ortiqchasini olib tashlash - exclude
  4. Alohida holat qo'shish - include
  5. fail-fast - birinchi xatoda to'xtash
  6. Parallellik chegarasi
  7. Matritsani dinamik yasash
  8. Amalda tavsiya etiladigan sozlama
  9. Xulosa

Kutubxonangiz Node 18, 20 va 22 da ishlashi kerak. Uchta workflow yozasizmi? Yo'q - matritsa bitta ta'rifdan bir nechta job hosil qiladi.

Eng sodda matritsa #

YAML
name: Testlar

on: push

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

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

      - name: Versiyani tekshirish
        run: node --version

      - name: Testlar
        run: npm test

Bu ta'rif uchta job hosil qiladi va ular parallel ishlaydi. Actions sahifasida ular shunday nomlanadi:

Natija
test (18)
test (20)
test (22)

Ikki o'lchovli matritsa #

Endi uchta versiyani uchta operatsion tizimda sinaymiz:

YAML
jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        node: [18, 20, 22]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
      - run: npm test
3 tizim x 3 versiya = 9 ta job ubuntu windows macos node 18 node 18 node 18 node 20 node 20 node 20 node 22 node 22 node 22 Har bir katak - alohida mashina, alohida jurnal, alohida natija
Matritsa o'lchovlari ko'paygan sayin joblar soni ko'paytma bo'yicha o'sadi
Matritsa tez kattalashadi

Uch o'lchov qo'shsangiz hisob shunday bo'ladi:

O'lchovlarJoblar soni
3 versiya3
3 versiya x 3 tizim9
3 versiya x 3 tizim x 2 baza18

Ochiq repozitoriyda bu bepul, lekin navbat cheklangan. Yopiq repozitoriyda esa 18 ta job - bu 18 marta hisoblangan daqiqa.

Amaliy yechim: to'liq matritsani faqat main da yoki kechasi ishlating, PR da esa bitta-ikkita asosiy kombinatsiyani qoldiring.

Ortiqchasini olib tashlash - exclude #

Eski Node ni yangi macOS da sinash shart bo'lmasa:

YAML
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        node: [18, 20, 22]
        exclude:
          - os: macos-latest
            node: 18
          - os: windows-latest
            node: 18

Endi 9 emas, 7 ta job qoladi.

Alohida holat qo'shish - include #

include ikki vazifani bajaradi: mavjud kombinatsiyaga qo'shimcha qiymat berish yoki butunlay yangi kombinatsiya qo'shish.

YAML
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest]
        node: [20, 22]
        include:
          # mavjud katakka qo'shimcha belgi qo'shadi
          - os: ubuntu-latest
            node: 22
            asosiy: true
          # matritsada yo'q edi - yangi job sifatida qo'shiladi
          - os: macos-latest
            node: 22
YAML
    steps:
      - name: Faqat asosiy kombinatsiyada hisobot yuborish
        if: matrix.asosiy
        run: echo "Qamrov hisoboti yuborildi"
KalitNima qiladi
excludeHosil bo'lgan kombinatsiyalardan olib tashlaydi
includeMavjudiga qiymat qo'shadi yoki yangi job qo'shadi
matrix.<nom>Qadamlar ichida joriy qiymatni beradi

fail-fast - birinchi xatoda to'xtash #

Sukut bo'yicha matritsadagi bitta job yiqilsa, GitHub qolganlarini bekor qiladi:

YAML
    strategy:
      fail-fast: true      # sukut bo'yicha shunday
      matrix:
        node: [18, 20, 22]

Bu tez va tejamkor. Lekin ko'pincha teskarisi kerak: xato faqat Node 18 da bormi yoki hamma joydami? Buni bilish uchun:

YAML
    strategy:
      fail-fast: false
      matrix:
        node: [18, 20, 22]
fail-fast: true fail-fast: false node 18 - yiqildi node 20 - bekor node 22 - bekor tez, lekin manzara to'liq emas node 18 - yiqildi node 20 - o'tdi node 22 - o'tdi xato faqat eski versiyada ekani ko'rindi Kutubxona uchun false, ichki loyiha uchun true - tanlov maqsadga bog'liq
Xato qayerda ekanini bilish kerak bo'lsa, matritsani to'xtatmang

Parallellik chegarasi #

Yigirma ta job birdan boshlansa, navbatni butunlay band qiladi. max-parallel buni cheklaydi:

YAML
    strategy:
      max-parallel: 3
      matrix:
        node: [16, 18, 20, 22]
        os: [ubuntu-latest, windows-latest]

Sakkiz job hosil bo'ladi, lekin bir vaqtda faqat uchtasi ishlaydi.

Matritsani dinamik yasash #

Matritsa qiymatlari JSON dan ham kelishi mumkin - bu ularni oldingi jobda hisoblash imkonini beradi:

YAML
jobs:
  tayyorlash:
    runs-on: ubuntu-latest
    outputs:
      versiyalar: ${{ steps.royxat.outputs.qiymatlar }}
    steps:
      - id: royxat
        run: echo 'qiymatlar=["18","20","22"]' >> "$GITHUB_OUTPUT"

  test:
    needs: tayyorlash
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node: ${{ fromJSON(needs.tayyorlash.outputs.versiyalar) }}
    steps:
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
      - run: node --version
Dinamik matritsa qachon kerak

Uchta versiyani qo'lda yozish osonroq. Dinamik ro'yxat quyidagi holatlarda foydali:

HolatMisol
Ro'yxat faylda saqlanadiversiyalar.json dan o'qiladi
O'zgargan papkalarni topishFaqat tegilgan xizmatlarni qurish
PR va main uchun turli ro'yxatPR da 1 ta, main da 5 ta versiya

Aks holda oddiy ro'yxat o'qishga qulayroq - murakkablikni behuda oshirmang.

Amalda tavsiya etiladigan sozlama #

YAML
jobs:
  test:
    runs-on: ${{ matrix.os }}
    timeout-minutes: 15
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest]
        node: [20, 22]
        include:
          - os: windows-latest
            node: 22
          - os: macos-latest
            node: 22
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
      - run: npm ci
      - run: npm test

To'rtta job: Linux'da ikkita versiya, Windows va macOS'da esa faqat eng yangisi. Bu qamrov va narx o'rtasidagi kelishuv.

Amaliy topshiriq
  1. Node ning uchta versiyasi uchun matritsa yozing va uchta job paydo bo'lishini ko'ring.
  2. Matritsaga os o'lchovini qo'shib, joblar soni qanday o'zganini sanang.
  3. exclude bilan ikkita kombinatsiyani olib tashlang.
  4. include orqali faqat bitta kombinatsiyaga asosiy: true belgisini qo'shing.
  5. Shu belgidan if: matrix.asosiy sharti bilan foydalaning.
  6. Bitta versiyada ataylab xato qiling va fail-fast: true xatti-harakatini kuzating.
  7. fail-fast: false qilib, farqni solishtiring.
  8. max-parallel: 2 qo'shib, joblar navbat bilan boshlanishini ko'ring.
  9. Matritsani fromJSON orqali oldingi jobdan oling.
  10. O'z loyihangiz uchun qamrov va narxni muvozanatlagan matritsa yozing.

Xulosa #

  • Matritsa bitta ta'rifdan bir nechta job hosil qiladi va ular parallel ishlaydi.
  • Qiymatlar qadamlar ichida matrix.<nom> orqali o'qiladi.
  • O'lchovlar ko'payganda joblar soni ko'paytma bo'yicha o'sadi: 3x3 = 9.
  • exclude keraksiz kombinatsiyalarni olib tashlaydi.
  • include mavjud katakka qiymat qo'shadi yoki yangi job qo'shadi.
  • fail-fast: true (sukut) birinchi xatoda qolganlarini bekor qiladi - tez, lekin manzara to'liq emas.
  • Kutubxonalar uchun odatda fail-fast: false ma'qul: xato qaysi versiyada ekani ko'rinadi.
  • max-parallel navbatni band qilib qo'ymaslik uchun cheklov qo'yadi.
  • Matritsani fromJSON bilan dinamik yasash mumkin, lekin faqat kerak bo'lganda.
  • Amaliy kelishuv: PR da qisqa matritsa, main yoki kechasi esa to'liq matritsa.

Keyingi bo'limda quvurni bir necha barobar tezlashtiradigan keshlash bilan tanishamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.