5-bo‘lim
Matritsali qurish
Bitta kodni bir nechta versiya va platformada sinash, include va exclude, fail-fast va parallellik chegarasi.
Ushbu bo‘lim mundarijasi
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 #
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:
test (18)
test (20)
test (22)
Ikki o'lchovli matritsa #
Endi uchta versiyani uchta operatsion tizimda sinaymiz:
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
Uch o'lchov qo'shsangiz hisob shunday bo'ladi:
| O'lchovlar | Joblar soni |
|---|---|
| 3 versiya | 3 |
| 3 versiya x 3 tizim | 9 |
| 3 versiya x 3 tizim x 2 baza | 18 |
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:
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.
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
steps:
- name: Faqat asosiy kombinatsiyada hisobot yuborish
if: matrix.asosiy
run: echo "Qamrov hisoboti yuborildi"
| Kalit | Nima qiladi |
|---|---|
exclude | Hosil bo'lgan kombinatsiyalardan olib tashlaydi |
include | Mavjudiga 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:
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:
strategy:
fail-fast: false
matrix:
node: [18, 20, 22]
Parallellik chegarasi #
Yigirma ta job birdan boshlansa, navbatni butunlay band qiladi.
max-parallel buni cheklaydi:
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:
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
Uchta versiyani qo'lda yozish osonroq. Dinamik ro'yxat quyidagi holatlarda foydali:
| Holat | Misol |
|---|---|
| Ro'yxat faylda saqlanadi | versiyalar.json dan o'qiladi |
| O'zgargan papkalarni topish | Faqat tegilgan xizmatlarni qurish |
| PR va main uchun turli ro'yxat | PR da 1 ta, main da 5 ta versiya |
Aks holda oddiy ro'yxat o'qishga qulayroq - murakkablikni behuda oshirmang.
Amalda tavsiya etiladigan sozlama #
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.
- Node ning uchta versiyasi uchun matritsa yozing va uchta job paydo bo'lishini ko'ring.
- Matritsaga
oso'lchovini qo'shib, joblar soni qanday o'zganini sanang. excludebilan ikkita kombinatsiyani olib tashlang.includeorqali faqat bitta kombinatsiyagaasosiy: truebelgisini qo'shing.- Shu belgidan
if: matrix.asosiysharti bilan foydalaning. - Bitta versiyada ataylab xato qiling va
fail-fast: truexatti-harakatini kuzating. fail-fast: falseqilib, farqni solishtiring.max-parallel: 2qo'shib, joblar navbat bilan boshlanishini ko'ring.- Matritsani
fromJSONorqali oldingi jobdan oling. - 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.
excludekeraksiz kombinatsiyalarni olib tashlaydi.includemavjud 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: falsema'qul: xato qaysi versiyada ekani ko'rinadi. max-parallelnavbatni band qilib qo'ymaslik uchun cheklov qo'yadi.- Matritsani
fromJSONbilan dinamik yasash mumkin, lekin faqat kerak bo'lganda. - Amaliy kelishuv: PR da qisqa matritsa,
mainyoki kechasi esa to'liq matritsa.
Keyingi bo'limda quvurni bir necha barobar tezlashtiradigan keshlash bilan tanishamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.