GH GambleHub

Jenkins і пайплайни CI

(Розділ: Технології та Інфраструктура)

Коротке резюме

Jenkins залишається універсальним «двигуном» CI в гібридних інфраструктурах iGaming: він об'єднує збірку додатків, контейнеризацію, тести, перевірку безпеки і публікацію артефактів. Успіх - це конвеєр як код (Declarative/Multibranch), Shared Libraries, ефемерні агенти в Kubernetes, жорстка безпека і секрети, GitOps-управління конфігом, а також метрики продуктивності і вартості.

1) Архітектура Jenkins під iGaming

Controller (LTS) + агенти: мінімум плагінів на контролері; робота переноситься в агенти.
Ефемерні агенти: запуск в K8s/під динамічний'jnlp'( швидкий старт, чисті оточення).
Ізоляція робіт: папки/права (Folders + Role-Based Strategy), креденшли з найменших прав.
Observability: експорт метрик (latency, черга), централізовані логи стадій, трейс-ID в пайплайнах.

2) Патерни пайплайнів: Declarative и Multibranch

Коли Declarative: стандартні конвеєри з однорідними стадіями, чіткі'post'-кроки.
Коли Scripted: рідкісні «нестандартні» розгалуження.
Multibranch: авто-пайплайн для кожної гілки/PR; політики «тільки активні гілки».

Базовий Declarative-пайплайн

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) Shared 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'), покривайте unit-тестами кроків, ведіть 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 cache, кеш залежностей ('~/.m2','~/.cache/pip') на volume; артефакти між стадіями - через'stash/unstash'або артефакт-сховище.

7) Перевірки безпеки та відповідність

SCA/SAST/Secret-scan в CI, DAST в окремому оточенні.
SBOM (Syft/CycloneDX), підпис артефактів (cosign), політика «без підпису - ні деплоя».
Policy-гейти: зупинка пайплайну при критичних CVE; звіти в PR.
Контури PII: не логувати секрети, маскувати змінні, окремі агенти для чутливих збірок.

8) Публікація артефактів та інтеграція з CD

Registry: Docker/OCI з ретеншн-політикою, immutability тегів.
Package Repos: Maven/NPM/PyPI proxy+cache.
CD-тригери: відправка подій в Argo CD/Flagger, або створення PR в GitOps-репозиторій маніфестів.

9) Jenkins Configuration as Code (JCasC) и GitOps

Тримайте конфіг контролера як код: джоби-шаблони, креденшли (посилання), 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: авто-вимикання простоюючих агентів, ліміти паралельних збірок, квоти за папками/командами.

11) Пайплайни під різні завдання

Backend/Web сервіс

Лінт/юніти → SAST/SCA → Build → SBOM/Sign → Publish → (тригер CD).

Data/ETL

Перевірка схем (dbt test) → генерація артефактів → статичний аналіз SQL → публікація моделей і документації.

ML/LLM

Перевірка даних/ліцензій → тренування в spot-агентах → експорт ONNX/TensorRT → перф-тести (latency/tokens/s) → підпис і публікація моделі.

12) Рунабуки (типові інциденти)

Черга зростає: додати агенти, перевірити «підвислі» пайплайни, ліміти concurrency.
Плавають збірки: пинити версії інструментів в контейнері агента; вимкнути shared workspace.
Секрет «качок» в логи: видалити build-логи, замінити креденшл, провести аудит; додати маскування.
Падіння контролера: відновлення з backup JCasC + сховище джоб/плагінів версіоновано.

13) Чек-лист впровадження

1. Jenkins LTS з мінімальним набором плагінів; все інше - в агенти.
2. Ефемерні 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-управління конфігом; PR-рев'ю змін.
8. Метрики/алерти/ChatOps; ретраї/таймаути; артефакти і журнали.
9. Політики зберігання/ретенції, авто-гігієна робочих просторів.
10. Документовані рунабуки і регулярні game-day.

14) Антипатерни

Контролер «як сервер всього»: важкі збірки і плагіни на ньому ж.
Scripted-джоби без версіонування і код-рев'ю.
Змішування секретів і логів; креденшли з широкими правами.
Агентів мало/вони постійні → дрейф оточень, flaky-тести.
Відсутність SBOM/підпису артефактів і гейтів по CVE.
«Ручне» управління конфігом, немає JCasC/GitOps.

Підсумки

Jenkins залишається потужним і гнучким ядром CI. Перевівши конфігурацію в код (JCasC), стандартизувавши кроки в Shared Libraries, запускаючи збірки на ефемерних K8s-агентах і вбудувавши безпеку/підпис/SBOM прямо в конвеєр, ви отримаєте передбачувані релізи, контрольовану вартість і стійкість до пікових навантажень iGaming.

Contact

Зв’яжіться з нами

Звертайтеся з будь-яких питань або за підтримкою.Ми завжди готові допомогти!

Telegram
@Gamble_GC
Розпочати інтеграцію

Email — обов’язковий. Telegram або WhatsApp — за бажанням.

Ваше ім’я необов’язково
Email необов’язково
Тема необов’язково
Повідомлення необов’язково
Telegram необов’язково
@
Якщо ви вкажете Telegram — ми відповімо й там, додатково до Email.
WhatsApp необов’язково
Формат: +код країни та номер (наприклад, +380XXXXXXXXX).

Натискаючи кнопку, ви погоджуєтесь на обробку даних.