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).

Нажимая кнопку, вы соглашаетесь на обработку данных.