Highway to Сontinuous Integration, Денис Трифонов (2GIS)
description
Transcript of Highway to Сontinuous Integration, Денис Трифонов (2GIS)
Highway toContinuous Integration
Денис Трифонов
Обо мне
Инженер по качеству в команде Continuous Delivery
2
Справочное API
— Версии 1.3 и 2.0
— 7 приложений + Core на Yii Framework (PHP)
— Функциональные и юниттесты
— Git Flow
— 20 смежных команд
4
Проблемы
— Разработчики коммитят бажный код
— Тестировщики не находят баги или не успевают проверить фичу
5
Последствия
— Узнаем о багах при подготовке к релизу
— Релиз затягивается или переносится
6
„Мы хотим выявлять багипо мере готовности фич,
а не при подготовке к релизу“
Continuous Integration is a software development practice where
members of a team integrate their work frequently, usually each
person integrates at least daily leading to multiple integrations per
day. Each integration is verified by an automated build (including test)
to detect integration errors as quickly as possible.
Martin Fowler
“8
Continuous Integration —
не решит всех проблем разработки, но позволит выявлять баги на
этапе программирования фичи
9
Continuous
Integration
Интеграционная
сборка≤ 5 min
Что у нас есть
— Ветка с новой фичей
— Тесты
— Система деплоя
12
Этапы интеграционной сборки
1. Деплой фичи
2. Выполнение тестов
— Когда все хорошо, сливаем фичу в мастер
— Когда чтото упало, сообщаем о проблеме
13
6 часов
Время этапов сборки
— Деплой за 3 минуты
— Тесты за 5 часов 57 минут
16
12 000 тестов
Анализ выполнения тестов
— Максимальное время выполнения одного теста 2 минуты
— Среднее время выполнения одного теста 1,5 секунды
— PHPUnit использует одно ядро (из 16) процессора
18
ParaTest
github.com/brianium/paratest
Поддержка параллельного выполнения тестов на PHPUnit
19
Пример
$ paratest -p 16 --phpunit ./phpunit \
-c ./phpunit.xml ./tests
20
50 минут
Ищем компромисс
— Долгая интеграция, но стабильный мастер
— Быстрая интеграция, но возможные баги в мастере
22
Исключаем тесты
— Оставляем только приоритетные тесты
— Оставляем только формат JSON (убрали JSONP и XML)
Итого: 1500 тестов
23
5 минут
Еще быстрее?
Если не было изменений в окружении, то достаточно обновить
только приложения
25
Деплой окружения и приложений
— Мелкие правки с помощью Phing (только приложения)
— Большие правки с помощью Chef (приложения + окружение)
26
3 минуты
Лень побеждает
У нас есть автоматизированная сборка, но после нее приходится
самому писать в JIRA о смене статуса фичи
28
Интеграция с JIRA
— Комментарий в тикете об автоматическом мерже веток
— Метка у тикета при попадании в мастер
29
JIRA REST API Client
github.com/chobie/jiraapirestclient
APIклиент для JIRA на PHP
30
Пример (PHP)
$client->addComment($jiraIssue, $jiraComment);
$client->editIssue($jiraIssue, [
'fields' => ['labels' => $labels]
]);
31
Интеграционная сборка в работе
Feature Branch -> Deploy -> Priority Tests
-> Merge to Master -> Mark Issue in JIRA
32
Профит
Разработчик спустя три минуты после готовности фичи может
слить ее в мастер
33
Но...
Мы все также неуверенны в мастере
35
Регрессионная сборка
Master Branch -> Deploy -> Full Tests
36
Запускаем регрессионную сборкудва раза в день
Регрессия перед релизом
Master Branch -> RC -> Deploy -> Full Tests
-> Merge to Stable -> Mark Issues in JIRA
38
Профит
Мастер становится стабильным спустя половину дня вместо пяти
39
Как так?!
Упала миграция на бою, хотя регрессия прошла успешно
42
Задача
Перед регрессией нужно полностью восстанавливать исходное
состояние окружения
43
Куда поместить окружение
— Open Stack
— Virtual Box
— Docker
— Другие технологии контейнеризации и виртуализации
44
Архитектура в Open Stack
— APIнода
— Нода с тестами
— Любая нода по требованию за 1 минуту
45
Обновленная регрессия
... -> Revert VM -> Deploy -> ... -> Update Snapshot
46
Профит
Во время регрессии деплоим так же, как на бою
47
Понедельник день тяжелый
Вышел новый сотрудник, начал настраивать рабочее окружение и
вылетели ошибки во время разворачивания API
48
Сборка деплоя с нуля
VM Up -> Deploy -> Import Data -> Tests -> VM Destroy
49
Профит
Мы уверены, что в любое время можем развернуть API без
ошибок
50
Итого
1. Интеграционная сборка
2. Регрессионная сборка
3. Сборка деплоя с нуля
51
Итого
Выявляем баги не при подготовке релиза, а по мере готовности
фич. Сборки падают, а значит выполняют свои задачи.
52
Результат
— Мы находим проблемы спустя три минуты вместо пяти дней
— Мастер становится стабильным спустя половину дня вместо пяти
53
Вывод
Continuous Integration помогает выявлять баги на этапе
программирования фичи
54
Continuous Integration —разработка без скоростных
ограничений