4-bo‘lim
Job, step va runner
Joblar qanday parallel ishlaydi, needs bilan bog'lash, shartlar, muhit o'zgaruvchilari va qadamlar orasida ma'lumot uzatish.
Ushbu bo‘lim mundarijasi
Workflow ichidagi joblar sukut bo'yicha bir vaqtda ishlaydi. Bu tezlik beradi, lekin ba'zan tartib kerak bo'ladi: obraz qurilishidan oldin testlar o'tishi shart. Bu bo'lim aynan shu boshqaruv haqida.
Joblar parallel ishlaydi #
name: Parallel joblar
on: push
jobs:
linter:
runs-on: ubuntu-latest
steps:
- run: echo "Kod uslubi tekshirilmoqda"
testlar:
runs-on: ubuntu-latest
steps:
- run: echo "Testlar ishlamoqda"
xavfsizlik:
runs-on: ubuntu-latest
steps:
- run: echo "Bog'liqliklar tekshirilmoqda"
Uchala job uchta alohida mashinada, bir vaqtda boshlanadi. Umumiy vaqt eng uzun jobniki bo'ladi, ularning yig'indisi emas.
needs - tartib o'rnatish #
jobs:
test:
runs-on: ubuntu-latest
steps:
- run: echo "Testlar"
qurish:
needs: test
runs-on: ubuntu-latest
steps:
- run: echo "Obraz quriladi"
deploy:
needs: [test, qurish]
runs-on: ubuntu-latest
steps:
- run: echo "Serverga yuborildi"
| Yozuv | Ma'nosi |
|---|---|
needs: test | test yashil bo'lsagina boshlanadi |
needs: [test, qurish] | Ikkalasi ham tugashini kutadi |
needs yozilmagan | Darhol, boshqalar bilan parallel boshlanadi |
test qizil bo'lsa, qurish va deploy umuman boshlanmaydi -
ular skipped holatida qoladi.
Aynan shu xatti-harakat quvurni himoya qiladi: buzuq kod hech qachon serverga yetib bormaydi.
Shartlar - if #
Har bir job yoki qadam shart bilan boshqarilishi mumkin:
jobs:
deploy:
needs: test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- name: Faqat main tarmog'idan deploy
run: echo "Ishlab chiqarishga chiqarilmoqda"
- name: Faqat qo'lda ishga tushirilganda
if: github.event_name == 'workflow_dispatch'
run: echo "Buni odam boshladi"
Eng ko'p ishlatiladigan shartlar:
| Shart | Qachon rost |
|---|---|
github.ref == 'refs/heads/main' | Asosiy tarmoqda |
github.event_name == 'push' | Hodisa turi bo'yicha |
success() | Oldingi qadamlar yashil (sukut bo'yicha shu) |
failure() | Oldingi qadamlardan biri yiqildi |
always() | Har qanday holatda - hatto bekor qilinganda ham |
cancelled() | Ishga tushirish bekor qilindi |
- name: Xato bo'lsa xabar berish
if: failure()
run: echo "Quvur yiqildi - jamoaga xabar yuborildi"
- name: Har holda tozalash
if: always()
run: echo "Vaqtinchalik fayllar o'chirildi"
if ichida ${{ }} shart emasJob va qadam darajasidagi if: ifodani o'zi hisoblaydi, shuning uchun
qavslarsiz yoziladi:
if: github.ref == 'refs/heads/main'
Qavs bilan yozsangiz ham ishlaydi, lekin ichma-ich qavslar chalkashlik
keltiradi. Boshqa joylarda - run, env, with ichida - ${{ }}
majburiy.
Muhit o'zgaruvchilari #
O'zgaruvchilar uch darajada e'lon qilinadi:
name: Muhit o'zgaruvchilari
on: push
env:
LOYIHA: ci-mashq # butun workflow uchun
jobs:
test:
runs-on: ubuntu-latest
env:
BOSQICH: sinov # faqat shu job uchun
steps:
- name: Qiymatlarni ko'rsatish
env:
QADAM: uchinchi # faqat shu qadam uchun
run: |
echo "Loyiha: $LOYIHA"
echo "Bosqich: $BOSQICH"
echo "Qadam: $QADAM"
Loyiha: ci-mashq
Bosqich: sinov
Qadam: uchinchi
Quyi daraja yuqorisini qoplaydi: bir xil nom job va qadamda bo'lsa, qadamdagisi ishlaydi.
Qadamlar orasida ma'lumot uzatish #
Har bir qadam alohida shell'da ishlaydi. Oddiy o'zgaruvchi keyingi qadamda yo'q bo'ladi:
- name: Bu ishlamaydi
run: NATIJA=salom
- name: Bu yerda NATIJA bo'sh
run: echo "$NATIJA"
To'g'ri usul - maxsus fayllarga yozish:
- name: Versiyani hisoblash
id: versiya
run: echo "raqam=1.4.2" >> "$GITHUB_OUTPUT"
- name: Keyingi qadamda ishlatish
run: echo "Versiya - ${{ steps.versiya.outputs.raqam }}"
- name: Muhit o'zgaruvchisi sifatida saqlash
run: echo "QURISH_VAQTI=$(date -u +%H:%M)" >> "$GITHUB_ENV"
- name: Uni ham ishlatish
run: echo "Qurildi - $QURISH_VAQTI"
Versiya - 1.4.2
Qurildi - 09:41
| Fayl | Nima uchun | Qanday o'qiladi |
|---|---|---|
$GITHUB_OUTPUT | Qadam natijasi | steps.<id>.outputs.<nom> |
$GITHUB_ENV | Muhit o'zgaruvchisi | $NOM yoki env.NOM |
$GITHUB_PATH | PATH ga papka qo'shish | Keyingi qadamlarda avtomatik |
$GITHUB_STEP_SUMMARY | Ishga tushirish sahifasidagi hisobot | Markdown sifatida ko'rinadi |
$GITHUB_STEP_SUMMARY ga yozilgan Markdown ishga tushirish sahifasining
yuqorisida chiroyli ko'rinadi - jurnalni ochib o'tirish shart emas:
- name: Hisobot
run: |
echo "## Test natijalari" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "| Toifa | Soni |" >> "$GITHUB_STEP_SUMMARY"
echo "|-------|------|" >> "$GITHUB_STEP_SUMMARY"
echo "| O'tdi | 42 |" >> "$GITHUB_STEP_SUMMARY"
echo "| Yiqildi | 0 |" >> "$GITHUB_STEP_SUMMARY"
Joblar orasida ma'lumot uzatish #
Joblar turli mashinalarda ishlaydi, shuning uchun ular outputs orqali
gaplashadi:
jobs:
tayyorlash:
runs-on: ubuntu-latest
outputs:
versiya: ${{ steps.aniqla.outputs.raqam }}
steps:
- id: aniqla
run: echo "raqam=1.4.2" >> "$GITHUB_OUTPUT"
qurish:
needs: tayyorlash
runs-on: ubuntu-latest
steps:
- run: echo "Quriladigan versiya - ${{ needs.tayyorlash.outputs.versiya }}"
Quriladigan versiya - 1.4.2
Runner turlari #
| Runner | Nima uchun |
|---|---|
ubuntu-latest | Kundalik tanlov - eng tez va arzon |
ubuntu-22.04 | Versiya aniq kerak bo'lganda |
windows-latest | .NET, Windows uchun qurish |
macos-latest | iOS va macOS ilovalari |
self-hosted | O'z serveringiz (17-bo'lim) |
GitHub bepul daqiqalarni runner turiga qarab hisoblaydi. Windows odatda Linux'dan qimmatroq, macOS esa eng qimmati.
Ochiq repozitoriyda hammasi bepul, yopiq repozitoriyda esa Linux'ni
tanlash eng tejamkor yo'l. Sarfni Settings -> Billing -> Actions
bo'limida kuzating.
Vaqt chegarasi #
Osilib qolgan job bepul daqiqalarni yeydi. Har bir job uchun chegara qo'ying:
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- run: echo "Testlar"
Sukut bo'yicha chegara 360 daqiqa - bu juda uzoq. Oddiy test jobi uchun 10-15 daqiqa yetarli; u oshib ketsa, demak nimadir noto'g'ri.
- Uchta parallel job yozing va Actions sahifasida ular bir vaqtda ishlashini ko'ring.
- Ularga
needsqo'shib, ketma-ket ishlashga majburlang va vaqt farqini solishtiring. - Birinchi jobni ataylab yiqiting (
exit 1) va keyingilariskippedbo'lishini kuzating. if: github.ref == 'refs/heads/main'sharti bilan job yozing va boshqa tarmoqda sinang.if: failure()bilan xato haqida xabar beradigan qadam qo'shing.envni uch darajada e'lon qilib, qaysi biri g'olib chiqishini tekshiring.$GITHUB_OUTPUTorqali bir qadamdan ikkinchisiga qiymat uzating.$GITHUB_ENVbilan muhit o'zgaruvchisi yarating va keyingi qadamda o'qing.$GITHUB_STEP_SUMMARYga jadval yozib, ishga tushirish sahifasida ko'ring.- Har bir jobga
timeout-minutesqo'shing va sababini izohda yozing.
Xulosa #
- Joblar sukut bo'yicha parallel ishlaydi - bu quvurning eng arzon tezlanishi.
needstartib o'rnatadi; yiqilgan job o'zidan keyingilarni butunlay to'xtatadi.ifjob va qadam darajasida ishlaydi;if:ichida${{ }}shart emas.failure(),always()vacancelled()- xato va tozalash qadamlari uchun.envuch darajada e'lon qilinadi: workflow, job, qadam; quyi daraja yuqorisini qoplaydi.- Har bir qadam alohida shell - oddiy o'zgaruvchi keyingi qadamga o'tmaydi.
- Qadamlar orasida
$GITHUB_OUTPUT, joblar orasidaoutputsishlatiladi. $GITHUB_ENVmuhit o'zgaruvchisini,$GITHUB_STEP_SUMMARYesa hisobotni yozadi.- Runner turi narxga ta'sir qiladi: Linux eng arzon, macOS eng qimmat.
- Sukutdagi 360 daqiqalik chegara juda uzun - har bir jobga
timeout-minutesyozing.
Keyingi bo'limda bitta kodni bir nechta versiya va platformada sinaydigan matritsali qurish 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.