Skip to content
страница целиком, в Markdown — вставьте в чат с моделью

Обзор CI/CD ​

Для непрерывной интеграции и доставки используется GitLab CI/CD. Каждый сервис следует стандартному пайплайну, который собирает Docker-образ, отправляет его в приватный registry и деплоит в целевое окружение через HashiCorp Nomad.

Ключевые концепции ​

КонцепцияОписание
Общие шаблоныПереиспользуемые определения CI-задач, поддерживаемые в репозитории meduza/infra. Сервисы наследуют их, а не пишут пайплайны с нуля.
Docker-in-Docker сборкиВсе контейнерные образы собираются внутри CI с помощью docker:24-dind, что обеспечивает воспроизводимость сборок для всех сервисов.
Тегирование по окружениюОбраз тегируется именем окружения: dev, stage или prod. Отдельного SHA-тега больше нет — за уникальность выкатки отвечает переменная deploy_ts.
Ветки окруженийИмя ветки определяет целевое окружение: main деплоится в prod, stage — в stage, dev — в dev. Остальные ветки пайплайн пропускают.
Деплой через Nomad APIПосле успешной сборки задача деплоя обращается к Nomad напрямую по HTTP с раннера и запускает джобу в нужном namespace. SSH на хост не используется.
Раннер new-serverИ сборка, и деплой идут на раннере нового кластера — джобам нужен тег new-server.

Как CI/CD вписывается в платформу ​

Разработчик пушит код
        |
        v
  GitLab CI запускается
        |
        v
  Этап сборки (Docker-образ)
        |
        v
  Отправка в registry.amztop.io
        |
        v
  Этап деплоя (nomad job run по API)
        |
        v
  Сервис работает на ноде своего окружения

Пайплайн намеренно сделан простым: сборка, затем деплой. Отдельных этапов тестирования или согласования на уровне CI нет — изоляция окружений обеспечивается таргетированием по веткам.

Централизованные шаблоны

Логика сборки находится в meduza/infra в каталоге .gitlab/ci/. Отдельному сервису нужен минимальный .gitlab-ci.yml, который подключает шаблон сборки и описывает три задачи деплоя.

Структура репозитория ​

Общий шаблон сборки, на который ссылаются все сервисы, находится по адресу:

meduza/infra/
└── .gitlab/
    └── ci/
        ├── docker-build.yml   # Сборка и отправка Docker-образов
        └── nomad-deploy.yml   # Устаревший деплой по SSH на старый KVM-хост

Репозиторий каждого сервиса подключает только шаблон сборки:

yaml
include:
  - project: 'meduza/infra'
    ref: main
    file: '.gitlab/ci/docker-build.yml'

Шаблон nomad-deploy.yml больше не подключается

Он ходит по SSH на старый KVM-хост. Сервисы нового кластера описывают деплой у себя, вызывая Nomad напрямую — см. Новый сервис: от репозитория до прода.

Далее ​

Документация по инфраструктуре