6-bo‘lim
Kesh va quvur tezligi
Bog'liqliklarni keshlash, kesh kaliti va restore-keys, nimani keshlash kerak emas va quvurni tezlashtirishning boshqa usullari.
Ushbu bo‘lim mundarijasi
Har bir ishga tushirish toza mashinada boshlanadi. Demak npm install har
safar noldan ishlaydi va minglab faylni internetdan tortadi. Kesh aynan shu
takrorni yo'q qiladi.
Muammo raqamlarda #
O'rtacha Node loyihasida qadamlar shunday taqsimlanadi:
| Qadam | Keshsiz | Kesh bilan |
|---|---|---|
| Kodni olish | 3 s | 3 s |
| Node o'rnatish | 2 s | 2 s |
| Bog'liqliklarni o'rnatish | 45 s | 6 s |
| Testlar | 20 s | 20 s |
| Jami | 70 s | 31 s |
Kuniga yigirma marta ishga tushsa, bu kuniga o'n uch daqiqa tejaladi - va har bir dasturchi natijani shuncha tez ko'radi.
Eng oson yo'l: setup-node ichidagi kesh #
Ko'p hollarda alohida kesh qadami yozish ham shart emas:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm test
cache: npm qatori ~/.npm papkasini o'zi keshlaydi va kalitni
package-lock.json bo'yicha hisoblaydi. Shunga o'xshash sozlama boshqa
tillarda ham bor:
| Til | Amal | Kesh sozlamasi |
|---|---|---|
| Node.js | actions/setup-node | cache: npm (yoki yarn, pnpm) |
| Python | actions/setup-python | cache: pip |
| Java | actions/setup-java | cache: maven (yoki gradle) |
| Go | actions/setup-go | sukut bo'yicha yoqilgan |
To'liq nazorat: actions/cache #
Boshqa narsani keshlash kerak bo'lsa, umumiy amal ishlatiladi:
- name: Bog'liqliklarni keshlash
uses: actions/cache@v4
with:
path: ~/.npm
key: npm-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
restore-keys: |
npm-${{ runner.os }}-
Uchta kalit so'zning ma'nosi:
| Kalit | Vazifasi |
|---|---|
path | Qaysi papka saqlanadi |
key | Aniq nom - mos kelsa, kesh to'liq tiklanadi |
restore-keys | Aniq kalit topilmasa, shu prefiks bilan eng yangisi olinadi |
Kalitni to'g'ri yozish #
Kalit bog'liqliklar o'zgarganda o'zgarishi shart. Shuning uchun unga lock-fayl xeshi qo'shiladi:
key: npm-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
| Qism | Nima uchun |
|---|---|
npm- | Prefiks - turli keshlarni ajratadi |
${{ runner.os }} | Linux keshini Windows'ga bermaslik uchun |
hashFiles('package-lock.json') | Bog'liqliklar o'zgarsa - yangi kalit |
Kalitda hashFiles bo'lmasa, kesh hech qachon yangilanmaydi:
bog'liqlikni yangilaysiz, lekin CI eski nusxani tiklab ishlatadi.
Natija - klassik "menda ishlayapti, CI da esa eski versiya" holati.
package-lock.json, yarn.lock, requirements.txt, go.sum - qaysi
biri loyihangizda bo'lsa, o'shani kalitga qo'shing.
Nimani keshlash kerak va kerak emas #
| Keshlash mantiqli | Keshlamang |
|---|---|
~/.npm, ~/.cache/pip - yuklab olingan paketlar | node_modules - platformaga bog'liq ikkilik fayllar bo'ladi |
Kompilyatsiya keshi (~/.cache/go-build) | Testlar natijasi - u har safar yangi bo'lishi kerak |
| Docker qatlamlari (12-bo'limda) | Sirlar va maxfiy fayllar - kesh boshqa tarmoqlarga ham ko'rinadi |
| Katta, kamdan-kam o'zgaradigan yuklamalar | Kichik, tez yuklanadigan narsalar - foyda yo'q |
Kesh istalgan vaqtda yo'qolishi mumkin. GitHub uni 7 kun ishlatilmasa o'chiradi, repozitoriy chegarasidan (10 GB) oshsa esa eng eskisini siqib chiqaradi.
Shuning uchun quvur kesh bo'lmasa ham ishlashi kerak: kesh faqat tezlik beradi, natijaga ta'sir qilmaydi. Agar kesh yo'qolganda quvur yiqilsa - bu quvurdagi xato.
npm ci va npm install farqi #
CI da har doim npm ci ishlatiladi:
npm install | npm ci | |
|---|---|---|
| Lock-faylga munosabat | Kerak bo'lsa o'zgartiradi | Aniq bajaradi, o'zgartirmaydi |
node_modules | Mavjudini yangilaydi | Avval butunlay o'chiradi |
| Tezlik | Sekinroq | Tezroq |
| Natija | Har safar biroz boshqacha bo'lishi mumkin | Har safar bir xil |
CI ning maqsadi - takrorlanadigan natija, shuning uchun npm ci.
Shunga o'xshash: pip install -r requirements.txt o'rniga aniq versiyali
fayl, composer install (update emas).
Keshni tekshirish #
Kesh ishlaganini jurnaldan ko'rish mumkin:
Cache restored successfully
Cache restored from key: npm-Linux-8f14e45fceea167a5a36dedd4bea2543
Yoki topilmaganini:
Cache not found for input keys: npm-Linux-8f14e45fceea167a5a36dedd4bea2543, npm-Linux-
Barcha keshlarni Actions -> Caches sahifasida ko'rish, hajmini bilish va
qo'lda o'chirish mumkin. Kesh buzilgan deb gumon qilsangiz - eng oson yechim
shu yerda o'chirib, quvurni qayta ishga tushirish.
Tezlikning boshqa manbalari #
Kesh - birinchi qadam, lekin yagona emas:
| Usul | Nima beradi |
|---|---|
| Bog'liq bo'lmagan joblarni parallel qoldirish | Umumiy vaqt eng uzun jobga tenglashadi |
paths filtri (3-bo'lim) | Hujjat o'zgarganda testlar umuman ishlamaydi |
concurrency (3-bo'lim) | Eskirgan ishga tushirishlar bekor qilinadi |
| Matritsani PR da qisqartirish | To'liq matritsa faqat main da |
| Og'ir testlarni ajratish | Tez testlar - har kommitda, sekinlari - kechasi |
fetch-depth: 1 | checkout butun tarixni emas, oxirgi kommitni oladi |
- uses: actions/checkout@v4
with:
fetch-depth: 1 # sukut bo'yicha ham shunday
Har bir job sahifasida qadamlar yonida vaqt ko'rsatilgan. Eng uzun qadamni toping va faqat o'sha bilan shug'ullaning.
Ko'pincha ma'lum bo'ladiki, vaqtning yarmi bog'liqliklarni o'rnatishga ketadi - bu keshlash bilan yechiladi. Ba'zan esa sabab bitta sekin test bo'lib chiqadi va uni tuzatish keshlashdan ko'ra ko'proq foyda beradi.
- Keshsiz workflow yozing va
npm ciqadami qancha vaqt olganini yozib oling. setup-nodegacache: npmqo'shing va ikkinchi ishga tushirish vaqtini solishtiring.- Jurnaldan
Cache restored from keyqatorini toping. actions/cachebilan xuddi shu ishni qo'lda yozing.- Kalitga
hashFiles('package-lock.json')qo'shing va bog'liqlikni o'zgartirib, kalit o'zgarishini ko'ring. restore-keysqo'shib, qisman moslik qanday ishlashini kuzating.Actions -> Cachessahifasida kesh hajmini ko'ring va bittasini o'chiring.- Keshni o'chirgandan keyin quvur baribir yashil bo'lishiga ishonch hosil qiling.
npm civanpm installni ikkita alohida ishga tushirishda solishtiring.- Eng uzun qadamni aniqlab, uni tezlashtirishning bitta rejasini yozing.
Xulosa #
- Har bir ishga tushirish toza mashinada boshlanadi - kesh shu sababli kerak.
- Eng oson yo'l -
setup-node,setup-pythonkabi amallardagicache:sozlamasi. actions/cacheto'liq nazorat beradi:path,key,restore-keys.- Kalitga lock-fayl xeshi qo'shilmasa, kesh hech qachon yangilanmaydi.
restore-keysaniq kalit topilmaganda eng yaqin eski keshni tiklaydi.node_moduleskeshlanmaydi - platformaga bog'liq fayllar muammo keltiradi.- Kesh ishonchli saqlash joyi emas: 7 kun ishlatilmasa o'chadi, 10 GB dan oshsa siqib chiqariladi.
- Quvur kesh bo'lmasa ham ishlashi shart - kesh faqat tezlik beradi.
- CI da
npm installemas,npm ciishlatiladi - u takrorlanadigan natija beradi. - Tezlashtirishdan oldin o'lchang: eng uzun qadamni toping va faqat u bilan ishlang.
Keyingi bo'limda testlarni avtomatlashtiramiz va CI qanday qilib "yashil" yoki "qizil" qaror qabul qilishini ko'ramiz.
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.