13 β Test va build pipeline¶
β¬ οΈ Oldingi: 12 β CI/CD va GitHub Actions asoslari Β· π README Β· Keyingi: 14 β Docker image CI va GHCR β‘οΈ
Bu bobda: 12-bobda ko'rgan workflow anatomiyasidan to'liq, ishlatishga tayyor CI pipeline'ga o'tamiz β namuna
vazifalar-apiilovasi uchunactions/checkout@v6+actions/setup-node@v6(cache: npmbilan),npm ciβnpm run lintβnpm testβnpm run buildzanjirini quramiz;strategy.matrixorqali ilovani bir nechta Node versiyasida (20/22/24) parallel sinaymiz vafail-fastni boshqaramiz; bog'liqliklarniactions/cache@v5bilan (yoki setup-node'ning o'rnatilgan keshi bilan)hashFileskaliti orqali keshlaymiz; build natijasiniactions/upload-artifact@v4bilan saqlaymiz;needs:,if:vaconcurrencybilan job'larni bog'lab eski run'larni bekor qilamiz; va README'ga status badge qo'shib, branch himoyasida required status check sozlaymiz β shunda yashil belgi PR'ni qo'shishning sharti bo'ladi.
Muammo: "test qildingmi?" β "albatta... shekilli"¶
12-bobda birinchi workflow'ni yozdik: u push bo'lganda ishga tushib, bitta run qadamni bajardi. Bu β boshlanish. Lekin haqiqiy loyihada CI'ning vazifasi bitta: buzuq kod main shoxiga (branch) tushmasin.
Tasavvur qiling, jamoadasiz. Hamkasbingiz PR ochadi va "menda ishlayapti" deydi. Lekin uning kompyuterida Node 24, serverda esa 20; u test yozgan, lekin oxirgi o'zgarishdan keyin ishlatib ko'rmagan; lint xatosi bor, kod uslubi buzilgan. Bularning hammasini qo'lda tekshirish β charchatadi va unutiladi.
CI pipeline aynan shu ishonchni avtomatlashtiradi: har push va har PR'da kodni bir xil, takrorlanadigan muhitda lint qiladi, test qiladi, quradi. O'tmasa β qizil belgi, PR bloklanadi. O'tsa β yashil, ishonch bilan birlashtirasiz.
π CI'ning oltin qoidasi: lokalda ishlash yetarli emas. "Ishonchli" degani β toza muhitda, har safar, hamma uchun bir xil ishlaydi. CI buni kafolatlaydi.
βΉοΈ Bu bob Git & GitHub kitobida va 12-bobda ko'rgan GitHub Actions asoslariga (workflow,
on,jobs,steps,uses,run, runner) tayanadi. Yangi bo'lsa, avval 12-bobni ko'rib chiqing.
Namuna ilova: vazifalar-api¶
Kitob bo'ylab izchil ishlatadigan namuna β kichik vazifalar API (vazifalar-api, Node.js/Express). Uning package.json'ida CI uchun kerakli to'rtta skript bor:
{
"name": "vazifalar-api",
"version": "1.2.3",
"type": "module",
"scripts": {
"lint": "node --check src/server.js",
"test": "node --test",
"build": "node build.js",
"start": "node src/server.js"
}
}
lintβ kod uslubi/sintaksisini tekshiradi (haqiqiy loyihada bu odatda ESLint, bu yerda soddalik uchunnode --check).testβ Node'ning o'rnatilgan test ishlatuvchisi (node --test, qo'shimcha paketsiz).test/papkasidagi*.test.jsfayllarni topadi va ishlatadi.buildβ ilovanidist/papkasiga quradi (artifact shu yerdan olinadi).startβ ishga tushiradi (CI'da ishlatmaymiz, lekin deploy uchun kerak).
Bizning testimiz β vazifa qo'shish/bajarish mantig'ini sinaydigan oddiy birliklar (unit testlar):
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { vazifaQosh, bajarilmaganlar } from '../src/vazifalar.js';
test('vazifaQosh yangi vazifa qo\'shadi', () => {
const r = vazifaQosh([], 'kod yozish');
assert.equal(r.length, 1);
assert.equal(r[0].bajarildi, false);
});
test('vazifaQosh bo\'sh matnda xato beradi', () => {
assert.throws(() => vazifaQosh([], ' '), /Bo'sh vazifa/);
});
π‘ Bu testlar haqiqiy: lokalda npm test ishga tushirilganda node --test ularni topadi, ishlatadi va pass 4 / fail 0 deb hisobot beradi. Agar kod buzilsa β fail chiqadi va (CI'da) qadam qizil bo'ladi. Pipeline'ning "test" bosqichi shunchaki bezak emas, u haqiqatan xatoni ushlaydi.
To'liq CI pipeline: checkout β setup β install β tekshirish¶
Endi 12-bobdagi bitta qadamli workflow o'rniga to'liq pipeline yozamiz. Faylni .github/workflows/ci.yml ga joylaymiz.
Avval sodda, bitta job'li variant (keyin uni job'larga bo'lamiz):
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run lint
- run: npm test
- run: npm run build
Har qadamni ko'rib chiqamiz:
actions/checkout@v6β repozitoriya kodini runner'ga ko'chiradi. Busiz runner'da kodingiz yo'q. (Tasdiqlangan latest:@v6.)actions/setup-node@v6β runner'ga Node.js o'rnatadi.node-version: 22β qaysi versiya;cache: npmβ bog'liqliklarni avtomatik keshlaydi (pastda batafsil).npm ciβ bog'liqliklarni o'rnatadi. βnpm installemas!npm cipackage-lock.json'ga aniq mos o'rnatadi (takrorlanadigan, tez, CI uchun maxsus).npm installlock faylni o'zgartirib yuborishi mumkin.npm run lintβ kod uslubini tekshiradi.npm testβ testlarni ishlatadi.npm run buildβ ilovani quradi.
π on: ikkita hodisani tinglaydi: push (main'ga) va pull_request (main'ga qaratilgan). Shunday qilib pipeline PR ochilganda ham, birlashtirilgandan keyin ham ishlaydi. PR'dagi yashil/qizil belgi β kod ko'rib chiqishning asosiy signali.
β οΈ cache: npm ishlashi uchun loyihada package-lock.json bo'lishi shart (setup-node shu fayldan kesh kalitini hisoblaydi). Lokalda kamida bir marta npm install qilib lock faylni yarating va commit qiling.
Job'larga bo'lish: needs bilan zanjir¶
Bitta job hammasini ketma-ket bajaradi β ishlaydi, lekin kamchiligi bor: agar lint o'tib, test qulasa, sizga qaysi bosqich muammoga sabab bo'lganini darrov ko'rsatmaydi (hammasi bitta yashil/qizil). Yaxshiroq yondashuv β har bosqichni alohida job qilish va ularni needs: bilan zanjirlash.
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run lint
test:
needs: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm test
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run build
- uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
retention-days: 7
needs: lintβtestjob'i faqatlintmuvaffaqiyatli tugagandan keyin boshlanadi.needs: testβbuildfaqattesto'tgach ishga tushadi.- Agar
lintqulasa βtestvabuildumuman ishga tushmaydi (runner vaqti tejaladi).
βΉοΈ Diqqat: har job alohida runner'da, toza muhitda ishlaydi. Shuning uchun har birida checkout + setup-node + npm ci qaytariladi. Bu ortiqcha tuyulishi mumkin, lekin job'lar mustaqil bo'lishi izolyatsiya beradi. Kesh tufayli npm ci baribir tez bo'ladi (pastda).
π‘ needs ro'yxat ham bo'lishi mumkin: needs: [lint, test] β ikkalasi ham tugashini kutadi. Va needssiz job'lar bir-biriga parallel ishlaydi. Zanjir kerak bo'lsa needs, parallel kerak bo'lsa β needssiz qoldiring.
Matrix: bir nechta versiyada parallel sinash¶
Ilovangiz Node 22'da ishlaydi. Lekin foydalanuvchilar 20'da ishlatsa-chi? Yoki kelajakdagi 24'da? Har versiyani qo'lda sinash β uzoq. strategy.matrix buni avtomatlashtiradi: bitta job ta'rifini bir nechta variant bo'yicha parallel ko'paytiradi.
name: CI matrix
on:
push:
branches: [main]
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
node-version: [20, 22, 24]
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
cache: npm
- run: npm ci
- run: npm test
Nima bo'ladi:
matrix.node-version: [20, 22, 24]β uchta qiymat. GitHub bu bittatestjob'ni uchta alohida parallel job'ga yoyadi:test (20),test (22),test (24).- Har job ichida
${{ matrix.node-version }}o'sha job'ning qiymatiga almashtiriladi. Demak har biri o'z Node versiyasidanpm testishlatadi. os: [ubuntu-latest]β bu yerda bitta OS, lekin[ubuntu-latest, windows-latest, macos-latest]qilsangiz, matrix ko'paytiriladi: OS Γ versiya. Masalan 3 OS Γ 3 versiya = 9 parallel job.
fail-fast: tez to'xtatish yoki hammasini ko'rish¶
fail-fast: true(standart) β matrix'dagi bittasi qulasa, GitHub qolgan parallel job'larni darrov bekor qiladi. Tez signal, runner tejaydi.fail-fast: falseβ bittasi qulasa ham qolganlari oxirigacha ishlaydi. Shunda "faqat Node 20'da muammo, 22 va 24 yaxshi" degan to'liq manzarani ko'rasiz.
π‘ Maslahat: ish jarayonida muammoni to'liq tushunish uchun fail-fast: false qulay (qaysi versiyalarda yiqilganini ko'rasiz). Tez fikr-mulohaza kerak bo'lsa β standart true'ni qoldiring.
β οΈ matrix strategy ostiga yoziladi, to'g'ridan-to'g'ri job ostiga emas. Va matrix o'zgaruvchilariga ${{ matrix.<nom> }} orqali murojaat qilinadi β boshqacha yozsangiz GitHub uni tanimaydi.
Kesh: har safar internetdan yuklamaslik¶
npm ci har ishga tushganda bog'liqliklarni internetdan yuklab oladi. Katta loyihada bu daqiqalar. Yechim β bir marta yuklab, keshlash: keyingi run'larda lock fayli o'zgarmagan bo'lsa, keshdan tez tiklab olamiz.
Eng oson yo'l: setup-node'ning o'rnatilgan keshi¶
Yuqorida allaqachon ishlatdik:
cache: npm β setup-node o'zi package-lock.json asosida npm keshini saqlab/tiklab beradi. Ko'p loyiha uchun shu yetarli β qo'lda hech narsa sozlamaysiz.
Aniq nazorat: actions/cache@v5¶
Agar keshni o'zingiz boshqarmoqchi bo'lsangiz (masalan boshqa papkani keshlash kerak), actions/cache@v5 ishlatasiz:
- uses: actions/setup-node@v6
with:
node-version: 22
- name: npm keshini tiklash
uses: actions/cache@v5
with:
path: ~/.npm
key: npm-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
npm-${{ runner.os }}-
- run: npm ci
Bu yerda eng muhimi β kalit (key):
hashFiles('**/package-lock.json')β lock faylning xeshini (barmoq izi) hisoblaydi. Lock o'zgarmasa β xesh bir xil β kalit bir xil β cache hit (keshdan tiklanadi). Lock o'zgarsa β yangi xesh β yangi kalit β cache miss (qaytadan yuklab, yangi keshni saqlaydi).runner.osβ kalitga OS qo'shadi, chunki Linux va Windows keshi mos kelmaydi.restore-keysβ aniq kalit topilmasa, shu prefiks bilan eng yaqin eski keshni ishlatadi (to'liq yuklashdan ko'ra qisman foydali).
π Kalit qoidasi: kalit kirishlarga (bu yerda lock fayl) bog'liq bo'lsin. Agar kalitni o'zgartirmasangiz, kesh "muzlab qoladi" va yangi bog'liqliklar olinmaydi. hashFiles aynan shuni hal qiladi β kirish o'zgarsa kalit avtomatik o'zgaradi.
π‘ Qaysi birini tanlash? Oddiy Node loyihasi uchun cache: npm (setup-node ichidagi) β eng oson va yetarli. actions/cache@v5'ni faqat maxsus papka yoki murakkab holatda ishlating.
Artifact: build natijasini saqlash¶
build job ilovani dist/ ga quradi. Lekin job tugashi bilan runner o'chiriladi β dist/ yo'qoladi. Agar natijani saqlab qolmoqchi bo'lsangiz (keyin yuklab olish, yoki keyingi job'ga uzatish uchun), artifact sifatida yuklaysiz:
- run: npm run build
- uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
retention-days: 7
name: distβ artifact nomi (GitHub UI'da shu nom bilan ko'rinadi).path: dist/β qaysi papka/fayllarni saqlash.retention-days: 7β necha kun saqlanadi (standart 90, bu yerda 7 kun β joy tejaydi).
Run tugagach, GitHub'da o'sha run sahifasida "Artifacts" bo'limida dist paydo bo'ladi β uni .zip qilib yuklab olish mumkin.
Boshqa job'da uni qaytadan olish uchun actions/download-artifact@v4 ishlatiladi:
βΉοΈ Artifact'lar β job'lar orasida fayl uzatishning standart yo'li (har job alohida runner'da, fayl tizimi umumiy emas). 14-bobda Docker image'ni qurganda buni kengaytiramiz; 15-bobda artifact'ni deploy'da ishlatamiz.
π‘ Artifact β kesh emas. Kesh β tezlashtirish uchun (bog'liqliklar), yo'qolsa qaytadan yuklanadi. Artifact β natijani saqlash/uzatish uchun (build chiqishi, test hisoboti, log).
concurrency: eski run'larni bekor qilish¶
Tasavvur qiling, bitta PR'ga ketma-ket uch marta push qildingiz. CI uch marta ishga tushadi β lekin birinchi ikkitasining natijasi endi keraksiz (eng oxirgi kod muhim). Ular bekorga runner band qiladi. concurrency buni hal qiladi:
groupβ bir "guruh"ga tegishli run'lar.github.refβ branch/PR havolasi, demak guruh har branch uchun alohida.cancel-in-progress: trueβ o'sha guruhda yangi run boshlansa, avvalgi tugamagan run bekor qilinadi.
To'liq ci.ymlning boshi shunday ko'rinadi:
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
# ... (yuqoridagidek)
π concurrency ayniqsa tez-tez push qilinadigan loyihalarda runner daqiqalarini sezilarli tejaydi va natijalar tartibsizligini oldini oladi.
if: shartli qadamlar¶
Ba'zan qadamni faqat ma'lum sharrtda ishlatish kerak. if: shu uchun:
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
# ... build qadamlar ...
- name: Faqat main'da xabar
if: github.ref == 'refs/heads/main'
run: echo "main shoxida build tugadi"
if: github.ref == 'refs/heads/main'β bu qadam faqatmain'ga push'da ishlaydi, PR'da o'tkazib yuboriladi.- Foydali
ifqiymatlari:if: success()(standart β oldingilar o'tgan bo'lsa),if: failure()(biror narsa qulagan bo'lsa β masalan log yig'ish),if: always()(har doim β tozalash qadami uchun).
π‘ if: failure() bilan "test qulasa, log/skrinshotni artifact qilib yukla" degan qadam yozish β debug uchun juda qulay amaliyot.
Status badge: README'da yashil belgi¶
Pipeline ishlayapti β endi uning holatini hammaga ko'rsataylik. Status badge β README'dagi kichik rasm: yashil "passing" yoki qizil "failing". Repozitoriyangizning sog'lig'ini bir qarashda ko'rsatadi.
Markdown'da README'ga qo'shasiz:
ioqil/vazifalar-apiβ<foydalanuvchi>/<repo>(o'zingiznikiga almashtiring).ci.ymlβ workflow fayl nomi (.github/workflows/ichidagi)./badge.svgβ GitHub avtomatik yaratadigan jonli rasm: oxirgi run holatiga qarab yashil/qizil bo'ladi.
βΉοΈ Illustrativ: badge'ning rangi real GitHub'dagi workflow run'iga bog'liq β repozitoriyangizda workflow kamida bir marta ishlagach jonlanadi. Belgini bosish to'g'ridan-to'g'ri Actions sahifasiga olib boradi. Aniq URL'ni GitHub Actions sahifasida workflow'ni ochib, "..." β "Create status badge" orqali ham olishingiz mumkin.
Branch himoyasi: yashilsiz birlashtirib bo'lmaydi¶
Eng muhim qadam: CI yashil bo'lishini PR birlashtirishning majburiy shartiga aylantirish. Aks holda, kimdir qizil CI'ni e'tiborsiz qoldirib main'ga birlashtirsa, butun mehnat behuda.
GitHub'da repozitoriya Settings β Branches β Add branch ruleset (yoki klassik Branch protection rules) orqali main uchun qoida qo'shasiz:
- Require status checks to pass before merging β birlashtirishdan oldin status check'lar o'tishi shart.
- Ro'yxatdan kerakli check'larni tanlaysiz: masalan
lint,test,build(yoki matrix bo'lsatest (20),test (22),test (24)). - Require branches to be up to date before merging β PR
main'ning eng yangi holatiga yangilangan bo'lishini talab qiladi (ixtiyoriy, lekin tavsiya).
βΉοΈ Illustrativ: branch himoyasi GitHub'ning veb-interfeysida (Settings) sozlanadi β repozitoriya egasi yoki admin huquqi kerak. Buni o'z repozitoriyangizda bajaring. Sozlangach, qizil CI'li PR'da "Merge" tugmasi bloklanadi β yashil bo'lmaguncha birlashtirib bo'lmaydi.
π Bu β CI'ning butun ma'nosi: avtomatik tekshiruv majburiy darvoza (gate) bo'ladi. Inson e'tibordan chetda qoldirishi mumkin, darvoza β yo'q.
Hammasi birga: to'liq ci.yml¶
Quyida bu bobdagi g'oyalarni birlashtiruvchi to'liq workflow. lint β test β build zanjiri, kesh, artifact va concurrency bilan:
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run lint
test:
needs: lint
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: [20, 22, 24]
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
cache: npm
- run: npm ci
- run: npm test
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run build
- uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
retention-days: 7
Bu pipeline: lint o'tsa β test uchta Node versiyasida parallel ishlaydi β hammasi o'tsa β build quradi va dist/ artifactini saqlaydi. Eski run'lar bekor qilinadi, bog'liqliklar keshlanadi.
π 14-bobda bu pipeline'ga Docker image qurish va GHCR'ga push qadamini qo'shamiz; 15-bobda esa artifact/image'ni avtomatik serverga deploy qilamiz. Shu bilan kod β test β build β deploy to'liq avtomat bo'ladi.
13-bob mashqlari¶
Workflow'larni
.github/workflows/papkasiga joylab, o'z GitHub repozitoriyangizga push qilib sinang. Lokalda esanpm ci/npm run lint/npm test/npm run buildβ to'g'ri yozilganini tekshirish uchun ishlating. Branch himoyasi va badge'ning jonlanishi GitHub repozitoriyasini talab qiladi (illustrativ).
Oson
- Yangi
.github/workflows/ci.ymlyarating:on: push, bittacijob,ubuntu-latest,checkout@v6+setup-node@v6(node-version: 22) +npm ci+npm test. npm civanpm installfarqi nima? CI'da neganpm ciafzal? Bir-ikki jumlada yozing.- Workflow'ni
push'dan tashqaripull_request'da ham ishlatish uchunon:blokini qanday yozasiz? actions/upload-artifact@v4daname,path,retention-daysβ har biri nimani anglatadi?- README'ga
vazifalar-apirepozitoriyasi (foydalanuvchiioqil, workflowci.yml) uchun status badge markdown qatorini yozing.
O'rta
lint,test,buildβ uchta alohida job qiling vaneeds:bilan zanjirlang: lint β test β build.lintqulasa nima bo'ladi?setup-node'ningcache: npmopsiyasi nima qiladi va ishlashi uchun loyihada qaysi fayl bo'lishi shart?concurrencyblokidacancel-in-progress: truenima foyda beradi? Qaysi vaziyatda eng muhim?- Bir qadamni faqat
mainshoxiga push bo'lganda ishlatmoqchisiz.if:qatorini yozing. fail-fast: truevafail-fast: falseorasidagi farqni matrix kontekstida tushuntiring. Qaysi birida muammoning to'liq manzarasini ko'rasiz?
Yechim
fail-fast: true(standart): matrix'dagi bittasi qulashi bilan GitHub qolgan parallel job'larni darrov bekor qiladi β tez signal, runner tejaydi.fail-fast: false: bittasi qulasa ham qolganlari oxirigacha ishlaydi β masalan "faqat Node 20'da muammo, 22/24 yaxshi" degan to'liq manzarani ko'rasiz.
To'liq manzara kerak bo'lsa false'ni tanlang.
Qiyin
testjob'inistrategy.matrixbilan uchta Node versiyasida (20, 22, 24) parallel ishlaydigan qiling.fail-fast: falseqo'shing. Bitta to'liq job yozing.
Yechim
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: [20, 22, 24]
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
cache: npm
- run: npm ci
- run: npm test
GitHub bu bitta test ta'rifini uchta parallel job'ga (test (20), test (22), test (24)) yoyadi. ${{ matrix.node-version }} har job'da o'sha qiymatga almashadi. fail-fast: false tufayli biri qulasa ham qolganlari oxirigacha ishlaydi.
actions/cache@v5bilan npm keshini aniq sozlang:path: ~/.npm, kalitpackage-lock.jsonxeshiga bog'liq bo'lsin, va aniq mos kelmasa eski keshni topadiganrestore-keysqo'shing.
Yechim
- uses: actions/setup-node@v6
with:
node-version: 22
- name: npm keshini tiklash
uses: actions/cache@v5
with:
path: ~/.npm
key: npm-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
npm-${{ runner.os }}-
- run: npm ci
hashFiles('**/package-lock.json') lock faylning xeshini hisoblaydi: lock o'zgarmasa kalit bir xil (cache hit), o'zgarsa yangi kalit (cache miss β qaytadan yuklab, yangi keshni saqlaydi). runner.os Linux/Windows keshlarini ajratadi. restore-keys aniq kalit topilmaganda eng yaqin eski keshni tiklaydi.
- To'liq
ci.ymlyozing:onpush+PR (main),concurrency(eski run'larni bekor qilish),lint β test β buildzanjiri (needs), test matrix'da (20/22/24),buildartifact (dist/) saqlaydi.
Yechim
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run lint
test:
needs: lint
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: [20, 22, 24]
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
cache: npm
- run: npm ci
- run: npm test
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run build
- uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
retention-days: 7
lint o'tsa test uchta versiyada parallel, hammasi o'tsa build quradi va dist/ni artifact qiladi. concurrency eski run'larni bekor qiladi, cache: npm npm cini tezlashtiradi.
buildjob'i quradi, lekin artifact'ni keyingi (faraziyreport) job'da ishlatmoqchisiz.build'da yuklash vareport'da qaytadan olish qadamlarini yozing (upload-artifact@v4/download-artifact@v4,needs).
Yechim
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with: { node-version: 22, cache: npm }
- run: npm ci
- run: npm run build
- uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
report:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with:
name: dist
path: dist/
- run: ls -la dist/
Har job alohida runner'da, fayl tizimi umumiy emas β shuning uchun build natijani artifact qilib yuklaydi, report esa needs: build bilan kutib, download-artifact orqali qaytadan oladi. Bu β job'lar orasida fayl uzatishning standart yo'li.
- CI yashil bo'lishini PR birlashtirishning majburiy sharti qilish uchun GitHub'da qaysi sozlamani yoqasiz va u nimani bloklaydi? (Konseptual javob.)
Yechim
GitHub'da Settings β Branches orqali main uchun branch himoya qoidasi (ruleset / branch protection) qo'shiladi va "Require status checks to pass before merging" yoqiladi; so'ng kerakli check'lar (lint, test (20/22/24), build) tanlanadi. Sozlangach, qizil CI'li PR'da "Merge" tugmasi bloklanadi β yashil bo'lmaguncha birlashtirib bo'lmaydi. (Illustrativ β GitHub veb-interfeysida, admin huquqi bilan bajariladi.) Bu CI'ni majburiy darvozaga aylantiradi: inson e'tibordan chetda qoldirishi mumkin, darvoza yo'q.
- Quyidagi workflow β eski/noto'g'ri amaliyotlarga ega. Uchta muammoni toping va to'g'rilang.
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v6
- run: npm install
- run: npm test
Yechim
Muammolar va tuzatish:
actions/checkout@v3eskirgan β tasdiqlangan latest@v6ga yangilang.npm installCI'da noto'g'ri βnpm ciishlating (lock faylga aniq mos, takrorlanadigan).setup-node'danode-versionva keshsiz β versiyani aniq belgilang va keshni yoqing.
To'g'ri variant:
β¬ οΈ Oldingi: 12 β CI/CD va GitHub Actions asoslari Β· π README Β· Keyingi: 14 β Docker image CI va GHCR β‘οΈ