Как Мы Настроили Ci/Cd, Чтобы Выпускать Часто И Без Опасений

Приветствую, читатель Хабра.

Возможно, тема непрерывной доставки и интеграции микросервисов покажется немного избитой, ведь сегодня любой идальго путем несложных манипуляций с помощью обучающих видеороликов может установить Jenkins/TeamCity/GitLab (нужное подчеркнуть) на свой репозиторий и начать звонить самому испанский дон.

Все дело, на наш взгляд, заключается в этапах сборки, которые он определит для себя сам и какой смысл в них вложит. Не менее важным, чем сама сборка, является процесс автоматизации контроля качества.

В этой статье мы расскажем вам о том, что мы, команда разработчиков всех розничных направлений банка «Открытие», сделали для себя в этом вопросе.

В предыдущем статья мы говорили о том, как мы построили конвейер, который непрерывно доставляет релизы в производственную среду, не опасаясь его поломки.

Одним из факторов, позволяющих нам это сделать, является контроль обратной совместимости посредством управления версиями контракта, который мы описали в разделе статья .

Но этого далеко не достаточно.

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

Давайте рассмотрим конкретный пример.

В момент запуска сборки, например, когда разработчик сделал коммит в свою ветку, запускается процесс, который выполняется специально написанными скриптами и утилитами.

Этот процесс состоит из нескольких обязательных шагов.

Ошибка в любом из них приводит к полному краху всей сборки.

Ну и само собой разумеется, что шаги расположены в таком порядке, чтобы сузить воронку потенциальных проблем.

Если Ворота Качества предыдущего этапа не пройдены, то не придется тратить ресурсы на проверку следующего.

Основные ворота качества, встроенные в наш конвейер:

  1. Сборка сервиса: а.

    Проверка правильности формата конфигурации; б.

    Проверка стандартов проектирования кода; в.

    Проверка необходимого покрытия Unit-тестами; д. Генерация и публикация контрактов (контроль обратной совместимости).

  2. Запуск бета-тестов.

  3. Обязательный код-ревью.

  4. Сканирование уязвимостей.

Проверка правильности формата конфигурации.

Существует универсальный формат конфигурации для всех сервисов.

Чтобы унифицировать этот процесс, мы даже написали свой инструмент. Из универсального стандартизированного YAML-файла нашего конфига он генерирует другие конфиги в различных форматах, понятных утилитам и скриптам, участвующим в дальнейших процессах.

Если у вас нет правильного конфига, дальше ничего смотреть не придется.

Проверка стандартов кодирования Наши разработчики — грамматические нацисты в своих языках.

Мы не будем вам рассказывать, что такое codestyle. Скажем так, с ростом числа участников проекта, имеющих доступ к кодовой базе, требования по унификации кода набирают все больший вес.

Проверка необходимого покрытия с помощью Unit-тестов Проверка исполнения тестами осуществляется в два этапа:

  1. Проверяется наличие Unit-тестов и их успешное выполнение.

  2. Использование утилиты покрывало проверяется, что услуга имеет необходимый процент покрытия.

    Сейчас мы работаем над тем, чтобы охват был не менее 80%.

Создание и публикация контрактов (контроль обратной совместимости) На этом этапе запускается:
  • Формирование и публикация договоров на наш сервис, при необходимости.

    Механизм описан здесь , в разделе «Публикация договоров»;

  • Создание докер-образов;
  • Генерация с помощью специальной утилиты параметров в виде диаграммы Хелма.

Запуск бета-тестов Одним из основных этапов является запуск Бета-тестирования, об этом мы поговорим чуть подробнее.

Полный запуск всех бета-тестов любого коммита потребует всех наших ресурсов и будет слишком дорогим.

Поэтому мы явно определяем, какие бета-тесты необходимо запустить для конкретного сервиса, через Зависимости И Триггеры В TeamCity .

Такие зависимости задаются вручную во время разработки самих бета-тестов.

Для этой цели можно использовать вспомогательные инструменты автоматического картографирования.



Как мы настроили CI/CD, чтобы выпускать часто и без опасений

и выглядят они примерно так:

Как мы настроили CI/CD, чтобы выпускать часто и без опасений

На этом этапе в дело вступает специальная внутренняя утилита.

SRV-Развертывание , заслуживающий отдельной статьи.

С помощью этой утилиты мы разворачиваем стенды для Бета-тестирования различной конфигурации в зависимости от разрабатываемой задачи.

На данный момент одна из его возможностей — пересылать статусы сборок о завершении бета-тестов в Битбакет к конкретному коммиту (pull-request).

Использование стандартного функционала Битбакет Мы можем создать правило для любого проекта для запросов на включение, которое не будет разрешать объединение до тех пор, пока не будут пройдены все бета-тесты.



Как мы настроили CI/CD, чтобы выпускать часто и без опасений

Как вы можете видеть на изображении выше, кнопка «Объединить» неактивна до тех пор, пока не будут выполнены все требования PR, включая зеленые бета-тесты.

Обязательная проверка кода Очевидно, у нас есть запросы на проверку кода.

Использование стандартного функционала Битбакет За каждым сервисом закреплена группа владельцев.

Обязательно, чтобы PR просмотрело хотя бы определенное количество разработчиков, среди которых должен быть кто-то из группы владельцев кода.

Разработчикам помогают результаты различных популярных статических анализаторов, которые вы наверняка знаете (мы не будем их здесь афишировать).

Текущий этап протекает параллельно с предыдущим.

Строго говоря, это не автоматический, а ручной процесс.

Но конвейер настроен таким образом, что код не выйдет без успешного прохождения этого этапа.

Сканирование уязвимостей Последний обязательный этап — окончательное сканирование артефактов, которые доставляются в производственную среду специальными сканерами безопасности.

Если угроз и уязвимостей не выявлено, артефакт сборки считается готовым к доставке, которую выполняет специальная роль Release-manager. Это наш конвейер.

Этот процесс постоянно совершенствовался и менялся на протяжении нескольких лет и все еще находится в активной фазе разработки.

Многие скрипты и некоторые вспомогательные утилиты пришлось писать самостоятельно.

Мы надеемся, что наша история окажется кому-то полезной и поможет им создать и улучшить процессы доставки.

Чтобы тема была доступна максимально широкой аудитории, основные шаги намеренно описаны без глубокого погружения в технику.

Запросы технических подробностей оставляйте в комментариях.

Теги: #DevOps #Микросервисы #Тестирование ИТ-систем #ci/cd #Quality Gates

Вместе с данным постом часто просматривают: