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-сервіси будуть випускатися регулярно, безпечно і з контрольованою вартістю.