CI/CD Integration¶
Hive интегрируется с GitLab CI через динамическую генерацию pipeline.
Как это работает¶
graph LR
A[git push] --> B[generate-pipeline]
B -->|hive ci --global| C[child-pipeline.yml]
C --> D[run-pipeline]
D --> T[token]
T --> E[init]
E --> F[build]
F --> G[test]
G --> H[deploy]
git pushзапускает основной pipeline- Stage
generateвызываетhive ci --global— генерирует CI jobs из.hive.ymlфайлов - Stage
runзапускает сгенерированный pipeline как child pipeline - Child pipeline: token → init → build → test → deploy для каждого сервиса
Настройка¶
.gitlab-ci.yml (корень репозитория)¶
stages:
- generate
- run
generate-pipeline:
stage: generate
image: lab.xmonetize.net:5050/infrastructure/hive/hive-api/cli:latest
script:
- hive ci --global > child-pipeline.yml
artifacts:
paths:
- child-pipeline.yml
run-pipeline:
stage: run
trigger:
include:
- artifact: child-pipeline.yml
job: generate-pipeline
strategy: depend
Это всё. Один раз настроили — дальше pipeline обновляется автоматически при добавлении/удалении сервисов.
Что генерируется¶
token¶
Создаёт gitlab-deploy-token проекта, если его нет (hive token). Отдельный stage — чтобы job init уже получил токен в CI_DEPLOY_USER/CI_DEPLOY_PASSWORD.
init¶
Регистрирует репозиторий в ArgoCD с deploy token проекта. Один job на весь pipeline, не per-service.
- Image:
lab.xmonetize.net:5050/infrastructure/hive/hive-api/cli:latest - Идемпотентный: повторная регистрация обновляет креды, новые токены не создаются
- Запуск: когда родительский pipeline запускает child (правила по веткам — в родителе)
Для каждого сервиса создаются три jobs:
build-{name}¶
Собирает контейнер через Cloud Native Buildpacks.
- Image:
lab.xmonetize.net:5050/infrastructure/hive/hive-api/cli:latest - Services:
docker:27-dind(Docker-in-Docker) - Запуск: только на default branch
test-{name}¶
Запускает контейнер и проверяет health endpoint.
- Depends on:
build-{name} - Services:
docker:27-dind - Artifacts: JUnit XML отчёт (
hive-test-report.xml)
deploy-{name}¶
Деплоит через Hive API → ArgoCD → Knative.
- Depends on:
test-{name} - Запуск: только на default branch
Переменные CI¶
Эти переменные должны быть настроены в GitLab CI/CD Settings:
| Переменная | Описание | Где настроить |
|---|---|---|
HIVE_API_URL |
URL Hive API | CI/CD Variables (группа или проект) |
HIVE_API_TOKEN |
Bearer token | CI/CD Variables (masked) |
ARGOCD_URL |
URL ArgoCD (для bootstrap) | CI/CD Variables, scoped по environment |
ARGOCD_TOKEN |
Токен ArgoCD (для bootstrap) | CI/CD Variables, scoped по environment |
CI_REGISTRY_IMAGE |
Авто — адрес в registry | Автоматически GitLab |
CI_PIPELINE_ID |
Авто — тег образа | Автоматически GitLab |
Секреты
HIVE_API_TOKEN должен быть masked и protected. Никогда не коммитьте токены в репозиторий.
Multi-service pipeline¶
Для multi-service репозитория генерируются параллельные цепочки:
┌→ build-frontend → test-frontend → deploy-frontend
init ────┼→ build-backend → test-backend → deploy-backend
└→ build-worker → test-worker → deploy-worker
Каждый сервис собирается и деплоится независимо. CI_REGISTRY_IMAGE дополняется суффиксом /{name}.
Сервисы с type: cronjobs пропускают stage test (нет HTTP порта для probe):
┌→ build-api → test-api → deploy-api
init ────┼→ build-frontend → test-frontend → deploy-frontend
└→ build-workers ──────────────────→ deploy-workers (cronjobs)
JUnit отчёты¶
Stage test генерирует JUnit XML. GitLab автоматически показывает результаты тестов в Merge Request:
Если тест провалился, в отчёте будут логи контейнера — это помогает быстро найти причину.
Фильтрация по веткам¶
Фильтрация веток управляется в родительском .gitlab-ci.yml через rules:, а не в сгенерированном child pipeline. Это позволяет контролировать, какие ветки запускают сборку и деплой, в одном месте:
# .gitlab-ci.yml (родительский pipeline)
generate-pipeline-staging:
# ...
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
run-pipeline-staging:
# ...
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Чтобы включить деплой из feature branches, измените rules: в вашем .gitlab-ci.yml.
Окружения¶
Список окружений и чем они отличаются — на странице Окружения. hive ci --global -E <name> читает cli/environments.yaml и инжектит переменные окружения в сгенерированный pipeline: job init получает HIVE_API_URL и HIVE_ENVIRONMENT, jobs deploy — HIVE_API_URL, HIVE_DOMAIN и HIVE_ENVIRONMENT. Неизвестное имя — ошибка.
Это решает проблему того, что GitLab environment-scoped variables не пробрасываются в child pipelines.
Multi-environment .gitlab-ci.yml¶
Staging деплоится автоматически, каждый прод ждёт ручного запуска. Оставьте только те окружения, которые нужны сервису.
stages:
- generate
- staging
- production
- envik
generate-pipeline-staging:
stage: generate
image: lab.xmonetize.net:5050/infrastructure/hive/hive-api/cli:latest
script:
- hive ci --global -E staging > child-pipeline-staging.yml
artifacts:
paths:
- child-pipeline-staging.yml
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
generate-pipeline-production:
stage: generate
image: lab.xmonetize.net:5050/infrastructure/hive/hive-api/cli:latest
script:
- hive ci --global -E production > child-pipeline-production.yml
artifacts:
paths:
- child-pipeline-production.yml
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
generate-pipeline-envik:
stage: generate
image: lab.xmonetize.net:5050/infrastructure/hive/hive-api/cli:latest
script:
- hive ci --global -E envik > child-pipeline-envik.yml
artifacts:
paths:
- child-pipeline-envik.yml
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
run-pipeline-staging:
stage: staging
trigger:
include:
- artifact: child-pipeline-staging.yml
job: generate-pipeline-staging
strategy: depend
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
run-pipeline-production:
stage: production
trigger:
include:
- artifact: child-pipeline-production.yml
job: generate-pipeline-production
strategy: depend
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: manual
run-pipeline-envik:
stage: envik
trigger:
include:
- artifact: child-pipeline-envik.yml
job: generate-pipeline-envik
strategy: depend
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: manual