Обзор CI/CD
Для непрерывной интеграции и доставки используется GitLab CI/CD. Каждый сервис следует стандартному пайплайну, который собирает Docker-образы, отправляет их в приватный реестр и деплоит в целевое окружение через HashiCorp Nomad.
Ключевые концепции
| Концепция | Описание |
|---|---|
| Общие шаблоны | Переиспользуемые определения CI-задач, поддерживаемые в репозитории meduza/infra. Сервисы наследуют их, а не пишут пайплайны с нуля. |
| Docker-in-Docker сборки | Все контейнерные образы собираются внутри CI с помощью docker:24-dind, что обеспечивает воспроизводимость сборок для всех сервисов. |
| Тегирование по commit SHA | Каждый образ тегируется значением $CI_COMMIT_SHORT_SHA, что даёт уникальный, отслеживаемый идентификатор, привязанный к истории Git. |
| Ветки окружений | Имя ветки определяет целевое окружение: main деплоится в prod, stage — в stage, dev — в dev. |
| Деплой через Nomad | После успешной сборки пайплайн подключается по SSH к KVM-хосту и отправляет Nomad-задачу с новым тегом образа. |
Как CI/CD вписывается в платформу
Разработчик пушит код
|
v
GitLab CI запускается
|
v
Этап сборки (Docker-образ)
|
v
Отправка в gitlab.amzgit.com:5050
|
v
Этап деплоя (nomad job run)
|
v
Сервис работает на KVM-хостеПайплайн намеренно сделан простым: сборка, затем деплой. Отдельных этапов тестирования или согласования на уровне CI нет — изоляция окружений обеспечивается таргетированием по веткам.
Централизованные шаблоны
Вся логика пайплайнов находится в meduza/infra в каталоге .gitlab/ci/. Отдельным сервисам нужен лишь минимальный .gitlab-ci.yml, который наследует общие шаблоны и задаёт несколько переменных. Это сохраняет принцип DRY и гарантирует, что все сервисы следуют единому паттерну деплоя.
Структура репозитория
Общие шаблоны, на которые ссылаются все сервисы, находятся по адресу:
meduza/infra/
└── .gitlab/
└── ci/
├── docker-build.yml # Сборка и отправка Docker-образов
└── nomad-deploy.yml # Деплой через Nomad на KVM-хостРепозиторий каждого сервиса содержит собственный .gitlab-ci.yml, который подключает эти шаблоны:
include:
- project: 'meduza/infra'
file:
- '.gitlab/ci/docker-build.yml'
- '.gitlab/ci/nomad-deploy.yml'Далее
- Общие шаблоны GitLab — подробный разбор
.docker_buildи.nomad_deploy - Docker-сборки — структура образов, схема реестра и аргументы сборки
- Поток пайплайна — сквозное описание с диаграммами