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.

🕑 11 daqiqa o‘qish 📄 766 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Joblar parallel ishlaydi
  2. needs - tartib o'rnatish
  3. Shartlar - if
  4. Muhit o'zgaruvchilari
  5. Qadamlar orasida ma'lumot uzatish
  6. Joblar orasida ma'lumot uzatish
  7. Runner turlari
  8. Vaqt chegarasi
  9. Xulosa

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 #

YAML
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.

Parallel (sukut bo'yicha) needs bilan ketma-ket linter (40s) testlar (95s) xavfsizlik (30s) Jami: 95 soniya test (95s) qurish (60s) deploy (25s) Jami: 180 soniya Bog'liq bo'lmagan ishlarni parallel qoldiring - bu quvurning eng arzon tezlanishi
Vaqt ko'rsatkichlari misol uchun - muhimi nisbat: parallelda eng uzunining vaqti, ketma-ketda yig'indi

needs - tartib o'rnatish #

YAML
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"
YozuvMa'nosi
needs: testtest yashil bo'lsagina boshlanadi
needs: [test, qurish]Ikkalasi ham tugashini kutadi
needs yozilmaganDarhol, boshqalar bilan parallel boshlanadi
Yiqilgan job zanjirni to'xtatadi

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:

YAML
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:

ShartQachon 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
YAML
      - 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 emas

Job va qadam darajasidagi if: ifodani o'zi hisoblaydi, shuning uchun qavslarsiz yoziladi:

YAML
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:

YAML
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"
Natija
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:

YAML
      - name: Bu ishlamaydi
        run: NATIJA=salom

      - name: Bu yerda NATIJA bo'sh
        run: echo "$NATIJA"

To'g'ri usul - maxsus fayllarga yozish:

YAML
      - 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"
Natija
Versiya - 1.4.2
Qurildi - 09:41
FaylNima uchunQanday o'qiladi
$GITHUB_OUTPUTQadam natijasisteps.<id>.outputs.<nom>
$GITHUB_ENVMuhit o'zgaruvchisi$NOM yoki env.NOM
$GITHUB_PATHPATH ga papka qo'shishKeyingi qadamlarda avtomatik
$GITHUB_STEP_SUMMARYIshga tushirish sahifasidagi hisobotMarkdown sifatida ko'rinadi
Hisobot yozish - kam ishlatiladigan, lekin juda foydali imkoniyat

$GITHUB_STEP_SUMMARY ga yozilgan Markdown ishga tushirish sahifasining yuqorisida chiroyli ko'rinadi - jurnalni ochib o'tirish shart emas:

YAML
      - 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:

YAML
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 }}"
Natija
Quriladigan versiya - 1.4.2

Runner turlari #

RunnerNima uchun
ubuntu-latestKundalik tanlov - eng tez va arzon
ubuntu-22.04Versiya aniq kerak bo'lganda
windows-latest.NET, Windows uchun qurish
macos-latestiOS va macOS ilovalari
self-hostedO'z serveringiz (17-bo'lim)
Yopiq repozitoriyda narx bir xil emas

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:

YAML
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.

Amaliy topshiriq
  1. Uchta parallel job yozing va Actions sahifasida ular bir vaqtda ishlashini ko'ring.
  2. Ularga needs qo'shib, ketma-ket ishlashga majburlang va vaqt farqini solishtiring.
  3. Birinchi jobni ataylab yiqiting (exit 1) va keyingilari skipped bo'lishini kuzating.
  4. if: github.ref == 'refs/heads/main' sharti bilan job yozing va boshqa tarmoqda sinang.
  5. if: failure() bilan xato haqida xabar beradigan qadam qo'shing.
  6. env ni uch darajada e'lon qilib, qaysi biri g'olib chiqishini tekshiring.
  7. $GITHUB_OUTPUT orqali bir qadamdan ikkinchisiga qiymat uzating.
  8. $GITHUB_ENV bilan muhit o'zgaruvchisi yarating va keyingi qadamda o'qing.
  9. $GITHUB_STEP_SUMMARY ga jadval yozib, ishga tushirish sahifasida ko'ring.
  10. Har bir jobga timeout-minutes qo'shing va sababini izohda yozing.

Xulosa #

  • Joblar sukut bo'yicha parallel ishlaydi - bu quvurning eng arzon tezlanishi.
  • needs tartib o'rnatadi; yiqilgan job o'zidan keyingilarni butunlay to'xtatadi.
  • if job va qadam darajasida ishlaydi; if: ichida ${{ }} shart emas.
  • failure(), always() va cancelled() - xato va tozalash qadamlari uchun.
  • env uch 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 orasida outputs ishlatiladi.
  • $GITHUB_ENV muhit o'zgaruvchisini, $GITHUB_STEP_SUMMARY esa hisobotni yozadi.
  • Runner turi narxga ta'sir qiladi: Linux eng arzon, macOS eng qimmat.
  • Sukutdagi 360 daqiqalik chegara juda uzun - har bir jobga timeout-minutes yozing.

Keyingi bo'limda bitta kodni bir nechta versiya va platformada sinaydigan matritsali qurish 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.