Yigʻishni optimallashtirish va keshlash
(Bo’lim: Texnologiyalar va infratuzilma)
Qisqacha xulosa
iGaming’dagi CI/CD tezligi relizlarning chastotasiga, daqiqalarning narxiga va eng yuqori yuklamalarda p99 barqarorligiga bevosita ta’sir qiladi. Kalit - to’g "ri keshlar (qaramliklar, artefaktlar, konteyner qatlamlari, oraliq kompilyatsiya natijalari), inkremental yig’ilishlar va determinatsiya. «Yaxshi» yig’ish o’zgarishsiz kiritilganda tezda takrorlanadi, kash-nogironlikni oldindan aytib bo’lmaydi va nazorat qilinadi.
1) Kesh xaritasi va biz nimani keshlaymiz
Bog’liqlik: NPM/pnpm paketlari, pip wheels/Poetry, Maven/Gradle, Go modalar, Cargo crates, NuGet.
Oraliq kompilyatsiya artefaktlari:’~/.cache/pip’,’~/.m2’,’.gradle’,’~/.cargo/registry/’,’$GOMODCACHE’,’target/’,’build/’,’node _ modules/.pnpm-store’.
Konteyner qatlamlari: Docker layer cache (BuildKit/GHA cache), registry-based kesh, multi-stage.
Instrumentlar va SDK: toolchains/mikrobodlar (JDK, Node, Python, Rustup targets).
Mono/polipo-meta: vazifalar uchun Nx/Turborepo/Bazel remote-cache kesh (lint/test/build).
Test-ma’lumotlar va e2e fiksturalar: snepshotlar DB, kompilyatsiya qilingan UI-bandllar.
ML/ma’lumotlar: tayyorlangan datasetlar, embeddinglar, kompilyatsiya qilingan dvigatellar (TensorRT/ONNX).
2) Tez va oldindan aytib bo’ladigan yig’ish prinsiplari
1. Determinatsiya: versiyalar (lockfiles), pin bazaviy tasvirlar, hermetic plaginlar → takrorlanadigan chiqish.
2. Idempotentlik: bir xil yig’ish → bir xil artefaktlar va xeshlar.
3. Inkrementallik: faqat oʻzgargan (DAG/needs/matrix/affected).
4. Lokalizm va «issiqlik»: runner/reestr yonidagi keshlar, cho’qqilar oldidan isitish.
5. Aniq nogironlik: lockfile/konfiguratsiya fayllari va xesh tarkibi boʻyicha kesh kalitlari.
6. Gigiyena: TTL/’ expire _ in’, avto- tozalash, kesh va artefaktlar hajmini nazorat qilish.
7. Yetkazib berish zanjirining xavfsizligi: sirlar uchun kesh ≠ axlat qutisi; SBOM/artefaktlarning imzosi majburiy bo’lib qoladi.
3) Docker/OCI: qayta yigʻishsiz tez tasvirlar
Patternlar
Multi-stage (builder → runtime).
Minimal runtime (distroless/ubi-micro, faqat kerakli so/ca-certs).
Qatlamlarning tartibi: avval kamdan-kam oʻzgaruvchi (deps), keyin kod.
’.dockerignore’:’.git’, test/fikstura, lokal keshlarni chiqarib tashlang.
BuildKit:’cache-from/to’→ joblar va novdalar orasidagi umumiy kesh.
Dockerfile (Node + pnpm)
dockerfile syntax=docker/dockerfile:1.7
FROM node:20-bookworm AS deps
WORKDIR /app
COPY pnpm-lock.yaml./
RUN corepack enable && pnpm fetch
FROM node:20-bookworm AS builder
WORKDIR /app
COPY --from=deps /root/.cache/pnpm /root/.cache/pnpm
COPY package.json pnpm-lock.yaml./
RUN corepack enable && pnpm install --offline
COPY..
RUN pnpm build
FROM gcr.io/distroless/nodejs20 AS runtime
WORKDIR /app
COPY --from=builder /app/dist./dist
USER 10001
CMD ["dist/server.js"]
BuildKit в CI (GitHub Actions)
yaml
- uses: docker/setup-buildx-action@v3
- uses: actions/cache@v4 with:
path: /tmp/.buildx-cache key: buildx-${{ github.ref }}-${{ github.sha }}
restore-keys: buildx-${{ github.ref }}-
- uses: docker/build-push-action@v6 with:
push: true tags: ${{ env.IMAGE }}
cache-from: type=gha cache-to: type=gha,mode=max
4) Til ekotizimlari: nima keshlash va qanday
Java/Kotlin (Maven/Gradle)
Remote cache Gradle, parallellik, konfiguratsiya-soʻrov boʻyicha.
Kesh kaliti: xash’build. gradle[.kts]` + lockfiles + `gradle-wrapper. properties`.
Obyekt storage/HTTP’da build cache node’ni nashr etish.
Paketlar bo’yicha inkremental kompilyatsiya va test-split.
yaml
GitLab CI cache:
key: gradle-${CI_COMMIT_REF_SLUG}
paths: [.gradle/caches,.gradle/wrapper ]
script:
-./gradlew --build-cache --parallel build
Node. js (npm/pnpm/yarn)
Lokal store kesh (’~/.npm’,’~/.cache/pnpm’), lockfile kaliti.
Nx/Turborepo remote-cache (S3/Redis) vazifalar uchun (lint/test/build).
’turbo run build --cache-dir = .turbo’ i «affected» - monorepo uchun rejim.
Python (pip/Poetry)
wheels + virtualenv kesh; ’requirements. lock`/`poetry. lock`.
Alohida bosqichda wheels yig’ish, matritsalar o’rtasida qayta foydalanish.
S-kengaytmalar uchun -’pip wheel’+’auditwheel’builder-obrazda.
Go
Кэш `GOMODCACHE`, `GOCACHE`; ’GOTOOLCHAIN ’/versiyasini yozib oling.
’go mod download’ → kod nusxasi →’go build’.
Katta monoreplar uchun - Bazel/Bazelisk yoki qatlamli bild bilan’mage’.
Rust
`~/.cargo/registry`, `~/.cargo/git`, `target/`; sccache (masofadan/lokal).
’Cargo’ shoxlari orasida keshdan foydalanish. lock`.
C/C++
ccache/sccache + kompilyator bayroqlari va SDK versiyalari bo’yicha kalit.
Toolchain’ni alohida asosiy tasvirga olib chiqish.
5) Bazel/Nx/Turborepo: vazifalar keshi va grafasi
Bazel remote cache (HTTP/Cloud) - manzilga yuboriladigan kontent; qat’iy germetiklik, qum qutilari.
Nx/Turborepo - vazifalar chiqish keshi va monorepoda «only-affected» bajarish.
Nogironlik: qadam kirishiga bog’liq (fayl/bayroq/o’zgaruvchan).
6) Kesh nogironligi strategiyasi
Kalit = kirish xeshi: lockfiles, kompilyatorlar konfigi, manifestlar.
Yumshoq nogironlik:’restore-keys’(GHA )/prefikslar (GLCI).
Qattiq nogironlik: tanqidiy oʻzgarishlarda rotate namespace/kalit.
Qatlamlarni ajratish: deps vs sources - ogʻir bogʻliqliklarga tegmasdan kodni oʻzgartiring.
7) Inkremental bild va matritsalar
DAG/needs: bogʻlangan joblarni parallel ishga tushiring, ketma-ketlikni kutmang.
Paths-filter: faqat ta’sirlangan komponentlar uchun trigger.
Shard testlar :/seed kataloglari boʻyicha, davomiyligini tenglashtiring.
Varm-pool rannerlari: pik oldidan oldindan isitilgan tasvirlar/keshlar (turnirlar/kampaniyalar).
8) Artefaktlar vs kesh: nima bilan farq qiladi
Kesh: qayta ishlatiladigan kirish/oraliq natijalar, «iflos» hudud, TTL qisqa/oʻrta.
Artefaktlar: yakuniy yig’ilishlar (tasvirlar, binarniklar, charts), o’zgarmas, imzolangan, SBOM bilan.
Qoidalar: kesh agressiv tozalanadi, artefaktlar relizlar siyosati bo’yicha saqlanadi.
9) Kuzatish darajasi, KPI va FinOps
Metrika (payplayn/repo bo’yicha):- Hit-rate kesh (%), Warm-start vs Cold-start time, oʻrtacha/median davomiyligi.
- Cost per pipeline/job, kesh/artefakt oʻlchami, oʻtkazma (jobs/hour).
- Monorepodagi «affected-runs» ulushi, o’zgarishsiz qayta yig’ish (waste).
- Hit-rate chegaradan pastga tushishi, «build image» vaqt o’sishi, artefaktlarni shishirish, SLO bo’yicha xatolar.
10) Kesh va supply chain xavfsizligi
Kesh/artefaktlarda hech qanday sir yo’q; mask vars, sirlar skaneri.
Pin SHA tashqi actions/plugins, faqat ishonchli runners.
Konteyner/binar imzosi (cosign), SBOM (CycloneDX/SPDX) va CDda tekshirish.
Izolyatsiya:’dev/stage/prod’uchun alohida namespace kesh, foreign branches uchun faqat oʻqish huquqi.
11) Amaliy shablonlar
GitHub Actions - til + konteyner
yaml name: ci on: [push, pull_request]
concurrency: { group: ${{ github.ref }}, cancel-in-progress: true }
jobs:
build:
runs-on: ubuntu-latest steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4 with: { node-version: '20' }
- uses: actions/cache@v4 with:
path: ~/.cache/pnpm key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
- run: corepack enable && pnpm i --frozen-lockfile
- run: pnpm build
- uses: docker/build-push-action@v6 with:
tags: ${{ env.IMAGE }}
cache-from: type=gha cache-to: type=gha,mode=max
GitLab CI — Gradle remote cache
yaml variables:
GRADLE_USER_HOME: ".gradle"
cache:
key: gradle-${CI_COMMIT_REF_SLUG}
paths: [.gradle/wrapper,.gradle/caches ]
build:
stage: build script:
-./gradlew --build-cache --no-daemon build artifacts:
paths: [ "build/libs/.jar" ]
expire_in: 3 days
Jenkins — ccache/sccache
groovy pipeline {
agent { label 'cpp' }
environment { CCACHE_DIR = '/cache/ccache' }
stages {
stage('Build') {
steps {
sh 'ccache -M 10G'
sh 'cmake -B build -S. && cmake --build build -j$(nproc)'
}
}
}
post { always { sh 'ccache -s' } }
}
12) ML/ma’lumotlar: og’ir yig’ilishlarni tezlashtiramiz
Lokal NVMe rannerlardagi modellar/embeddinglar/datasetlar keshi; xesh versiyalash.
TensorRT/ONNX dvigatellarini reliz-artefaktlar sifatida oldindan yig’ish; inferensiyada qayta foydalanish.
katta modellar uchun Chunked-artefaktlar (splits); TTL va kechiktirilgan tozalash.
13) Joriy etish chek-varaqasi
1. Lockfiles va asosiy tasvirlarni oʻrnating; BuildKit’ni yoqing.
2. Docker qatlamlarini ajrating: deps → kod; ’.dockerignore’ qoʻshing.
3. remote cache (Gradle/Bazel/Nx/Turbo) ni koʻtaring; dependency proxy.
4. Lockfile uchun CI bogʻliqlik keshini moslash; ’paths-filter’ matritsalarini yoqing.
5. Monorepoga «affected only» ni kiriting.
6. hit-rate, warm/cold time, qiymatini o’lchang; Alertlar qo’ying.
7. SBOM/imzoni yoqing, keshdagi sirlarni taqiqlang.
8. Eng yuqori relizlar oldidan keshlarni isiting; TTL/retentionni tartibga soling.
9. Kesh va runbooksning nogironligini «kesh buzilgan» deb hujjatlashtiring.
10. Doimiy ravishda «abadiy» keshlarni tozalang va ogʻir artefaktlarni arxivlang.
14) Antipatternlar
Deps oʻrnatishdan oldin tez-tez oʻzgarib turadigan katta Dockerfile.
Umumiy «abadiy» kalitsiz kesh/TTL → fleykalar va axlat.
Artefaktlar va keshni aralashtirish; imzo/SBOM yo’qligi.
Asboblarning jildsiz versiyalari → «kesh bor, lekin takrorlanmaydi».
Har bir PRda «hamma narsaga» matritsasi; concurrency yo’qligi. cancel`.
Iliq keshsiz va dependency proxy’siz yagona runner.
Yakunlar
Yigʻishni optimallashtirish - keshlar, inkrementallik va determinizatsiya bilan tizimli ishlash. Dockerfile, remote-cache, dependency proxy va nogironlik intizomi tezkor, arzon va takrorlanadigan konveyerlarni yaratadi. Kuzatuv va xavfsizlik qoidalarini qo’shing - va sizning relizlaringiz tez-tez, barqaror va tejamkor bo’ladi.