CI/CD Сервисов

GitOps

Мы используем централизированную систему Kubernetes манифестов для наших сервисов. Она представляет из себя git репозиторий, в котором сгруппированы все ресурсы сервиса (деплоймент, сервис, конфиг и т.д.). ArgoCD подхватывает эти данные и выкатывает в кластер.

Поскольку конфиги и прочие сервисные данные отличаются в зависимости от среды, пепозиторий разделен на две части: dev и prod. Каждая из частей уходит на свою машину и в свою среду.

CI/CD

Вся бекенд архитектура проходит автоматизированный пайплайн и четкий контроль. Рассмотрим каждую из сред отдельно:

Деплой сервисов на дев

После пуша в dev ветку репозитория один из раннеров подхватывает код, билдит образ и заливает его в GHCR (GitHub Container Repository).

Теперь нужно обновить сервис в самом кластере. Не смотря на то, что ArgoCD управляет разверткой сервисов и для дева, и для прода, сервисы дев окружения не имеют явного версионирования. Все образы имеют тег :dev и, по сути, не многим отличаются друг от друга.

Для автоматического обновления образа и перезапуска мы используем Keel. После окончания билда раннер дергает вебхук, который обновляет образ на машине и перезапускает сервис. ArgoCD сохраняет у себя ревизию, чтобы в случае чего мы могли откатиться. Все, сервис ушел в тестирование.

Деплой сервисов на прод

Деплой на прод по сути своей преследует такую же логику, как описано выше. Единственными отличиями являются semver версионирование и строгое ревью.

Во время билда раннер использует github-tag-action для получения информации о новой версии по тегу. В конвенции semver принято использовать версионирование формата vX.Y.Z, где соответственно:

  • #major – инкрементирует X версию. Такие изменения критически ломают совместимость, требуют обновления сервисов-зависимостей и грамотного процесса интеграции.

  • #minor – инкрементирует Y версию. Обновления могут вносить новый функционал или менять его, но не ломают обратной совместимости.

  • #patch – отвечает з Z версию. Наиболее частый вид обновлений. Включает в себя фиксы, рефакторинг, тесты и что угодно, что не влияет на общее представление о функционале.

После обновления тега версия инкрементируется, билдится Docker образ с новой верcией и заливается в GHCR. Если все прошло успешно, в GitOps репозитории автоматически обновляется версия образа, которую, раз в 3 минуты, подхватит ArgoCD как изменение и обновит деплоймент. Если при деплое что-то идет не так, версия автоматически откатится и ничего не ляжет.

Last updated