Հավաքման և քեշինգի օպտիմիզացում
(Բաժին ՝ Տեխնոլոգիաներ և ենթակառուցվածքներ)
Ռուսական ռեզյումե
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-ի և հաշմանդամության կարգապահության համար տալիս են արագ, էժան և վերարտադրված փոխակրիչներ։ Ավելացրեք անվտանգության զգացումը և կանոնները, և ձեր օրինագծերը կլինեն հաճախակի, կայուն և տնտեսապես։