6-bo‘lim

Kesh va quvur tezligi

Bog'liqliklarni keshlash, kesh kaliti va restore-keys, nimani keshlash kerak emas va quvurni tezlashtirishning boshqa usullari.

🕑 9 daqiqa o‘qish 📄 992 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Muammo raqamlarda
  2. Eng oson yo'l: setup-node ichidagi kesh
  3. To'liq nazorat: actions/cache
  4. Kalitni to'g'ri yozish
  5. Nimani keshlash kerak va kerak emas
  6. npm ci va npm install farqi
  7. Keshni tekshirish
  8. Tezlikning boshqa manbalari
  9. Xulosa

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:

QadamKeshsizKesh bilan
Kodni olish3 s3 s
Node o'rnatish2 s2 s
Bog'liqliklarni o'rnatish45 s6 s
Testlar20 s20 s
Jami70 s31 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:

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

TilAmalKesh sozlamasi
Node.jsactions/setup-nodecache: npm (yoki yarn, pnpm)
Pythonactions/setup-pythoncache: pip
Javaactions/setup-javacache: maven (yoki gradle)
Goactions/setup-gosukut bo'yicha yoqilgan

To'liq nazorat: actions/cache #

Boshqa narsani keshlash kerak bo'lsa, umumiy amal ishlatiladi:

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

KalitVazifasi
pathQaysi papka saqlanadi
keyAniq nom - mos kelsa, kesh to'liq tiklanadi
restore-keysAniq kalit topilmasa, shu prefiks bilan eng yangisi olinadi
Kesh kaliti bo'yicha qidiruv Aniq kalit npm-Linux-a1b2c3 bormi To'liq moslik kesh tiklandi - o'rnatish shart emas topilmadi restore-keys npm-Linux- Qisman moslik eski kesh + farqni yuklash Ish oxirida Kalit yangi bo'lsa - kesh saqlanadi. Kalit o'zgarmagan bo'lsa - hech narsa yozilmaydi. Kesh o'zgartirilmaydi - faqat yangisi yaratiladi. Shuning uchun kalitga lock-fayl xeshi qo'shiladi: bog'liqlik o'zgarsa, kalit ham o'zgaradi
Kesh o'zgarmas: kalit mos kelsa tiklanadi, kelmasa yangisi yoziladi

Kalitni to'g'ri yozish #

Kalit bog'liqliklar o'zgarganda o'zgarishi shart. Shuning uchun unga lock-fayl xeshi qo'shiladi:

YAML
          key: npm-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
QismNima uchun
npm-Prefiks - turli keshlarni ajratadi
${{ runner.os }}Linux keshini Windows'ga bermaslik uchun
hashFiles('package-lock.json')Bog'liqliklar o'zgarsa - yangi kalit
Lock-faylsiz kesh - eskirgan kesh

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 mantiqliKeshlamang
~/.npm, ~/.cache/pip - yuklab olingan paketlarnode_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 yuklamalarKichik, tez yuklanadigan narsalar - foyda yo'q
Kesh - ishonchli saqlash joyi emas

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 installnpm ci
Lock-faylga munosabatKerak bo'lsa o'zgartiradiAniq bajaradi, o'zgartirmaydi
node_modulesMavjudini yangilaydiAvval butunlay o'chiradi
TezlikSekinroqTezroq
NatijaHar safar biroz boshqacha bo'lishi mumkinHar 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:

Natija
Cache restored successfully
Cache restored from key: npm-Linux-8f14e45fceea167a5a36dedd4bea2543

Yoki topilmaganini:

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

UsulNima beradi
Bog'liq bo'lmagan joblarni parallel qoldirishUmumiy 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 qisqartirishTo'liq matritsa faqat main da
Og'ir testlarni ajratishTez testlar - har kommitda, sekinlari - kechasi
fetch-depth: 1checkout butun tarixni emas, oxirgi kommitni oladi
YAML
      - uses: actions/checkout@v4
        with:
          fetch-depth: 1      # sukut bo'yicha ham shunday
Avval o'lchang, keyin tezlashtiring

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.

Amaliy topshiriq
  1. Keshsiz workflow yozing va npm ci qadami qancha vaqt olganini yozib oling.
  2. setup-node ga cache: npm qo'shing va ikkinchi ishga tushirish vaqtini solishtiring.
  3. Jurnaldan Cache restored from key qatorini toping.
  4. actions/cache bilan xuddi shu ishni qo'lda yozing.
  5. Kalitga hashFiles('package-lock.json') qo'shing va bog'liqlikni o'zgartirib, kalit o'zgarishini ko'ring.
  6. restore-keys qo'shib, qisman moslik qanday ishlashini kuzating.
  7. Actions -> Caches sahifasida kesh hajmini ko'ring va bittasini o'chiring.
  8. Keshni o'chirgandan keyin quvur baribir yashil bo'lishiga ishonch hosil qiling.
  9. npm ci va npm install ni ikkita alohida ishga tushirishda solishtiring.
  10. 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-python kabi amallardagi cache: sozlamasi.
  • actions/cache to'liq nazorat beradi: path, key, restore-keys.
  • Kalitga lock-fayl xeshi qo'shilmasa, kesh hech qachon yangilanmaydi.
  • restore-keys aniq kalit topilmaganda eng yaqin eski keshni tiklaydi.
  • node_modules keshlanmaydi - 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 install emas, npm ci ishlatiladi - 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.

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.