Ýygnamak we kesmek üçin optimizirlemek
(Bölüm: Tehnologiýalar we infrastruktura)
Gysgaça gysgaça
iGaming-de CI/CD tizligi relizleriň ýygylygyna, minutlaryň bahasyna we iň ýokary ýüklerde p99 durnuklylygyna gönüden-göni täsir edýär. Açar - dogry keşler (garaşlylyk, artefaktlar, konteýnerleriň gatlaklary, ýygnamagyň aralyk netijeleri), inkremental gurnama we kesgitleýiş. "Gowy" ýygnamak üýtgewsiz girizilende çalt gaýtalanýar, keş-maýyplygy bolsa öňünden aýdyp bolýar we gözegçilik edip bolýar.
1) Nagt kartoçka we nämäni kesýäris
Garaşlylygy: NPM/pnpm, pip wheels/Poetry, Maven/Gradle, Moda, Cargo crates, NuGet.
Aralyk kompozisiýa artefaktlary: '~/.cache/pip', '~/.m2', '.gradle', '~/.cargo/registry/',' $GOMODCACHE ',' target/', 'build/',' node _ modules/.pnpm-store '.
Konteýner gatlaklary: Docker layer cache (BuildKit/GHA cache), registry-based kesh, multi-stage.
Gurallar we SDK: gurallar/mikro şekiller (JDK, Node, Python, Rustup targets).
Mono/poliepo-meta: Nx/Turborepo/Bazel remote-cache (lint/test/build).
Synag maglumatlary we e2e fiksturalary: UI-bandllar bilen düzülen DB snepshotlary.
ML/maglumatlar: taýýarlanan datasetler, embeddingler, jemlenen hereketlendirijiler (TensorRT/ONNX).
2) Çalt we öňünden aýdyp boljak ýygnamak ýörelgeleri
1. Kesgitleýiş: wersiýalary düzüň (lockfiles), esasy şekilleri, hermetik pluginleri → köpeldilip bilinýän netije.
2. Idempotentlik: şol bir gurnama → şol bir artefaktlar we heşler.
3. Inkrementality: diňe üýtgän (DAG/needs/matrix/affected).
4. Lokalizasiýa we "ýylylyk": rannerleriň gapdalyndaky/sanawdaky keşler, iň ýokary nokatlardan öň gyzdyrylýar.
5. Aç-açan maýyplyk: lockfile/konfigurasiýa faýllary we mazmunyň heşi boýunça kesh açarlary.
6. Arassaçylyk: TTL/' expire _ in ', awto-arassalamak, keşleriň we artefaktlaryň ululygyna gözegçilik etmek.
7. Üpjünçilik zynjyrynyň howpsuzlygy: gizlinlik üçin kesh ≠ zibil; SBOM/artefaktlaryň goly hökmany bolup galýar.
3) Docker/OCI: çalt suratlar
Patternler
Multi-stage (builder → runtime).
Iň az runtime (distroless/ubi-micro, diňe zerur so/ca-certs).
Gatlaklaryň tertibi: ilki seýrek üýtgeýän (deps), soň kod.
'.dockerignore': '.git', synaglar/fiksturalar, ýerli keşleri aýyryň.
BuildKit: 'cache-from/to' → joblar bilen şahalaryň arasyndaky umumy kesh.
Dockerfile mysaly (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) Dil ekosistemalary: nämäni kesmeli we nädip
Java/Kotlin (Maven/Gradle)
Remote cache Gradle, paralellik, konfigurasiýa-talap.
Keshiň açary: hash 'build. gradle[.kts]` + lockfiles + `gradle-wrapper. properties`.
build cache node-i obýekt storage/HTTP-de çap etmek.
Paketler boýunça inkremental ýygnamak we 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 keşi ('~/.npm', '~/.cache/pnpm'), lockfile açary.
Nx/Turborepo remote-cache (S3/Redis) (lint/test/build).
'turbo run build --cache-dir = .turbo' i "affected" - monorepo üçin re regimeim.
Python (pip/Poetry)
wheels + virtualenv keş; 'requirements. lock`/`poetry. lock`.
Aýratyn tapgyrda tigirleri ýygnamak, matrisalaryň arasynda gaýtadan ulanmak.
C-uzantylar üçin - 'pip wheel' + 'auditwheel' builder-şekilde.
Go
Кэш `GOMODCACHE`, `GOCACHE`; 'GOTOOLCHAIN '/wersiýalaryny ýazyň.
Ädimleriňizi bölüň: 'go mod download' → kod göçürmesi → 'go build'.
Uly monorepler üçin - Bazel/Bazelisk ýa-da gatlak bild bilen 'mage'.
Rust
`~/.cargo/registry`, `~/.cargo/git`, `target/`; sccache (uzak/lokal).
"Cargo" şahalarynyň arasynda kesişmek. lock`.
C/C++
ccache/sccache + kompilyatoryň baýdaklary we SDK wersiýalary boýunça açar.
Guraly aýratyn esasy şekile çykarmak.
5) Bazel/Nx/Turborepo: wezipeler we grafalar üçin nagt pul
Bazel remote cache (HTTP/Cloud) - adreslenýän mazmun; berk berklik, sandyk gutusy.
Nx/Turborepo - wezipeleriň çykyş keşi we monorepoda "only-affected" ýerine ýetirilişi.
Maýyplyk: ädimiň girelgesine baglydyr (faýllar/baýdaklar/üýtgeýjiler).
6) Keş maýyplyk strategiýalary
Açar = giriş hash: lockfiles, kompilyatorlaryň konfigidleri, manifestler.
Ýumşak maýyplyk: 'restore-keys' (GHA )/prefiksler (GLCI).
Gaty maýyplyk: möhüm üýtgeşmeler ýüze çykan halatynda rotate namespace/açar.
Gatlaklary bölmek: deps vs sources - agyr endiklere degmezden kody üýtgediň.
7) Inkremental bildler we matrisalar
DAG/needs: garaşylýan joblary paralel işe giriziň, yzygiderlilige garaşmaň.
Paths-filter: trigger diňe täsir eden komponentler üçin.
Synaglaryň tertibi: kataloglar/seed boýunça dowamlylygy deňleşdiriň.
"Warm-pool ranners": pik nokatlardan öň öňünden gyzdyrylan şekiller/keşler (ýaryşlar/kampaniýalar).
8) Artefaktlar vs kesh: näme bilen tapawutlanýar
Kesh: gaýtadan ulanylýan girişler/aralyk netijeler, "hapa" sebit, TTL gysga/orta.
Artefaktlar: soňky ýygnaklar (şekiller, binarnikler, çartlar), üýtgewsiz, gol çekilen, SBOM bilen.
Düzgünler: keş agressiw arassalanýar, artefaktlar - goýberiş syýasaty boýunça saklanylýar.
9) Gözegçilik, KPI we FinOps
Metrikler (paypline/repo boýunça):- Hit-rate kesiş (%), Warm-start vs Cold-start time, orta/median basgançaklary.
- Cost per pipeline/job, keşiň/artefaktlaryň ululygy, geçiriş (jobs/hour).
- Monorepodaky "affected-runs" paýy, üýtgemän gaýtadan ýygnamak (waste).
- Hit-rate-iň bosagadan aşak düşmegi, "build image" wagtynyň ýokarlanmagy, artefaktlaryň çişmegi, SLO ýalňyşlyklary.
10) Kesiş howpsuzlygy we üpjünçilik ulgamy
Keş/artefaktlarda hiç hili syr ýok; mask vars, syrlaryň skanerleri.
Pin SHA daşarky actions/plugins, diňe ynamdar runners.
Konteýnerleriň/binarlaryň goly (cosign), SBOM (CycloneDX/SPDX) we CD barlamak.
Izolýasiýa: 'dev/stage/prod' üçin aýratyn kesçe namespace, foreign branches üçin "diňe okamak" hukugy.
11) Amaly şablonlar
GitHub Actions - dil + konteýner
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/data: agyr gurnamalary çaltlaşdyrýarys
Ýerli NVMe rannerlerdäki modelleriň/embeddingleriň/datasetleriň keşi; hash wersiýasy.
TensorRT/ONNX hereketlendirijilerini çykarylýan artefaktlar hökmünde öňünden ýygnamak; inferensde gaýtadan ulanmak.
Uly modeller üçin çunked-artefaktlar (splits); TTL we gijikdirilen arassalamak.
13) Girizmegiň çek-sanawy
1. Lockfiles we esasy şekilleri düzüň; BuildKit-i açyň.
2. Docker gatlaklaryny bölüň: deps → kod; '.dockerignore' goşuň.
3. Remote cache (Gradle/Bazel/Nx/Turbo) göteriň; dependency proxy.
4. CI lockfile-de garaşlylyk кэşini sazlaň; 'paths-filter' matrisalaryny açyň.
5. Monorepoda "affected only" we "artyk" bellikleri giriziň.
6. Ölçemek hit-rate, warm/cold time, bahasy; aladalary goýuň.
7. SBOM/goly açyň, kesişdäki syrlary gadagan ediň.
8. Iň ýokary çykmazdan ozal nagt pullary gyzdyryň; TTL/retention.
9. Keş we runbooks-yň maýyplygyny "keş döwüldi" diýip resminamalaşdyryň.
10. "Baky" keşleri yzygiderli arassalaň we agyr artefaktlary arhiwläň.
14) Antipatternler
Deps gurmazdan ozal köplenç üýtgeýän ädimler bilen ullakan Dockerfile.
Açarsyz umumy "baky" kesh/TTL → fleýka we zibil.
Artefaktlary we keşleri garyşdyrmak; goluň ýoklugy/SBOM.
Gurallar → "keş bar, ýöne gaýtalanmaýar".
Her PR-da "hemme zada" matrisalary; concurrency ýok. cancel`.
Dependency proxy bolmazdan we ýyly kesişsiz bir runner.
Netijeler
Gurnamany optimizirlemek keş, inkrementlik we kesgitleýiş bilen yzygiderli işlemekdir. Dockerfile-iň dogry gurluşy, binalar üçin remote-cache, dependency proxy we maýyplyk düzgüni çalt, arzan we köpeldilýän konweýerleri berýär. Gözegçilik we howpsuzlyk düzgünlerini goşuň - goýberişleriňiz ýygy-ýygydan, durnukly we tygşytly bolar.