GH GambleHub

Հավաքման և քեշինգի օպտիմիզացում

(Բաժին ՝ Տեխնոլոգիաներ և ենթակառուցվածքներ)

Ռուսական ռեզյումե

IGaming-ում CI/CD արագությունը ուղղակիորեն ազդում է ածխաջրերի հաճախության, րոպեի արժեքը և p99 դիմադրությունը պինդ բեռների ժամանակ։ Բանալին ճիշտ քեշերն են (կախվածությունը, արտեֆակտները, բեռնարկղերի շերտերը, կազմման միջանկյալ արդյունքները), էքսպրեսենտալ հավաքումները և դետերմինալը։ «Լավ» հավաքումը արագ կրկնվում է անփոփոխ ներդրման ժամանակ, իսկ քեշի հաշմանդամությունը կանխատեսելի է և վերահսկելի։


1) Քեշի քարտեզը և ի՞ նչ ենք մենք քշում

Կախվածությունը 'NPM/pnpm, pip wheels/Poetry, Maven/Gradle, Go նորաձևության փաթեթներ, Cargo crates, NuGet։

Հավաքման միջանկյալ արտեֆակտները ՝ «07/.cache/pip», «07/.m2», «.gradle», «07/.cargo/registry/»,« GOMODCACHE »,« target/», «build/»,« node _ modules/.pnpm-store »։

Բեռնարկղային շերտերը ՝ Docker layer cache (BuildKit/GHA cache), registry-based cashe, multi-stage։

Գործիքներ և SDK: toolchains/միկրոմետներ (JDK, Node, Python, Rustup targets)։

Մոնո/պոլիպո-meta: cash Nx/Turborepo/Bazel remote-cache առաջադրանքների համար (lint/test/build)։

Թեստային տվյալները և e2e ֆիքսուրները 'BD-ի ձիթապտղերը, որոնք կապված են UI-խմբավորման հետ։

ML/տվյալները 'պատրաստված թվասետներ, սաղմեդդինգներ, սկոմպիլացված շարժիչներ (TronorRT/ONNX)։


2) Արագ և կանխատեսելի հավաքման սկզբունքները

1. Դետերմինալ 'գրանցեք տարբերակները (wwww.kfiles), pin հիմնական պատկերները, hermetic-plagines-ը վերարտադրված եզրակացություն։

2. Idempotenty: Նույն հավաքածուը համապատասխանում է նույն արտեֆակտներին և հեշերին։

3. Ռելեմենտալությունը 'մենք փոխում ենք միայն փոփոխվածը (DAG/needs/matom/affected)։

4. Տեղայնությունը և «ջերմությունը» 'քեշները ռաներների մոտ/1942-ին, տաքացնելով գագաթների առջև։

5. Ակնհայտ հաշմանդամություն 'քեշի բանալիները կոդավորման ֆայլերի և բովանդակության հեշի վրա։

6. Հիգիենան ՝ TTL/« expire _ in », avto-մաքրում, քեշի և արտեֆակտների չափի վերահսկողություն։

7. Մատակարարման շղթայի անվտանգությունը 'քեշը գաղտնիքների համար աղբը։ SBSA/արտեֆակտների ստորագրությունը մնում է պարտադիր։


3) Docker/OCI 'արագ պատկերներ առանց հատվածների։

Patterns

Նվազագույն runtime (distroless/ubi-micro, միայն so/ca-cerae)։

Շերտերի կարգը 'սկզբում հազվադեպ փոփոխվող (deps), ապա կոդը։

Multi-stage (builder → runtime).

'dockerignore': Բացառեք '.git', թեստեր/ֆիքսերներ, տեղական քեշեր։

BuildKit: «cache-from/to» -ը նկարագրում է ջոբների և ճյուղերի միջև ընդհանուր քեշը։

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) Լեզվական էկոհամակարգեր. Ի՞ նչ անել և ինչպես։

Java/Kotlin (Maven/Gradle)

Remote cache Gradle, զուգահեռ, կազմաձևիչ-պահանջով։

Build cache node-ի հրապարակումը օբյեկտի storage/HTTP-ում։

