Jenkins жана CI пайплайндар
(Бөлүк: Технология жана инфраструктура)
Кыскача резюме
Jenkins гибриддик iGaming түзүмүндө Синин универсалдуу "кыймылдаткычы" бойдон калууда: ал тиркемелерди чогултуу, контейнерлөө, тестирлөө, коопсуздук текшерүү жана экспонаттарды жарыялоону бириктирет. Ийгилик Code (Declarative/Multibranch), Shared Libraries, Kubernetes эфемер агенттери, катуу коопсуздук жана сырлар, GitOps конфигурациясын башкаруу, ошондой эле аткаруу жана нарк көрсөткүчтөрү сыяктуу конвейер болуп саналат.
1) iGaming астында Jenkins Архитектура
Controller (LTS) + агенттер: контроллер боюнча минималдуу плагиндер; агенттерге которулат.
Эфемер агенттери: динамикалык 'jnlp' (тез баштоо, таза чөйрө) астында K8s/ишке киргизүү.
Изоляция иштери: папкалар/укуктар (Folders + Role-Based Strategy), эң аз укуктар боюнча credenshly.
Observability: экспорттук метриктер (latency, кезек), борборлоштурулган Логи баскычтары, payplayns боюнча Trace ID.
2) Пайплайн үлгүлөрү: Declarative жана Multibranch
Declarative качан: стандарттык конвейерлер менен бирдей баскычтар, так 'post' -кадамдар.
Scripted качан: сейрек "стандарттуу эмес" бутактары.
Multibranch: ар бир бутагы/PR үчүн auto-paypline; саясатчылар "активдүү бутактар гана".
Негизги 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 агенттери жана контейнердик чөйрө
Мисал 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
'''
}
}
}
}
}
Практика: жалпы 'emptyDir '/remote cache аркылуу катмарларды кэш; CPU/RAM чектери; 'nodeSelector/taints' оор монтаждарды бөлүү үчүн.
4) Жалпы Libraries: DRY жана бирдиктүү стандарттар
Жалпы кадамдарды (линтерлер, SAST, чогултуу, жарыялоо) Shared Library.
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()
}
Колдонуу:
groovy
@Library('ci-lib@v3') _
pipeline {
agent any stages {
stage('Pipeline') {
steps {
withQuality {
sh 'make build'
}
}
}
}
}
Кеңештер: китепкананы версиялоо ('tags'), бирдиктүү кадамдар менен жабуу, CHANGELOG жүргүзүү.
5) Сырлар жана каттоо маалыматтары
Credentials Binding: `usernamePassword`, `string`, `file`, `sshUserPrivateKey`.
Secret scopes: минималдуу укуктар; туура этаптарда гана колдонушат.
Жашыруун менеджерлер: тышкы сактоо үчүн провайдерлер (KMS/Secrets Manager/HashiCorp Vault).
groovy withCredentials([string(credentialsId: 'cosign-key', variable: 'COSIGN_KEY')]) {
sh 'cosign sign --key $COSIGN_KEY $IMAGE'
}
6) Параллелизм, матрицалар, кэш
Matrix монтаждары
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' } }
}
}
Кэш: Docker layer кэш, көз карандылык кэш ('~/.m2', '~/.cache/pip') боюнча volume; этаптардын ортосундагы артефакттар - 'stash/unstash' же артефакт-сактоо аркылуу.
7) Коопсуздук жана шайкештик текшерүү
SCA/SAST/Secret-scan CI, DAST өзүнчө чөйрөдө.
SBOM (Syft/CycloneDX), артефакттардын кол тамгасы (cosign), "кол тамгасыз - деплой жок" саясаты.
Policy-гейтс: критикалык CVE боюнча пайплайн токтотуу; PR отчеттор.
Контурлар PII: жашыруун, өзгөрмөлүү жашыруу эмес, сезимтал чогултуу үчүн жеке агенттер.
8) Артефакттарды жарыялоо жана CD менен интеграциялоо
Registry: Retenshn саясаты менен Docker/OCI, тег immutability.
Package Repos: Maven/NPM/PyPI proxy+cache.
CD-триггерлер: Argo CD/Flagger окуяларды жөнөтүү, же GitOps-репозиторийде манифесттердин пиар түзүү.
9) Jenkins Configuration as Code (JCasC) и GitOps
Контроллерди код катары кармаңыз: Jobs шаблондору, Credenshly (шилтемелер), RBAC, агенттер.
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}"
Практика: - Git, PR-ревю, промоушен dev → stage → prod; сырлар - өзгөрмөлүү/тышкы менеджерлер аркылуу.
10) Байкоо, ишенимдүүлүк жана наркы
Метрика: кезек, этаптардын узактыгы, кайра баштоо пайызы, агенттердин өткөрүү жөндөмдүүлүгү.
мүчүлүштүктөр: 'retry', 'timeout', 'stable' -flaky-тесттерди белгилөө, ChatOps эскертмелери.
FinOps: auto өчүрүү бош агенттер, параллелдүү чогултуу чеги, папка/команда боюнча квота.
11) Ар кандай тапшырмалар боюнча пайплайндар
Backend/Web кызматы
Lint/бирдиктер → SAST/SCA → Build → SBOM/Sign → Publish → (CD триггер).
Data/ETL
Схемаларды текшерүү (dbt test) → артефакттарды өндүрүү → SQL статикалык талдоо → моделдерди жана документтерди жарыялоо.
ML/LLM
Маалыматтарды/лицензияларды текшерүү → spot агенттерде окутуу → экспорт ONNX/TensorRT → перф тесттер (latency/tokens/s) → кол коюу жана моделдерди жарыялоо.
12) Рунабуки (типтүү окуялар)
кезек өсүп жатат: агенттер кошуу, текшерүү "илинип" payplayns, concurrency чектери.
Swimming Ассамблеи: агент контейнерде аспаптар нускасын тепкилөө; өчүрүү shared workspace.
Жашыруун "агып" логиде: build-logs алып, credenshl алмаштыруу, аудит жүргүзүү; маскировка кошуу.
Controller Down: Backup JCasC + джоб сактоо/плагиндер нускасын калыбына келтирүү.
13) Киргизүү чек-тизмеси
1. минималдуу плагин топтому менен Jenkins LTS; калгандарынын баары - агенттерге.
2. Efemer K8s-агенттер, ресурстардын чеги, layer-кэш.
3. Declarative/Multibranch, PR-валидация, 'post {always {cleanWs ()}}'.
4. Shared Libraries чыгаруу менен; бирдиктүү сапат/коопсуздук кадамдары.
5. Credentials Binding + тышкы сырлар; минималдуу сатып алуулар.
6. SCA/SAST/Secret-scan/DAST, SBOM жана кол сүрөттөр.
7. JCasC жана GitOps-Configuration башкаруу; өзгөрүүлөрдүн PR-ревю.
8. Метрика/Алерт/ChatOps; ретраи/таймауттар; экспонаттар жана журналдар.
9. Сактоо/ретенция саясаты, жумуш орундарынын авто гигиенасы.
10. Документтештирилген Runabook жана үзгүлтүксүз game-day.
14) Антипаттерндер
Контроллер "бардык Server катары": оор чогултуу жана плагиндер ошол эле.
Scripted Jobs версиялоо жана код ревю жок.
Сырларды жана логдорду аралаштыруу; кеңири укуктарга ээ.
Агенттер аз/алар туруктуу → айлана-чөйрөнү drift, flaky-тесттер.
Жок SBOM/кол экспонаттар жана CVE боюнча Gates.
"Кол" Configuration башкаруу, эч кандай JCasC/GitOps.
Натыйжалары
Jenkins күчтүү жана ийкемдүү CI өзөгү бойдон калууда. Конфигурацияны кодго которуу (JCasC), Shared Libraries кадамдарын стандартташтыруу, эфемердик K8s агенттеринде жыйындыларды баштоо жана конвейерге түздөн-түз коопсуздук/кол тамга/SBOM киргизүү менен, сиз алдын ала боло турган релиздерди, контролдонуучу наркты жана iGaming эң жогорку жүктөмүнө туруктуулукту аласыз