highway to continuous integration — Денис Трифонов, 2ГИС
TRANSCRIPT
api.2gis.ru
— Справочник организаций
— Геоданные
— Карты
— Транспорт (скоро)
— Отзывы (скоро)
3
Справочное API
— Версии 1.3 и 2.0
— 7 приложений + Core на Yii Framework (PHP)
— Функциональные и юниттесты
— Git Flow
— 20 смежных команд
4
Проблемы
— Разработчики коммитят бажный код
— Тестировщики не находят баги или не успевают проверить фичу
5
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
Этапы интеграционной сборки
1. Деплой фичи
2. Выполнение тестов
— Когда все хорошо сливаем фичу в мастер
— Когда чтото упало сообщаем о проблеме
13
Анализ выполнения тестов
— Максимальное время выполнения одного теста 2 минуты
— Среднее время выполнения одного теста 1,5 секунды
— PHPUnit использует одно ядро (из 16) процессора
18
ParaTest
github.com/brianium/paratest
Поддержка параллельного выполнения тестов на PHPUnit.
19
Ищем компромисс
— Долгая интеграция, но стабильный мастер
— Быстрая интеграция, но возможные баги в мастере
22
Исключаем тесты
— Оставляем только приоритетные тесты
— Оставляем только формат JSON (убрали JSONP и XML)
Итого: 1500 тестов
23
Деплой окружения и приложений
— Мелкие правки с помощью Phing (только приложения)
— Большие правки с помощью Chef (приложения + окружение)
26
Лень побеждает
У нас есть автоматизированная сборка, но после нее приходится
самому писать в 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
Регрессия перед релизом
Master Branch -> RC -> Deploy -> Full Tests
-> Merge to Stable -> Mark Issues in JIRA
38
Куда поместить окружение
— Virtual Box
— Open Stack
— Docker
— Другие технологии контейнеризации и виртуализации
44
Понедельник день тяжелый
Вышел новый сотрудник, начал настраивать рабочее окружение и
вылетели ошибки во время разворачивания API.
48
Итого
Выявляем баги не при подготовке релиза, а по мере готовности
фич. Сборки падают, а значит выполняют свои задачи.
52
Результат
— Мы находим проблемы спустя три минуты вместо пяти дней
— Мастер становится стабильным спустя один день вместо пяти
53