GitLab CI/CD для iGaming-проектов
(Раздел: Технологии и Инфраструктура)
Краткое резюме
GitLab CI/CD — «конвейер» поставки для приложений, аналитики и ML-сервисов iGaming. Он объединяет: репозиторий, пайплайны как код, управление окружениями и безопасностью, собственный реестр контейнеров/пакетов, интеграции с Kubernetes и Terraform, а также сканирование уязвимостей и лицензий. Ключ к успеху — одинаковые шаблоны пайплайнов, эфемерные раннеры с авто-скейлом, строгая модель прав и секретов, GitOps-процессы и контроль стоимости.
1) Архитектура и роли
GitLab (SaaS или Self-Managed): группы/проекты, Protected branches/tags, Merge Request Approvals.
Runners: Docker/Kubernetes/Virtual Machine executors. Эфемерные поды в K8s минимизируют дрейф среды.
Регистры: Container/Package/Dependency Proxy — кэшируют базовые образы и зависимости.
Observability: job logs, job artifacts, pipeline insights, экспорт метрик в мониторинг.
Роли: разработчики (MR), мейнтейнеры (approve/release), SecOps (политики сканирования), Platform/DevOps (раннеры, шаблоны, GitOps).
2) Основы `.gitlab-ci.yml`: стадии, правила, зависимости
yaml stages: [lint, test, build, security, package, deploy]
variables:
DOCKER_DRIVER: overlay2
IMAGE: "$CI_REGISTRY_IMAGE/app:$CI_COMMIT_SHA"
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
.default:
image: alpine:3. 20 before_script: [ 'apk add --no-cache bash curl jq' ]
lint:
stage: lint script: [ "make lint" ]
rules: [ { if: '$CI_PIPELINE_SOURCE == "merge_request_event"' } ]
unit:
stage: test script: [ "make test" ]
artifacts:
when: always reports: { junit: "reports/junit. xml" }
needs: [ "lint" ]
build_image:
stage: build image: docker:27 services: [ 'docker:27-dind' ]
variables: { DOCKER_TLS_CERTDIR: "" }
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $IMAGE.
- docker push $IMAGE cache:
key: "docker-${CI_COMMIT_REF_SLUG}"
paths: [ "/var/lib/docker" ]
policy: pull-push needs: [ "unit" ]
Практики:
- `rules` для веток/MR/тегов; `needs` для DAG-параллелизма; `artifacts:reports` для JUnit/coverage; `workflow` — чтобы не запускать лишние пайплайны.
3) Раннеры и авто-скейл
Kubernetes executor (рекомендуется)
Эфемерные поды, квоты CPU/RAM, nodeSelector/taints, изоляция секретов.
Кэш/артефакты: объектное хранилище; dependency proxy для NPM/Maven/PyPI/Docker.
Docker executor
Простой старт; используйте DinD или Kaniko/BuildKit для сборки без привилегий.
Советы:- Отдельные пулы раннеров по типам нагрузок (Build/Test/Security/ML); лимиты concurrency на группу/проект; тэги раннеров (`k8s`, `gpu`, `security`).
4) Кэш, артефакты и матрицы
yaml cache:
key: "pip-${CI_COMMIT_REF_SLUG}"
paths: [ "venv/", ".cache/pip/" ]
policy: pull-push
test:py:
stage: test parallel:
matrix:
- PY: ["3. 10", "3. 12"]
image: python:${PY}
script:
- python -m venv venv &&. venv/bin/activate
- pip install -r requirements. txt
- pytest -q
Используйте глобальный dependency proxy для экономии трафика и времени, split-tests по матрице, artifacts:expire_in для гигиены.
5) Безопасность и соответствие (Shift-Left)
Типовой «security-stage»:yaml sast:
stage: security image: registry. gitlab. com/security-products/sast:latest script: [ "analyzer run" ]
artifacts: { reports: { sast: "gl-sast-report. json" } }
rules: [ { if: '$CI_PIPELINE_SOURCE == "merge_request_event"' } ]
secret_detection:
stage: security image: registry. gitlab. com/security-products/secret-detection:latest script: [ "analyzer run" ]
artifacts: { reports: { secret_detection: "gl-secret-report. json" } }
sbom:
stage: security image: alpine:3. 20 script:
- apk add syft cosign
- syft $IMAGE -o cyclonedx-json > sbom. json
- cosign sign --key $COSIGN_KEY $IMAGE artifacts:
reports: { cyclonedx: "sbom. json" }
Также: DAST для стендов, Dependency/License Compliance, обязательные MR-approvals при критичных findings, маскирование переменных.
6) Окружения, Review Apps и релизы
yaml review:
stage: deploy image: bitnami/kubectl environment:
name: review/$CI_COMMIT_REF_SLUG url: https://$CI_COMMIT_REF_SLUG. apps. example. com on_stop: stop_review script:
-./deploy. sh --env=review --image=$IMAGE rules: [ { if: '$CI_PIPELINE_SOURCE == "merge_request_event"' } ]
stop_review:
stage: deploy when: manual environment:
name: review/$CI_COMMIT_REF_SLUG action: stop script: [ "./deploy. sh --env=review --delete" ]
Release/Tag пайплайн: публикация Helm-чарта/артефактов, генерация релиз-нотов, подпись образов.
7) Progressive delivery: canary/blue-green
yaml deploy_canary:
stage: deploy script: [ "./helm_upgrade. sh --set canary. weight=10 --image=$IMAGE" ]
environment: { name: production }
rules: [ { if: '$CI_COMMIT_TAG' } ]
promote_100:
stage: deploy when: manual script: [ "./helm_upgrade. sh --set canary. weight=100" ]
needs: [ "deploy_canary" ]
Добавьте quality gates: SLO latency/error-rate из мониторинга → разрешение/откат.
8) Parent/Child и мультипроектные пайплайны
Parent/Child: ускоряют большие монорепо (каждый компонент — child pipeline).
yaml trigger_components:
stage: build trigger:
include: [ "ci/component-a. yml", "ci/component-b. yml" ]
strategy: depend
Multi-Project: «Release» проект триггерит CD в манифест-репо (GitOps).
9) GitOps и Terraform/IaC
GitOps через MR в манифест-репозиторий
yaml gitops_bump:
stage: deploy image: alpine/git script:
- git clone $MANIFESTS_REPO manifests
- yq -i '.image = env(IMAGE)' manifests/apps/app/values. yaml
- cd manifests && git commit -am "bump $CI_COMMIT_SHA" && git push origin HEAD:$TARGET_BRANCH
Terraform в CI
yaml terraform:
stage: deploy image: hashicorp/terraform:1. 9 script:
- terraform init -backend-config="bucket=$TF_BUCKET"
- terraform plan -out tfplan
- terraform apply -auto-approve tfplan rules: [ { if: '$CI_COMMIT_BRANCH == "infra"'} ]
10) Секреты и доступы
CI Variables: masked/protected; разделяйте по окружениям/группам.
Protected branches/tags: деплой в prod — только из защищенных веток и с ручным подтверждением.
Внешние секреты: интеграции с Secrets Manager/HashiCorp Vault (JWT/OIDC), монтирование на раннерах только на время job.
11) Наблюдаемость пайплайнов и SLO
Pipeline DORA/KPI: lead time, deployment frequency, change fail rate, MTTR.
Инструменты: ретраи/таймауты, `allow_failure` для не-блокирующих задач, отчет покрытия кода.
Экспорт метрик: длительность стадий, очередь раннеров, success ratio; алерты в ChatOps.
12) FinOps: стоимость и производительность
Dependency Proxy + кэш зависимостей и слоев Docker.
Разделение пулов раннеров (prod/security/ML) с лимитами concurrency.
Авто-пауза Review Apps и неактивных сред; `artifacts:expire_in`.
Крупные сборки — на spot/преемптабельных пулах; пред-прогрев базовых образов.
13) Шаблоны для iGaming-кейсов
Backend/API сервис
yaml include: [ "ci/includes/security. yml", "ci/includes/docker. yml" ]
deploy_prod:
stage: deploy environment: { name: production, url: https://api. example. com }
script: [ "./helm_upgrade. sh --env=prod --image=$IMAGE" ]
rules: [ { if: '$CI_COMMIT_TAG' } ]
ETL/DBT модель
yaml dbt_run:
stage: build image: ghcr. io/dbt-labs/dbt-snowflake:latest script: [ "dbt deps", "dbt run --profiles-dir. ", "dbt test" ]
artifacts: { paths: [ "target/" ], expire_in: 3 days }
ML/LLM артефакт
yaml ml_pack:
stage: package image: nvidia/cuda:12. 1. 0-runtime-ubuntu22. 04 tags: [ "gpu" ]
script:
- python export_onnx. py
- trtexec --onnx=model. onnx --saveEngine=model. plan artifacts: { paths: [ "model. plan", "model. onnx" ] }
14) Чек-лист внедрения
1. Определите шаблоны пайплайнов и Shared Includes для команд (lint/test/build/security/deploy).
2. Разверните эфемерные K8s-раннеры, включите dependency proxy, объектный storage для артефактов/кэша.
3. Введите rules/needs/DAG, матрицы и параллелизм.
4. Настройте SAST/DAST/Secret/SBOM/License и MR-approvals по политикам.
5. Организуйте Environments/Review Apps, автозакрытие и аккуратные URL.
6. Включите GitOps: отдельный манифест-репо, MR-бамп образов/чартов.
7. Обеспечьте управление секретами (masked/protected, Vault/OIDC), protected branches/tags.
8. Подключите Terraform/IaC и «мониторинг как код».
9. Введите FinOps-практики: лимиты раннеров, кэш/прокси, expire артефактов, автопауза стендов.
10. Регулярные game-day: падение раннера, заполнение кэша, недоступность реестра.
15) Антипаттерны
Один «универсальный» раннер без изоляции и квот.
Пайплайны без `rules` (запускаются «всегда»), без `needs` (медленно).
Привилегированные сборки DinD в прод-раннерах без ограничений.
Хранение секретов в репозитории/в логах job.
Отсутствие security-стадии и MR-approvals.
Бесконечные Review Apps без `on_stop` и `expire_in`.
Ручные релизы в prod без protected tags.
Итоги
GitLab CI/CD дает iGaming-командам быстрые и предсказуемые релизы: единые шаблоны, авто-скейл раннеров, качественные гейты безопасности, среды и прогрессивные деплои, GitOps и Terraform-интеграцию. Добавьте наблюдаемость и FinOps — и ваши приложения, ETL и ML-сервисы будут выпускаться регулярно, безопасно и с контролируемой стоимостью.