Քեշի բանալին 'հեշ' build։ gradle[.kts]` + lockfiles + `gradle-wrapper. properties`.

Նշված իրական հավաքածուը և թեստային-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)

Քեշը («07/.npm», «07/.cache/pnpm»), www.kfile բանալին։

Nx/Turborepo remote-cache (S3/Redis) առաջադրանքների համար (lint/test/build)։

«turbo run build --cache-dir = turbo» և «affected» - կտրում է մոնոպրեպոյի համար։

Python (pip/Poetry)

Wheels-ի հավաքումը առանձին փուլում, մատրիցների միջև։

Քեշը wheels + virtualenv; բանալին 'requirements։ lock`/`poetry. lock`.

C-ընդլայնման համար '«pip wheel» + «auditwheel» builder-ում։

Go

Кэш `GOMODCACHE`, `GOCACHE`; ձայնագրեք 'GOTOOLCHAIN >/տարբերակը։

Կիսեք քայլերը '"go mod download" -ը www.go build "կոդի պատճենն է։

Մեծ մոնոմիայի համար 'Bazel/Bazelisk կամ «mage»' շերտավոր տոմսով։

Rust

`~/.cargo/registry`, `~/.cargo/git`, `target/`; scache (հեռավոր/տեղական)։

Քեշի համատեղ օգտագործումը ճյուղերի միջև 'Cargo։ lock`.

C/C++

wwww.ache/scache + բանալին կազմողի դրոշների և MSK տարբերակների մասին։

Toolchain-ը առանձին հիմնական պատկերի մեջ է։


5) Bazel/Nx/Turborepo ՝ առաջադրանքների և գրաֆիկի քեշը։

Bazel remote cache (HTTP/Cloud) - հասցեագրված բովանդակություն։ խիստ անկայունություն, ավազաքարեր։

Nx/Turborepo-ը առաջադրանքների և «only-affected» -ի կատարումն է։

Հաշմանդամություն 'կախված է կոդավորման մուտքերից (ֆայլեր/դրոշներ/105)։


6) Քեշի հաշմանդամության ռազմավարությունը

Բանալին = հեշը մուտքերի մեջ 'www.kfiles, կազմողների դելեգներ, մանիֆեստներ։

Փափուկ հաշմանդամություն '«restore-keys» (GHA )/prefics (GLCI)։

Կոշտ հաշմանդամություն 'rotate namespace/բանալին կրիտիկական փոփոխությունների ժամանակ։

Շերտերի բաժանումը ՝ deps vs sources, փոխեք կոդը առանց ծանր կախվածության։


7) Իրական տոմս և մատրիցա

DAG/needs: Սկսեք կախված ջոբները զուգահեռ, մի սպասեք հաջորդականություններին։

Paths-inforter: Stuger միայն տուժած բաղադրիչների համար։

Shard թեստեր 'ստանդարտներով/seed, հավասարեցրեք տևողությունը։

Warm-pool-pool raners: Նախկինում փորված պատկերներ/cashi պրիկատների առջև (Records/քարոզարշավի)։


8) Artefakty vs kash

Քեշը 'օգտագործվող մուտքերը/միջանկյալ արդյունքները, «կեղտոտ» տարածքը, TTL կարճ/միջին։

Արտեֆակտներ ՝ վերջնական հավաքումներ (պատկերներ, binarniks, charts), անփոփոխ, ստորագրված, SBSA-ի հետ։

Կանոնները 'քեշը մաքրվում է ագրեսիվ, արտեֆակտները պահվում են օրինագծերի քաղաքականության վրա։


9) Դիտարկումը, KPI և FinOps

Metriki (pline/repo)

Hit-rate casha (%), Warm-start vs Cold-start Time, միջին/միջին աստիճանը քայլերի տևողությունից։

Cost per pipeline/job, քեշի/արտեֆակտների չափը, անցնող (jobs/hour)։

«Affected-runs» -ի մասնաբաժինը մոնոպրեպոյում, փոխանակումը անփոփոխ (waste)։

Ալերտա

Hit-rate-ի նվազումը շեմից ցածր է, «build image» ժամանակի աճը, արտեֆակտների փչացումը, SLO-ի բացթողումները։


10) Քեշի և supply chain անվտանգությունը

Ոչ մի գաղտնիք քեշի/արտեֆակտների մեջ։ 4k vars, գաղտնիքների սկաններ։

