विधानसभा अनुकूलन और कैशिंग
(धारा: प्रौद्योगिकी और बुनियादी ढांचा)
संक्षिप्त सारांश
IGaming में CI/CD की गति सीधे पीक लोड पर रिलीज दर, मिनट लागत और p99 स्थिरता को प्रभावित करती है। कुंजी सही कैश (निर्भरता, कलाकृतियां, कंटेनर परतें, मध्यवर्ती संकलन परिणाम), वृद्धिशील बिल्ड और नियतावाद है। एक "अच्छा" निर्माण जल्दी से अपरिवर्तित इनपुट के साथ दोहराया जाता है, और कैश विकलांगता अनुमानित और नियंत्रणीय है।
1) कैश मैप और हम क्या कैश करते हैं
निर्भरता: NPM/pnpm पैकेज, पिप व्हील/पोएट्री, मावेन/ग्रेडल, गो मॉड्स, कार्गो क्रेट्स, NuGet।
इंटरमीडिएट संकलन कलाकृतियाँ: '~/.cache/pip', '~/.m2', '.gradle', '~/.cargo/registry/',' $ GOMODCACHE ',' लक्ष्य/', 'नोड _ मॉड्यूल/.pnppm-स्टोर'।
कंटेनर परतें: डॉकर परत कैश (बेलकिट/जीएचए कैश), रजिस्ट्री-आधारित कैश, मल्टी-स्टेज।
उपकरण और एसडीके: टूलचेन/माइक्रोइमेज (जेडीके, नोड, पायथन, रस्टअप लक्ष्य)।
मोनो/पॉलीरेपो-मेटा: कार्यों के लिए Nx/Turborepo/Bazel रिमोट-कैश कैश (लिंट/टेस्ट/बिल्ड)।
टेस्ट डेटा और e2e फिक्सेस: यूआई बंडलों द्वारा संकलित डेटाबेस स्नैपशॉट।
एमएल/डेटा: तैयार डेटासेट, एम्बेडिंग, संकलित इंजन (TensorrAT/ONNX)।
2) तेज और अनुमानित विधानसभा के सिद्धांत
1. निर्धारणवाद: फिक्स संस्करण (लॉकफाइल्स), पिन बेस इमेज, हर्मेटिक प्लगइन → प्रजनन योग्य आउटपुट।
2. मूर्तिकला: एक ही विधानसभा - समान कलाकृतियाँ और हैश।
3. वृद्धिशीलता: केवल बदले हुए (DAG/जरूरतें/मैट्रिक्स/प्रभावित) का पुनर्निर्माण करें।
4. स्थानीयता और "गर्मी": रजिस्ट्री में धावकों के बगल में कैश, चोटियों से पहले वार्मिंग।
5. स्पष्ट विकलांगता: लॉकफाइल/कॉन्फ़िगरेशन फ़ाइलों द्वारा और सामग्री हैश द्वारा कैश कुंजी।
6. स्वच्छता: टीटीएल/' एक्सपायर _ इन ', ऑटो-क्लीनिंग, कैश आकार नियंत्रण और कलाकृतियाँ।
7. आपूर्ति श्रृंखला सुरक्षा: कैश ≠ रहस्यों के लिए रद्दी; SBOM/कलाकृति हस्ताक्षर अनिवार्य है।
3) डॉकर/ओसीआई: बिना आश्वासन के त्वरित चित्र
पैटर्न
मल्टी-स्टेज (बिल्डर → रनटाइम)।
न्यूनतम रनटाइम (distroless/ubi-micro, केवल आवश्यक तो/ca-certs)।
परत क्रम: पहले शायद ही कभी बदलना (deps), फिर कोड।
'.dockerignore': बाहर '.git', परीक्षण/जुड़नार, स्थानीय कैश।
बिजनेसकिट: 'कैश-फ्रॉम/टू' → नौकरियों और शाखाओं के बीच साझा कैश।
डॉकरफाइल उदाहरण (नोड + 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"]
बिल्डकिट в सीआई (GitHub क्रियाएँ)
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) भाषा पारिस्थितिकी तंत्र: कैश करना और कैसे करना है
जावा/कोटलिन (मावेन/ग्रेडल)
रिमोट कैश ग्रेडल, संगति, कॉन्फ़िगरेशन-ऑन-डिमांड।
कैश की: हैश 'बिल्ड। gradle [.kts] '+ लॉकफाइल +' ग्रेडल-रैपर। गुण '।
वस्तु भंडारण/HTTP के लिए बिल्ड कैश नोड प्रकाशित करें।
पैकेज द्वारा वृद्धिशील संकलन और परीक्षण विभाजन।
yaml
GitLab CI cache:
key: gradle-${CI_COMMIT_REF_SLUG}
paths: [.gradle/caches,.gradle/wrapper ]
script:
-./gradlew --build-cache --parallel build
नोड। जेएस (एनपीएम/पीएनपीएम/यार्न)
स्थानीय स्टोर कैश ('~/.npm', '~/.cache/pnpm'), लॉकफाइल कुंजी।
कार्यों (लिंट/परीक्षण/बिल्ड) के लिए Nx/Turborepo रिमोट-कैश (S3/Redis)।
मोनोरेपोस के लिए 'टर्बो रन बिल्ड --cache-dir = .turbo' and "प्रभावित" मोड।
अजगर (पाइप/कविता)
कैश व्हील + वर्चुअलेनव; कुंजी द्वारा 'पुनर्गणना। ताला '/' कविता। ताला '।
एक अलग चरण में पहियों को इकट्ठा करना, मैट्रिसेस के बीच पुन: उपयोग करना।
सी एक्सटेंशन के लिए - बिल्डर छवि में 'पिप व्हील' + 'ऑडिटव्हील'।
जाओ
Кэш 'GOMODCACHE', 'GOCACHE'; 'GOTOOLCHAIN '/संस्करण ठीक करें।
चरणों को विभाजित करें: 'गो मॉड डाउनलोड करें' - कोड की एक प्रति 'गो बिल्ड'।
बड़े मोनोरेल के लिए - एक परत के निर्माण के साथ Bazel/Bazelisk या 'mage'।
जंग
'~/.cargo/registry', '~/.cargo/git', 'लक्ष्य/'; scache (दूरस्थ/स्थानीय)।
'कार्गो' पर शाखाओं के बीच कैश साझा करना। ताला '।
C/C + +
कंपाइलर फ्लैग्स और एसडीके संस्करणों द्वारा ccache/sccache + कुंजी।
टूलचेन को एक अलग बुनियादी छवि में बाहर निकालें।
5) बाज़ेल/एनएक्स/टर्बोरेपो: कार्य और ग्राफ कैश
बाजेल रिमोट कैश (HTTP/Cloud) - सामग्री-पता; सख्त जकड़ न, सैंडबॉक्स।
Nx/Turborepo - कार्य आउटपुट का कैश और मोनोरेपोस में "केवल-प्रभावित" निष्पादन।
विकलांगता: चरण इनपुट (फ़ाइलें/फ्लैग/चर) पर निर्भर करता है।
6) कैश विकलांगता रणनीतियाँ
कुंजी = इनपुट का हैश: लॉकफाइल, कंपाइलर कॉन्फ़िग, प्रकट।
हल्की विकलांगता: 'रिस्टोर-कीज़' (GHA )/उपसर्ग (GLCI)।
कठिन विकलांगता: महत्वपूर्ण परिवर्तनों के लिए नामस्थान/कुंजी घुमाएँ।
परत पृथक्करण: डिप्स बनाम स्रोत - भारी निर्भरता को तोड़े बिना कोड को बदलें।
7) वृद्धिशील निर्माण और मैट्रिसेस
DAG/जरूरत: समानांतर में आश्रित जैब चलाएं, अनुक्रमों की प्रतीक्षा न करें।
पथ-फ़िल्टर - केवल प्रभावित घटकों के लिए ट्रिगर।
शार्ड परीक्षण: निर्देशिका/बीज द्वारा, संरेखित अवधि।
वार्म-पूल धावक: चोटियों से पहले पूर्व-गर्म छवियां/कैश (टूर्नामेंट/अभियान)।
8) कलाकृतियाँ बनाम कैश: कितना अलग
कैश: पुन: उपयोग किए गए इनपुट/मध्यवर्ती परिणाम, गंदा क्षेत्र, टीटीएल शॉर्ट/मीडियम।
कलाकृतियाँ: SBOM के साथ अंतिम विधानसभाएँ (चित्र, बायनेरीज़, चार्ट), अपरिवर्तनीय, हस्ताक्षरित।
नियम: कैश को आक्रामक रूप से साफ किया जाता है, कलाकृतियों को रिलीज नीति के अनुसार संग्रहीत किया जाता है।
9) अवलोकन, केपीआई और फिनोप्स
मेट्रिक्स (पाइपलाइन/रेपो द्वारा):- कैश की हिट-दर (%), वार्म-स्टार्ट बनाम कोल्ड-स्टार्ट समय, चरणों की औसत/औसत अवधि।
- प्रति पाइपलाइन/नौकरी, कैश/कलाकृतियों का आकार, थ्रूपुट (नौकरियां/घंटा)।
- मोनोरेपो में "प्रभावित-रन" का हिस्सा, अपरिवर्तित (अपशिष्ट) का पुनर्निर्माण।
- हिट-दर दहलीज से नीचे गिरती है, छवि का समय बढ़ ता है, कलाकृतियां फुलाती हैं, एसएलओ याद आती हैं।
10) कैश सुरक्षा और आपूर्ति श्रृंखला
कैश/कलाकृतियों में कोई रहस्य नहीं; मास्क वर्स, रहस्यों के स्कैन।
पिन SHA बाहरी क्रियाओं/प्लगइन, केवल भरोसेमंद धावक।
कंटेनरों/बायनेरीज़ (cosign), SBOM (CycloneDX/SPDX) पर हस्ताक्षर करना और सीडी की जाँच करना।
अलगाव: 'dev/stage/prod' के लिए अलग कैश नेमस्पेस, विदेशी शाखाओं के लिए केवल पढ़ ने के अधिकार।
11) व्यावहारिक टेम्पलेट
GitHub क्रिया - भाषा + कंटेनर
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 - ग्रैडल रिमोट कैश
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
जेनकिंस - कैश/स्कैश
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) एमएल/डेटा: भारी विधानसभाओं को तेज करना
स्थानीय एनवीएमई धावकों पर मॉडल/एम्बेडिंग/डेटासेट का कैश; हैश संस्करण।
रिलीज कलाकृतियों के रूप में प्री-असेंबली TensorRT/ONNX इंजन; अनुमान में पुन: उपयोग करें।
बड़े मॉडल के लिए चंक की गई कलाकृतियां (विभाजन); टीटीएल और आस्थगित सफाई।
13) कार्यान्वयन चेकलिस्ट
1. लॉकफाइल और आधार छवियाँ कमिट करें; BrainKit सक्षम करें.
2. अलग डॉकर परतें: deps → कोड; '.dockerignore' जोड़ें।
3. रिमोट कैश बढ़ाएँ (Gradle/Bazel/Nx/Turbo); निर्भरता प्रॉक्सी शुरू करें।
4. लॉकफ़ाइल द्वारा सीआई में निर्भरता कैश कॉन्फ़िगर करें; मैट्रिसेस और 'पाथ्स-फिल्टर' शामिल हैं।
5. मोनोरेपो में वृद्धिशील बिल्ड और "केवल प्रभावित" दर्ज करें।
6. माप-दर, गर्म/ठंडा समय, लागत; अलर्ट डाल दिया।
7. SBOM/हस्ताक्षर सक्षम करें, कैश में रहस्य को नकारें।
8. शिखर रिलीज से पहले वार्म अप कैश; टीटीएल/प्रतिधारण को विनियमित करें।
9. दस्तावेज़ कैश विकलांगता और रनबुक को "कैश टूटा" के रूप में।
10. नियमित रूप से "अनन्त" कैश साफ करें और भारी कलाकृतियों को संग्रह करें।
14) एंटीपैटर्न
डिप्स स्थापित करने से पहले अक्सर बदलते चरणों के साथ विशाल डॉकरफाइल।
कुंजी/TTL → flakes और कचरा के बिना "स्थायी" कैश साझा किया।
कलाकृतियों और कैश का मिश्रण; कोई हस्ताक्षर/SBOM नहीं।
उपकरण के असंपीड़ित संस्करण - "कैश है, लेकिन दोहराया नहीं गया है।"
प्रत्येक पीआर पर मैट्रिसेस "सभी के लिए"; 'संगति की कमी। रद्द करें '।
गर्म कैश के बिना और निर्भरता प्रॉक्सी के बिना एकल धावक।
परिणाम
विधानसभा अनुकूलन कैश, वृद्धिशीलता और नियततावाद के साथ एक व्यवस्थित काम है। सही डॉकरफाइल संरचना, बिल्ड के लिए रिमोट-कैश, निर्भरता प्रॉक्सी और विकलांगता अनुशासन तेज, सस्ती और प्रजनन योग्य पाइपलाइनें देते हैं। अवलोकन और सुरक्षा नियम जोड़ें - और आपकी रिलीज़ अक्सर, स्थिर और किफायती होगी।