Обзор 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-хостРепозиторий каждого сервиса подключает только шаблон сборки:
include:
- project: 'meduza/infra'
ref: main
file: '.gitlab/ci/docker-build.yml'Шаблон nomad-deploy.yml больше не подключается
Он ходит по SSH на старый KVM-хост. Сервисы нового кластера описывают деплой у себя, вызывая Nomad напрямую — см. Новый сервис: от репозитория до прода.
Далее
- Новый сервис: от репозитория до прода — пошаговая инструкция с готовыми файлами
- Общие шаблоны GitLab — подробный разбор
.docker_buildи задач деплоя - Docker-сборки — структура образов, схема реестра и аргументы сборки
- Поток пайплайна — сквозное описание с диаграммами