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