Pin SHA արտաքին acions/plugins, միայն վստահված runners։

Բեռնարկղերի ստորագրությունը (cosport), SBSA (Cyclator DX/SPDX) և CD ստուգումը։

Մեկուսացում 'առանձին namespace cash «dev/stage/2019», «միայն կարդալու» իրավունքները foreae branches-ի համար։


11) Գործնական ձևանմուշներ

GitHub Actions - լեզուն + բեռնարկղը

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/տվյալները 'արագացնել ծանր հավաքումները

Cash/ambedings/Dazasets տեղական NVMe ranners; հեշի տարբերակումը։

TultorRT/ONNX շարժիչների նախադրյալը որպես արտեֆակտներ։ կրկնվող օգտագործումն է։

Chunked-արտեֆակտները (splits) մեծ մոդելների համար։ TTL-ը և հետաձգված մաքրումը։


13) Ներդրման չեկի ցուցակ

1. Ամրացրեք kfiles և հիմնական պատկերները։ միացրեք BuildKit-ը։

2. Կիսեք Docker: deps 210 կոդը։ ավելացրեք 'dockerignore'։

3. Բարձրացրեք remote cache (Gradle/Bazel/Nx/Turbo); dependency proxy.

4. CI-ում կախվածության քեշը կարգավորեք kfile-ով։ միացրեք մատրիցները և «paths-corter»։

5. Մուտքագրեք այլընտրանքային տոմսերը և «affected only» -ը մոնոպոյում։

6. Չափեք hit-rate, warm/cold time, արժեքը։ ցույց տվեք նկարները։

7. Միացրեք SBSA/ստորագրությունը, արգելեք գաղտնիքները քեշում։

8. Մեղք գործեք գագաթնակետին։ անջատեք TTL/retention։

9. Փաստարկեք քեշի և runbooks-ի հաշմանդամությունը «քեշի» վրա։

10. Կանոնավորաբար մաքրեք «հավիտենական» քեշները և արխիվացրեք ծանր արտեֆակտները։


14) Անտիպատերնի

Հսկայական Dockerfile-ը հաճախ փոխվող քայլերով մինչև deps տեղադրելը։

Ընդհանուր «հավերժական» քեշը առանց ռուսական/TTL ռուսական ֆլեյկի և աղբի։

Արտեֆակտների և քեշի խառնուրդը։ ստորագրության բացակայություն/SBSA։

Գործիքների անթույլատրելի տարբերակներ կան, բայց չեն կրկնվում։

Մատրիցները «բոլորի համար» յուրաքանչյուր PR-ում։ «concurrency» բացակայությունը։ cancel`.

Միասնական runner առանց տաք քեշի և առանց dependency proxy։


Արդյունքները

Հավաքման օպտիմիզացումը համակարգային աշխատանք է քեշների հետ, որոնք համապատասխանում են ռեմենտալությանը և դետերմինիզմին։ Dockerfile-ի ճիշտ կառուցվածքը, remote-cache-ը տոմսերի, dependency proxy-ի և հաշմանդամության կարգապահության համար տալիս են արագ, էժան և վերարտադրված փոխակրիչներ։ Ավելացրեք անվտանգության զգացումը և կանոնները, և ձեր օրինագծերը կլինեն հաճախակի, կայուն և տնտեսապես։

Contact

Կապ հաստատեք մեզ հետ

Կապ հաստատեք մեզ հետ ցանկացած հարցի կամ աջակցության համար։Մենք միշտ պատրաստ ենք օգնել։

Սկսել ինտեգրացիան

Email-ը՝ պարտադիր է։ Telegram կամ WhatsApp — ըստ ցանկության։

Ձեր անունը ըստ ցանկության
Email ըստ ցանկության
Թեմա ըստ ցանկության
Նամակի բովանդակություն ըստ ցանկության
Telegram ըստ ցանկության
@
Եթե նշեք Telegram — մենք կպատասխանենք նաև այնտեղ՝ Email-ի дополнение-ով։
WhatsApp ըստ ցանկության
Ձևաչափ՝ երկրի կոդ և համար (օրինակ՝ +374XXXXXXXXX)։

Սեղմելով կոճակը՝ դուք համաձայնում եք տվյալների մշակման հետ։