Highway to Continuous Integration

Denis Trifonov, 2GIS

Highway to
Continuous Integration

Денис Трифонов

Highway Icon
2GIS Logo

Обо мне

Инженер по качеству в команде Continuous Delivery

api.2gis.ru

Справочное API

Проблемы

Последствия

„Мы хотим выявлять баги
по мере готовности фич,
а не при подготовке к релизу“

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

Continuous Integration —

не решит всех проблем разработки, но позволит выявлять баги на этапе программирования фичи

Continuous
Integration

Интеграционная
сборка

5 min

Что у нас есть

Этапы интеграционной сборки

  1. Деплой фичи
  2. Выполнение тестов
    • Когда все хорошо, сливаем фичу в мастер
    • Когда что-то упало, сообщаем о проблеме

6 часов

Zvezdets

Время этапов сборки

12 000 тестов

Анализ выполнения тестов

ParaTest

github.com/brianium/paratest
Поддержка параллельного выполнения тестов на PHPUnit

Пример

			$ paratest -p 16 --phpunit ./phpunit \
  -c ./phpunit.xml ./tests
		

50 минут

Ищем компромисс

Исключаем тесты

Итого: 1500 тестов

5 минут

Еще быстрее?

Если не было изменений в окружении, то достаточно обновить только приложения

Деплой окружения и приложений

3 минуты

Лень побеждает

У нас есть автоматизированная сборка, но после нее приходится самому писать в JIRA о смене статуса фичи

Интеграция с JIRA

JIRA REST API Client

github.com/chobie/jira-api-restclient
API-клиент для JIRA на PHP

Пример (PHP)

			$client->addComment($jiraIssue, $jiraComment);

$client->editIssue($jiraIssue, [
  'fields' => ['labels' => $labels]
]);
		

Интеграционная сборка в работе

			Feature Branch -> Deploy -> Priority Tests
  -> Merge to Master -> Mark Issue in JIRA
		

Профит

Разработчик спустя три минуты после готовности фичи может слить ее в мастер

Limit 40

Но...

Мы все также неуверенны в мастере

Регрессионная сборка

			Master Branch -> Deploy -> Full Tests
		

Запускаем регрессионную сборку два раза в день

Регрессия перед релизом

			Master Branch -> RC -> Deploy -> Full Tests
  -> Merge to Stable -> Mark Issues in JIRA
		

Профит

Мастер становится стабильным спустя половину дня вместо пяти

Limit 40
Fun Live

Как так?!

Упала миграция на бою, хотя регрессия прошла успешно

Задача

Перед регрессией нужно полностью восстанавливать исходное состояние окружения

Куда поместить окружение

Архитектура в Open Stack

Обновленная регрессия

			... -> Revert VM -> Deploy -> ... -> Update Snapshot
		

Профит

Во время регрессии деплоим так же, как на бою

Понедельник день тяжелый

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

Сборка деплоя с нуля

			VM Up -> Deploy -> Import Data -> Tests -> VM Destroy
		

Профит

Мы уверены, что в любое время можем развернуть API без ошибок

Итого

  1. Интеграционная сборка
  2. Регрессионная сборка
  3. Сборка деплоя с нуля

Итого

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

Результат

Вывод

Continuous Integration помогает выявлять баги на этапе программирования фичи

Continuous Integration —
разработка без скоростных ограничений

The End

Денис Трифонов

de.trifonov@2gis.ru
dentrifonov.github.io

Спасибо!

2GIS Logo