Jenkins və paylaynlar CI
(Bölmə: Texnologiya və Infrastruktur)
Qısa xülasə
Jenkins iGaming hibrid infrastrukturunda CI-nin universal «mühərriki» olaraq qalır: tətbiqlərin yığılmasını, konteynerləşdirilməsini, testləri, təhlükəsizlik yoxlamasını və artefaktların nəşrini birləşdirir. Uğur, kod (Declarative/Multibranch), Paylaşılan Kitabxanalar, Kubernetes-də efemer agentlər, sərt təhlükəsizlik və sirlər, GitOps-konfiqurasiya idarəetməsi, həmçinin performans və dəyər metrikləri kimi konveyerdir.
1) iGaming altında Jenkins Memarlıq
Controller (LTS) + agentlər: nəzarətçidə minimum plugin; iş agentlərə köçürülür.
Efemer agentləri: dinamik 'jnlp' altında K8s/start (sürətli başlanğıc, təmiz mühit).
İşlərin izolyasiyası: qovluqlar/hüquqlar (Folders + Role-Based Strategy), ən kiçik hüquqlar üzrə kredenşlidir.
Observability: ixrac metrik (latency, növbə), mərkəzləşdirilmiş log mərhələləri, paylaynlarda trace-ID.
2) Payplayn nümunələri: Declarative və Multibranch
Declarative zaman: homojen mərhələləri ilə standart konveyer, aydın 'post' -addımlar.
Scripted zaman: nadir «qeyri-standart» budaqları.
Multibranch: hər filial/PR üçün auto paypline; siyasətçilər «yalnız aktiv filiallar».
Əsas Declarative-paypline
groovy pipeline {
agent { label 'k8s' } // или agent { kubernetes {... } }
options {
timestamps()
ansiColor('xterm')
buildDiscarder(logRotator(numToKeepStr: '50'))
timeout(time: 30, unit: 'MINUTES')
disableConcurrentBuilds()
}
environment {
REGISTRY = 'registry. example. com'
IMAGE = "${env. REGISTRY}/payments:${env. GIT_COMMIT}"
}
stages {
stage('Checkout') {
steps { checkout(scm) }
}
stage('Lint & Unit') {
parallel {
stage('Lint') { steps { sh 'make lint' } }
stage('Unit') { steps { sh 'make test' } }
}
}
stage('SCA/SAST') {
steps {
sh'make deps_audit'//SCA (dependencies)
sh'make sast '//static analysis
}
}
stage('Build Image') {
steps { sh 'docker build -t $IMAGE. && docker push $IMAGE' }
}
stage('SBOM & Sign') {
steps {
sh 'syft $IMAGE -o spdx-json > sbom. json'
sh 'cosign sign --key $COSIGN_KEY $IMAGE'
archiveArtifacts artifacts: 'sbom. json', fingerprint: true
}
}
}
post {
success { echo '+ Build OK' }
failure { echo '- Build failed'; sh 'printenv sort sed -n "1,50p"' }
always { cleanWs() }
}
}
3) Kubernetes agentləri və konteyner mühitləri
Nümunə podTemplate (Declarative)
groovy pipeline {
agent {
kubernetes {
yaml """apiVersion: v1 kind: Pod spec:
serviceAccountName: jenkins containers:
- name: build image: docker:27-dind securityContext: { privileged: true }
- name: tools image: alpine:3. 20 command: ['cat']
tty: true
"""
defaultContainer 'tools'
}
}
stages {
stage('Build in DinD') {
steps {
container('build') {
sh '''
dockerd-entrypoint. sh & sleep 5 docker build -t $IMAGE.
docker push $IMAGE
'''
}
}
}
}
}
Təcrübə: ümumi 'emptyDir '/remote cache vasitəsilə qatların cache; CPU/RAM limitləri; ağır montajların ayrılması üçün 'nodeSelector/taints'.
4) Shared Libraries: DRY və vahid standartlar
Paylaşılan Kitabxanada ümumi addımlar atın (linterlər, SAST, montaj, nəşr).
groovy
// vars/withQuality. groovy def call(Closure body) {
stage('Quality Gate') {
parallel(
"Lint": { sh 'make lint' },
"Unit": { sh 'make test' },
"SCA": { sh 'make deps_audit' }
)
}
body()
}
Istifadə:
groovy
@Library('ci-lib@v3') _
pipeline {
agent any stages {
stage('Pipeline') {
steps {
withQuality {
sh 'make build'
}
}
}
}
}
Məsləhətlər: Kitabxananı versiya edin ('tags'), vahid addımlarla əhatə edin, CHANGELOG-u idarə edin.
5) Sirlər və hesab məlumatları
Credentials Binding: `usernamePassword`, `string`, `file`, `sshUserPrivateKey`.
Secret scopes: minimum hüquqlar; yalnız lazımi mərhələlərdə istifadə.
Gizli menecerlər: xarici saxlama üçün provayderlər (KMS/Secrets Manager/HashiCorp Vault).
groovy withCredentials([string(credentialsId: 'cosign-key', variable: 'COSIGN_KEY')]) {
sh 'cosign sign --key $COSIGN_KEY $IMAGE'
}
6) Paralellik, matrislər, cache
Matrix-yığma
groovy stage('Test Matrix') {
matrix {
axes {
axis { name 'PY'; values '3. 10', '3. 12' }
axis { name 'DB'; values 'mysql', 'postgres' }
}
stages {
stage('Run') { steps { sh 'pytest -q' } }
}
post { always { junit 'reports/.xml' } }
}
}
Caching: Docker layer cache, asılılıq cache ('~/.m2', '~/.cache/pip') volume; mərhələlər arasında artefaktlar - 'stash/unstash' və ya artefakt-saxlama vasitəsilə.
7) Təhlükəsizlik yoxlamaları və uyğunluq
SCA/SAST/Secret-scan CI, ayrı mühitdə DAST.
SBOM (Syft/CycloneDX), artefaktların imzası (cosign), «imzasız - deploy yoxdur» siyasəti.
Policy-geytlar: kritik CVE-də paylaynın dayandırılması; PR hesabatları.
PII konturları: sirləri qeyd etməyin, dəyişənləri maskalamayın, həssas montajlar üçün ayrı-ayrı agentlər.
8) Artefaktların nəşri və CD ilə inteqrasiya
Registry: Retenshn siyasəti ilə Docker/OCI, etiketlərin immutability.
Package Repos: Maven/NPM/PyPI proxy+cache.
CD-triggerlər: hadisələri Argo CD/Flagger-ə göndərmək və ya GitOps-manifest anbarında PR yaratmaq.
9) Jenkins Configuration as Code (JCasC) и GitOps
Controller kod kimi saxlayın: jobs şablonları, kredenshly (links), RBAC, agentlər.
yaml jenkins:
systemMessage: "Jenkins (iGaming CI)"
numExecutors: 0 authorizationStrategy:
roleBased:
roles:
global:
- name: "readers"
pattern: "."
permissions: ["Overall/Read"]
nodes:
- permanent:
name: "edge-builder"
remoteFS: "/home/jenkins"
labels: "docker"
unclassified:
location:
url: "https://ci. example. com/"
credentials:
system:
domainCredentials:
- credentials:
- string:
id: "cosign-key"
description: "Cosign key ref"
secret: "${COSIGN_KEY_FROM_ENV}"
Təcrübə: Git, PR-revyu, promosyon dev → stage → prod; sirləri - dəyişənlər/xarici menecerlər vasitəsilə.
10) Müşahidə, etibarlılıq və dəyəri
Metriklər: növbə, mərhələ müddəti, yenidən başlanğıc faizi, agentlərin ötürmə qabiliyyəti.
Uğursuzluqlar: 'retry', 'timeout', 'stable' -flaky testlərinin etiketlənməsi, ChatOps-da bildirişlər.
FinOps: Boş qalan agentlərin avtomatik bağlanması, paralel montaj limitləri, qovluqlar/komandalar üçün kvotalar.
11) Müxtəlif vəzifələr üçün paylaynlar
Backend/Web xidməti
Lint/birlik → SAST/SCA → Build → SBOM/Sign → Publish → (CD tetikleyici).
Data/ETL
Sxemlərin yoxlanılması (dbt test) → artefaktların yaradılması → SQL statik təhlili → modellərin və sənədlərin dərc edilməsi.
ML/LLM
Məlumatların/lisenziyaların yoxlanılması → spot agentlərdə təlim → ONNX/TensorRT ixracı → perf testləri (latency/tokens/s) → imza və model nəşri.
12) Runabuki (tipik hadisələr)
Növbə artır: agentləri əlavə edin, «asılmış» paylaynları, concurrency limitlərini yoxlayın.
Üzən montajlar: agent konteynerində alətlərin pin versiyaları; shared workspace.
Gizli «sızma» log: build-log silmək, credenshl əvəz, audit keçirmək; maskalama əlavə edin.
Controller Download: JCasC + job saxlama/plugin backup recovery version.
13) Giriş çek siyahısı
1. Minimum plugin dəsti ilə Jenkins LTS; qalan hər şey - agent.
2. Efemer K8s-agentlər, resurs limitləri, layer-caches.
3. Declarative/Multibranch, PR-validasiya, 'post {always {cleanWs ()}}'.
4. Shared Libraries versiyası ilə; vahid keyfiyyət/təhlükəsizlik addımları.
5. Credentials Binding + xarici sirləri; minimum cups.
6. SCA/SAST/Secret-scan/DAST, SBOM və şəkil imzası.
7. JCasC və GitOps konfiqurasiya idarəetmə; PR review dəyişikliklər.
8. Metriklər/Alertlər/ChatOps; retrai/taymaut; artefaktlar və jurnallar.
9. Saxlama/retensiya siyasəti, iş yerlərinin avto gigiyenası.
10. Sənədli Runabook və müntəzəm game-day.
14) Antipattern
Controller «bütün server kimi»: ağır montaj və plugins eyni.
Version və kod review olmadan Scripted Jobs.
Sirləri və yuvaları qarışdırmaq; geniş hüquqlar ilə kredenshly.
Agentlər az/onlar daimi → drift mühit, flaky testlər.
CVE üçün SBOM/artefaktların və geytlərin imzası yoxdur.
«Əl» konfiqurasiya idarə, JCasC/GitOps yoxdur.
Nəticələr
Jenkins güclü və çevik CI nüvəsi olaraq qalır. Konfiqurasiyanı koda (JCasC) çevirməklə, Paylaşılan Kitabxanalarda addımları standartlaşdırmaqla, K8s efemer agentlərində yığımları işə salmaqla və təhlükəsizlik/imza/SBOM-u birbaşa konveyerə yerləşdirməklə, proqnozlaşdırıla bilən buraxılışlar, nəzarət olunan dəyər və iGaming pik yüklərinə qarşı müqavimət əldə edəcəksiniz.