Montaj optimizasyonu ve önbelleğe alma
(Bölüm: Teknoloji ve Altyapı)
Kısa özet
IGaming'deki CI/CD hızı, en yüksek yüklerde serbest bırakma oranını, dakika maliyetini ve p99 kararlılığını doğrudan etkiler. Anahtar, doğru önbellekler (bağımlılıklar, artifaktlar, kap katmanları, ara derleme sonuçları), artımlı yapılar ve determinizmdir. "İyi'bir yapı, değişmemiş girdi ile hızla tekrarlanır ve önbellek sakatlığı öngörülebilir ve kontrol edilebilir.
1) Önbellek haritası ve önbelleklediklerimiz
Bağımlılıklar: NPM/pnpm paketleri, pip tekerlekleri/Şiir, Maven/Gradle, Go mods, Kargo kasaları, NuGet.
Ara derleme eserleri: '~/.cache/pip', '~/.m2', '.gradle', '~/.cargo/registry/',' $ GOMODCACHE ',' target/', 'build/',' node _ modules/.pnpm-store '.
Konteyner katmanları: Docker katman önbelleği (BuildKit/GHA önbelleği), kayıt defteri tabanlı önbellek, çok aşamalı.
Araçlar ve SDK'lar: araç zincirleri/mikro görüntüler (JDK, Node, Python, Rustup hedefleri).
Mono/polirepo-meta: Görevler için Nx/Turborepo/Bazel uzaktan önbellek önbelleği (lint/test/build).
Test verileri ve e2e düzeltmeleri: UI paketleri tarafından derlenen veritabanı anlık görüntüleri.
ML/data: hazırlanmış veri setleri, gömmeler, derlenmiş motorlar (TensorRT/ONNX).
2) Hızlı ve öngörülebilir montaj ilkeleri
1. Determinizm: düzeltme sürümleri (lockfiles), pin baz görüntüleri, hermetik eklentiler - tekrarlanabilir çıktı.
2. Idempotence: Aynı montaj - aynı eserler ve karmalar.
3. Artımlılık: yalnızca değiştirileni yeniden oluşturma (DAG/needs/matrix/affected).
4. Lokalite ve "ısı": koşucuların yanındaki/kayıt defterindeki önbellekler, zirvelerden önce ısınır.
5. Açık engellilik: Lockfile/configuration files ve content hash tarafından önbellek anahtarları.
6. Hijyen: TTL/' expire _ in ', otomatik temizleme, önbellek boyutu kontrolü ve eserler.
7. Tedarik zinciri güvenliği: Sırlar için önbellek ≠ çöp; SBOM/Artefact imzası zorunludur.
3) Docker/OCI: yeniden birleştirmeden hızlı görüntüler
Desenler
Çok aşamalı (oluşturucu - çalışma zamanı).
Minimum çalışma süresi (distroless/ubi-micro, sadece gerekli so/ca-certs).
Katman sırası: önce nadiren değiştirme (deps), sonra kod.
'.dockerignore': hariç '.git', testler/fikstürler, yerel önbellekler.
BuildKit: 'cache-from/to' - işler ve dallar arasında paylaşılan önbellek.
Dockerfile örneği (Düğüm + 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 Eylemleri)
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 ekosistemleri: ne önbelleğe alınacak ve nasıl
Java/Kotlin (Maven/Gradle)
Uzak önbellek Gradle, eşzamanlılık, isteğe bağlı yapılandırma.
Önbellek anahtarı: hash 'build. gradle [.kts] '+ lockfiles +' gradle-wrapper. Mülkler '.
Oluştur önbellek düğümünü nesne depolamasına/HTTP'ye yayınlayın.
Artımlı derleme ve test pakete göre bölünür.
yaml
GitLab CI cache:
key: gradle-${CI_COMMIT_REF_SLUG}
paths: [.gradle/caches,.gradle/wrapper ]
script:
-./gradlew --build-cache --parallel build
Düğüm noktası. js (npm/pnpm/iplik)
Yerel mağaza önbelleği ('~/.npm', '~/.cache/pnpm'), kilit dosyası anahtarı.
Görevler için Nx/Turborepo uzaktan önbellek (S3/Redis) (tiftik/test/derleme).
'turbo run build --cache-dir = .turbo've monorepos için "etkilenen" mod.
Python (pip/Şiir)
Önbellek tekerlekleri + virtualenv; Anahtar 'requirements tarafından. Kilit'/' şiir. Kilit '.
Tekerleklerin ayrı bir aşamada birleştirilmesi, matrisler arasında yeniden kullanılması.
C uzantıları için - 'pip wheel' + 'auditwheel' oluşturucu görüntüsünde.
Git
Кэш 'GOMODCACHE', 'GOCACHE'; 'GOTOOLCHAIN'/sürümlerini düzeltin.
Adımları bölün: 'go mod indir' - kodun bir kopyası - 'go build'.
Büyük monoraylar için - Bazel/Bazelisk veya bir katman yapısı ile 'mage'.
Pas
'~/.cargo/registry', '~/.cargo/git', 'target/'; sccache (uzak/yerel).
Kargo'daki şubeler arasında önbellek paylaşımı. Kilit '.
C/C + +
Derleyici bayrakları ve SDK sürümlerine göre ccache/sccache + tuşu.
Araç zincirini ayrı bir temel görüntüde çıkarın.
5) Bazel/Nx/Turborepo: görev ve grafik önbellek
Bazel uzak önbellek (HTTP/Bulut) - içerik adreslenebilir; Sıkı sıkılık, kum havuzları.
Nx/Turborepo - görev çıkışlarının önbelleği ve monorepolarda "yalnızca etkilenen" yürütme.
Engellilik: adım girdilerine (dosyalar/bayraklar/değişkenler) bağlıdır.
6) Önbellek engellilik stratejileri
Key = girdilerin karması: lockfiles, derleyici yapılandırmaları, manifestolar.
Hafif sakatlık: 'Restore-keys' (GHA )/önekleri (GLCI).
Hard disability: kritik değişiklikler için ad alanını/tuşunu döndürün.
Katman ayrımı: deps vs kaynaklar - ağır bağımlılıkları kırmadan kodu değiştirin.
7) Artımlı yapılar ve matrisler
DAG/needs: bağımlı jabları paralel olarak çalıştırın, dizileri beklemeyin.
Yollar-filtre - Sadece etkilenen bileşenler için tetikleyin.
Parça testleri: dizinlere/tohumlara göre, süreyi hizalayın.
Sıcak havuz koşucuları: Zirvelerden önce önceden ısıtılmış görüntüler/önbellekler (turnuvalar/kampanyalar).
8) Eserler vs önbellek: ne kadar farklı
Önbellek: yeniden kullanılan girdiler/ara sonuçlar, kirli alan, TTL kısa/orta.
Artifaktlar: son montajlar (görüntüler, ikili dosyalar, grafikler), değiştirilemez, imzalanmış, SBOM ile.
Kurallar: Önbellek agresif bir şekilde temizlenir, eserler serbest bırakma politikasına göre saklanır.
9) Gözlemlenebilirlik, KPI ve FinOps
Metrikler (boru hattı/repo ile):- Önbellek isabet oranı (%), Sıcak başlatma vs Soğuk başlatma süresi, aşamaların ortalama/medyan süresi.
- Boru hattı/iş başına maliyet, önbellek/artefakt boyutu, iş hacmi (iş/saat).
- Monorepoda "etkilenen-çalışan" payı, değişmeden yeniden inşa (atık).
- Hit-rate eşiğin altına düşer, görüntü oluşturma süresi artar, eserler şişer, SLO kaçırır.
10) Önbellek güvenliği ve tedarik zinciri
Önbellek/eserlerde sır yok; Maske varları, sır taramaları.
Pin SHA harici eylemler/eklentiler, sadece güvenilir koşucular.
Konteynerleri/ikilileri imzalama (cosign), SBOM (CycloneDX/SPDX) ve CD kontrolü.
İzolasyon: 'dev/stage/prod' için ayrı önbellek ad alanı, yabancı şubeler için salt okunur haklar.
11) Pratik şablonlar
GitHub Eylemleri - Dil + 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 uzaktan önbellek
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/veri: ağır montajları hızlandırmak
Yerel NVMe koşucularındaki modellerin/gömmelerin/veri kümelerinin önbelleği; Karma sürüm oluşturma.
Ön montaj TensorRT/ONNX motorlar serbest eserler olarak; çıkarımda tekrar kullan.
Büyük modeller için chunked eserler (bölünmeler); TTL ve ertelenmiş temizlik.
13) Uygulama kontrol listesi
1. Kilit dosyaları ve temel görüntüler işlemek; BuildKit'i etkinleştir.
2. Ayrı Docker katmanları: deps _ code; '.dockerignore' ekleyin.
3. Uzak önbelleği yükseltin (Gradle/Bazel/Nx/Turbo); bağımlılık proxy başlatın.
4. CI'daki bağımlılık önbelleğini lockfile ile yapılandırın; matrisler ve 'yollar-filtre' içerir.
5. Monorepoda artımlı yapılar ve "yalnızca etkilenenler" girin.
6. Isabet oranını, sıcak/soğuk zamanı, maliyeti ölçün; Uyarı koyun.
7. SBOM/imzayı etkinleştirin, önbellekteki sırları reddedin.
8. Pik sürümlerden önce önbellekleri ısıtın; TTL/retention'u düzenler.
9. Belge önbellek özürlülüğü ve "önbellek bozuk'olarak çalışma kitapları.
10. Düzenli olarak "ebedi" önbellekleri temizleyin ve ağır eserleri arşivleyin.
14) Antipatterns
Deps yüklemeden önce sık sık değişen adımlarla büyük Dockerfile.
Anahtarlar/TTL olmadan paylaşılan "kalıcı" önbellek - pul ve çöp.
Eserler ve önbellek karıştırma; İmza yok/SBOM.
Araçların sıkıştırılmamış sürümleri - "önbellek, ancak tekrarlanmaz".
Her PR'de'herkes için "matrisler; Eşzamanlılık eksikliği. İptal et.
Sıcak önbellek olmadan ve bağımlılık proxy olmadan tek koşucu.
Sonuçlar
Montaj optimizasyonu, önbellek, artımlılık ve determinizm ile sistematik bir çalışmadır. Doğru Dockerfile yapısı, derlemeler için uzaktan önbellek, bağımlılık proxy'si ve engellilik disiplini hızlı, ucuz ve tekrarlanabilir boru hatları sağlar. Gözlemlenebilirlik ve güvenlik kuralları ekleyin - ve sürümleriniz sık, istikrarlı ve ekonomik olacaktır.