3-bo‘lim
Hodisalar va triggerlar
on kaliti, push va pull_request, tarmoq va yo'l filtrlari, jadval bo'yicha ishga tushirish va keraksiz ishlarni to'xtatish.
Ushbu bo‘lim mundarijasi
Quvur qachon ishlashi kerak? Har bir kommitda? Faqat asosiy tarmoqda? Har
kecha? Bunga on: kaliti javob beradi va u workflow faylidagi eng muhim
qarorlardan biri.
Eng ko'p ishlatiladigan hodisalar #
| Hodisa | Qachon ishlaydi | Odatda nima uchun |
|---|---|---|
push | Kod tarmoqqa yuborilganda | Testlar, qurish |
pull_request | PR ochilganda yoki yangilanganda | Kodni birlashtirishdan oldin tekshirish |
workflow_dispatch | Odam tugma bosganda | Deploy, bir martalik vazifalar |
schedule | Vaqt jadvali bo'yicha | Kechasi to'liq testlar, zaxira |
release | Reliz chop etilganda | Paket nashr qilish |
issues, issue_comment | Muammo yoki izoh bilan ishlanganda | Avtomatik javob, yorliq qo'yish |
push va pull_request - asosiy juftlik #
name: Testlar
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: echo "Testlar ishlayapti"
Bu eng keng tarqalgan sozlama. U shuni bildiradi:
mainga to'g'ridan-to'g'ri push bo'lganda - tekshir;mainga qaratilgan PR ochilganda yoki unga yangi kommit qo'shilganda - tekshir.
Faqat push yozilsa - PR sahifasida tekshiruv natijasi ko'rinmaydi.
Faqat pull_request yozilsa - main ga to'g'ridan-to'g'ri tushgan kod
tekshirilmay qoladi.
Ikkalasi birga yozilganda GitHub takrorlanishning oldini oladi: PR ga tegishli tarmoqdagi kommit uchun bitta ishga tushirish bo'ladi.
Tarmoq va teg filtrlari #
on:
push:
branches:
- main
- 'reliz/**'
branches-ignore:
- 'qoralama/**'
tags:
- 'v*'
| Filtr | Ma'nosi |
|---|---|
branches: [main] | Faqat shu tarmoq |
branches: ['reliz/**'] | reliz/ bilan boshlanadigan hammasi |
branches-ignore | Sanab o'tilganlardan tashqari hammasi |
tags: ['v*'] | v1.0.0 kabi teglar |
branches va branches-ignore ni bitta hodisada birga ishlatib
bo'lmaydi - bittasini tanlang.
Yo'l bo'yicha filtr - eng foydali tejamkorlik #
Hujjatdagi bitta harf o'zgargani uchun butun test to'plamini ishga tushirish
keraksiz. paths buni hal qiladi:
on:
push:
paths:
- 'src/**'
- 'package.json'
- '.github/workflows/**'
paths-ignore:
- '**.md'
- 'docs/**'
paths va paths-ignore ham bitta hodisada birga ishlamaydi. Odatda
bittasi yetarli:
- kod papkasi aniq bo'lsa -
pathsishlating; - loyiha aralash bo'lsa -
paths-ignorebilan hujjatlarni chiqarib tashlang.
Jadval bo'yicha ishga tushirish #
on:
schedule:
- cron: '0 3 * * *'
Cron formati besh maydondan iborat:
┌─ daqiqa (0-59)
│ ┌─ soat (0-23)
│ │ ┌─ oyning kuni (1-31)
│ │ │ ┌─ oy (1-12)
│ │ │ │ ┌─ hafta kuni (0-6, 0 - yakshanba)
│ │ │ │ │
0 3 * * *
| Yozuv | Ma'nosi |
|---|---|
0 3 * * * | Har kuni soat 03:00 da |
*/15 * * * * | Har 15 daqiqada |
0 9 * * 1 | Har dushanba soat 09:00 da |
0 0 1 * * | Har oyning birinchi kuni |
GitHub Actions dagi cron har doim UTC bo'yicha ishlaydi.
Toshkent vaqti UTC+5, ya'ni:
| Toshkent | UTC | Cron |
|---|---|---|
| 08:00 | 03:00 | 0 3 * * * |
| 12:00 | 07:00 | 0 7 * * * |
| 00:00 | 19:00 (oldingi kun) | 0 19 * * * |
Yana ikki narsani biling: jadval bo'yicha ishga tushirish faqat asosiy tarmoqdan o'qiladi va u aniq daqiqada emas, bir necha daqiqa kechikib boshlanishi mumkin - GitHub yuklama bo'yicha navbatga qo'yadi.
Qo'lda ishga tushirish va kiritmalar #
workflow_dispatch ga parametr berish mumkin - shunda tugma bosilganda
forma chiqadi:
on:
workflow_dispatch:
inputs:
muhit:
description: 'Qaysi muhitga'
required: true
default: 'sinov'
type: choice
options:
- sinov
- ishlab-chiqarish
izoh:
description: 'Qisqacha izoh'
required: false
type: string
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Tanlovni ko'rsatish
run: |
echo "Muhit: ${{ inputs.muhit }}"
echo "Izoh: ${{ inputs.izoh }}"
Muhit: ishlab-chiqarish
Izoh: qo'lda chiqarilgan tuzatish
Hodisa turlari (types) #
Ba'zi hodisalarning ichki turlari bor. Masalan, PR yopilganda emas, faqat birlashtirilganda ishlashi kerak bo'lsa:
on:
pull_request:
types: [opened, synchronize, reopened]
| Tur | Qachon |
|---|---|
opened | PR yangi ochildi |
synchronize | PR ga yangi kommit qo'shildi |
reopened | Yopilgan PR qayta ochildi |
closed | PR yopildi (birlashtirilgan yoki yo'q) |
ready_for_review | Qoralama PR tayyor deb belgilandi |
Yozilmasa, pull_request uchun standart holat opened, synchronize va
reopened bo'ladi - ko'pchilik uchun aynan shu kerak.
Keraksiz ishlarni to'xtatish #
PR ga ketma-ket uchta kommit yuborsangiz, uchta ishga tushirish boshlanadi -
holbuki faqat oxirgisi muhim. concurrency eskisini bekor qiladi:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
cancel-in-progress yoqmangDeploy o'rtasida bekor qilingan ishga tushirish serverni yarim yangilangan holatda qoldirishi mumkin: fayllar ko'chirilgan, lekin xizmat qayta ishga tushirilmagan.
Bunday quvurlar uchun navbatni saqlang:
concurrency:
group: deploy-ishlab-chiqarish
cancel-in-progress: false
Shunda ikkinchi deploy birinchisi tugashini kutadi.
Hodisa haqida ma'lumot #
Har bir ishga tushirishda github konteksti mavjud:
- name: Hodisa haqida
run: |
echo "Hodisa: ${{ github.event_name }}"
echo "Tarmoq: ${{ github.ref_name }}"
echo "Kommit: ${{ github.sha }}"
echo "Muallif: ${{ github.actor }}"
Hodisa: push
Tarmoq: main
Kommit: 9f2c1ab7e4d5c3b8a16f0e7d2c9b4a8f5e3d1c06
Muallif: husanboy
| O'zgaruvchi | Nima beradi |
|---|---|
github.event_name | Hodisa nomi: push, pull_request ... |
github.ref_name | Tarmoq yoki teg nomi |
github.sha | Kommitning to'liq xeshi |
github.actor | Ishga tushirishni boshlagan foydalanuvchi |
github.repository | egasi/repozitoriy ko'rinishida |
pushvapull_requesthodisalarini bitta workflow ga qo'shing.- Yangi tarmoq ochib, unga kommit yuboring va qaysi hodisa ishlaganini kuzating.
- Shu tarmoqdan PR oching - endi qaysi hodisa ishladi?
branches: [main]filtri bilan boshqa tarmoqda ishlamasligini tekshiring.paths-ignorebilan**.mdfayllarini chiqarib tashlang va faqat README ni o'zgartirib push qiling.- Har kuni Toshkent vaqti bilan 09:00 da ishlaydigan
scheduleyozing. workflow_dispatchgamuhittanlovini qo'shing va tugma orqali ishga tushiring.githubkontekstidagi beshta qiymatni jurnalga chiqaring.concurrencyqo'shib, ketma-ket ikkita kommit yuboring va birinchisi bekor bo'lishini ko'ring.- Deploy quvuri uchun nega
cancel-in-progress: falsekerakligini uch jumlada yozing.
Xulosa #
on:kaliti quvur qachon ishlashini belgilaydi - bu eng muhim qarorlardan biri.- Odatiy juftlik:
push+pull_request, ikkalasimainga filtrlangan holda. branches,tagsvapathskeraksiz ishga tushirishlarni kesadi.branchesvabranches-ignore(xuddipathsvapaths-ignorekabi) birga ishlatilmaydi.scheduleUTC bo'yicha ishlaydi: Toshkentdagi 08:00 - bu0 3 * * *.- Jadval faqat asosiy tarmoqdan o'qiladi va bir necha daqiqa kechikishi mumkin.
workflow_dispatchtugma beradi,inputsesa unga forma qo'shadi.typeshodisaning qaysi holatida ishlashini aniqlaydi.concurrencyeski ishga tushirishlarni bekor qilib, navbat va hisobni tejaydi.- Deploy quvurida
cancel-in-progress: falsebo'lishi kerak - yarim bajarilgan deploy xavfli.
Keyingi bo'limda job, step va runner'lar bilan chuqurroq 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.