Чем занимается команда:
- Разработка слоя кастомизации якорного продукта компании для основного клиента
- Разработка автотестов (python, robot framework): интеграционное тестирование внутри продукта, что важно, на окружении, приближенном к прому клиента
- Ручное комплексное тестирование новых фич перед отгрузкой (часть из них далее автоматизируется)
- Внутренняя автоматизация, нацеленная в конечном итоге на создание и поддержание CDP для продукта (jenkins pipelines, groovy, python, ansible, docker, openstack, etc)
Большинство инженеров в команде прошли школу техподдержки/внедрения (погружены в соответствующий контекст), но в то же время имеют квалификацию программистов (образование, опыт работы).
Команда изначально организовывалась в структуре Delivery, затем некоторое время была в RnD, а сейчас мы находимся в Дирекции по бизнес-системам. У нас есть реальный опыт работы практически во всех подразделениях, участвующих в цепочке создания ценности; есть понимание внутренних процессов и контекста работы каждого подразделения, есть тесные неформальные связи, то есть все, что так необходимо для формирования DevOps-мышления.
Мы до сих пор тесно интегрированы с RnD, участвуем в планировании работ над версиями, во внутренних митингах.
Точно так же мы интегрированы и в Отдел по внедрению и эксплуатации.
Какие мы используем DevOps-практики
Первое, что было сделано после создания команды - организованы совместные периодические митинги с участием представителей всех команд, задействованных в цепочке.
Это очень важный шаг для того самого стирания барьеров и размытия границ контекста - многие вопросы сразу стали решаться быстрее и проще, даже безо всякой автоматизации ))
Мы так же участвуем во внутренних чатах (корпоративные мессенджеры, телеграм) как команд разработки, так и команды внедрения.
Стараемся организовывать и поддерживать процесс передачи знаний, один из примеров: по новым фичам есть хороший артефакт передачи знаний - карточка внедрения (КВ). По процессу КВ заполняется на этапе комплексного тестирования (КТ). Но, например, когда мы в ходе реализации/прогонов внутренних автотестов находим какие-то неявные нюансы работы или настройки новой функциональности - обязательно отмечаем это в карточках внедрения. Не потому, что это требуется по инструкциям, а потому, что понимаем контекст работы смежных подразделений. Потому, что эта КВ - по сути является частью CDP, то есть прямой зоной интересов DevOps
Огромное внимание уделяем качеству (напомню, это важная часть DevOps)
Ранее процесс доставки версии включал в себя два этапа тестирования (с оговорками, конечно), условно их можно назвать так:
- тестирование внутри производства (понятно, что в производстве тестирование тоже не монолитное, но мы здесь рассматриваем процесс в целом)
- end-to-end / системное / UAT тестирование на, условно, предпроме, этап называется Quality Gate, QG.
Если вернуться к рисунку чуть выше, видно, что отсутствовали промежуточные этапы тестирования, в результате чего в самой "дорогой" (в смысле стоимости разработки и поддержки) части пирамиды тестирования реализовывалось множество тестов по внутренней функциональности продуктов.
Это совершенно неэффективно, поэтому мы заполнили этот пробел - организовали отдельный этап тестирования (назвали Internal Quality Gate, InQG).
Концепция этого этапа - функциональное и интеграционное тестирование внутри контура продукта, находящегося в зоне ответственности команды (а это самый большой продукт в компании, состоит из нескольких десятков компонент), причем это тестирование проводится на окружении, максимально приближенном к прому.
Важно: при этом, в отличие от "большого" Quality Gate (который проходит на предпромах), автотесты InQG включают в себя не только регресс, но и тесты по новой функциональности.
Важно: разработка и поддержка автотестов InQG значительно дешевле, чем end-to-end тестов, и этим этапом мы снизили нагрузку на разработку и поддержку той части автотестов, которые идеологически НЕ должны попадать в верхнюю часть пирамиды тестирования, но ранее попадали;
Важно: на этапе InQG используются не дорогие и дефицитные копии прома, а дешевые виртуалки из cloud. Для тестов автоматически разворачивается стенд из двух виртуалок, который можно назвать "мини-копией" прома: в нем есть необходимые нам базы, минимально необходимый набор окружения (rabbit, kafka, zookeeper, nginx, мониторинг и т.п.) и, собственно, разворачивается сам продукт. Этот стенд полностью автоматизированно разворачивается за 15-20 минут (по нажатию одной кнопки);
Очень важно: тесты InQG, в отличие от "большого" QG, прогоняются не перед отгрузкой версии, а ежедневно. Таким образом мы удешевляем поиск и исправление ошибок: гораздо проще найти ошибку не во всем скоупе работ версии, а в дневном инкременте кода;
Важно: тесты InQG работают полностью автоматизированно (кроме разбора ошибок, конечно). По сути, реализована часть CDP: после сборки любой промежуточной версии продукта, параллельно с внутренним тестирование RnD автоматически стартует и этап InQG, где проверяется и деплой, и функциональность тестами InQG.
Важно: по окончании прогона результат отправляется в виде отчета в специальный канал корпоративного мессенджера Mattermost, при этом организовано дежурство: каждую неделю есть Robocop - сотрудник, ответственный за анализ результатов прогонов.
Важно: у нас нет понятия "приемлемый процент прохождения". Если в графе Failed любое число больше 0 - это сигнал к разбору полетов. По всем Failed тестам должны быть заведены соответствующие тикеты (пока баг не закрыт, тест автоматически помечается специальным статусом).
Важно: на этапе InQG тесты прогоняются как с выключенными рычагами (включающими новую функциональность), так и с включенными. Для этого реализована отдельная часть pipeline, с отдельным стендом, на котором включаются рычаги (тоже автоматизированно) и делается прогон тестов, зависящих от этих рычагов.
Подход к разработке
Как говорилось выше, команда отвечает за разработку слоя кастомизации (оформлен как отдельный продукт). Продукт задействован в большом количестве работ. По этим работам мы принимаем участие начиная с этапа аналитики. И за счет опыта техподдержки и знания контекста эксплуатации, мы еще на этом этапе часто подмечаем важные нюансы, которые могли быть упущены "штатными" аналитиками (упускаются обычно негативные сценарии, которые в эксплуатации возникают на самом деле достаточно часто).
Занимаем проактивную позицию по анализу тикетов: стараемся реагировать на них максимально оперативно с момента появления, а не с момента перевода в на наше подразделение. Часто даже реализация патча уже готова до официальной передачи тикета нам. Конечно, мы не одни такие, этот подход используют многие команды в компании, и это здорово! Это в чистом виде DevOps-подход.
Еще пример DevOps-подхода - разработка инсталлятора продукта. Мы прекрасно понимали, что для внедрения/эксплуатации клиента нет отдельных продуктов "ядро" и "слой кастомизации", а есть один продукт, кастомизированный для него. И, соответственно, устанавливаться этот продукт должен за один шаг. При этом нам не чужды и best practices проектирования и разработки, поэтому в итоге инсталлятор ядра был спроектирован и реализован так, что
любой слой кастомизации (для любого клиента) устанавливается одновременно с ядром (для этого в inventory для деплоя нужно указать, какой тэйлоред ставить, если он нужен). Таким образом, мы и учли реалии внедрения/эксплуатации, и исключили дублирование кода.
Прозрачность работы команды
Еще один важный аспект DevOps - это прозрачность работы команд.
Для прозрачности своей работы мы создали дашборд в Jira с использованием плагина Sructure, который делает работу команды абсолютно прозрачной.
На одном дашборде можно посмотреть все работы по квантам, статус каждого эпика/таска, привязанные баги, которые были найдены при разработке каждого автотеста и т.п.