Перейти к содержанию

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]
  1. git push запускает основной pipeline
  2. Stage generate вызывает hive ci --global — генерирует CI jobs из .hive.yml файлов
  3. Stage run запускает сгенерированный pipeline как child pipeline
  4. 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:

artifacts:
  when: always
  reports:
    junit: hive-test-report.xml

Если тест провалился, в отчёте будут логи контейнера — это помогает быстро найти причину.

Фильтрация по веткам

Фильтрация веток управляется в родительском .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