Highway to Сontinuous Integration, Денис Трифонов (2GIS)

57
Highway to Continuous Integration Денис Трифонов

description

Доклад Дениса Трифонова на HighLoad++ 2014.

Transcript of Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Page 1: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Highway toContinuous Integration

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

Page 2: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Обо мне

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

2

Page 3: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

api.2gis.ru

—  Справочник организаций

—  Геоданные

—  Карты

—  Транспорт (скоро)

3

Page 4: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Справочное API

—  Версии 1.3 и 2.0

—  7 приложений + Core на Yii Framework (PHP)

—  Функциональные и юнит­тесты

—  Git Flow

—  20 смежных команд

4

Page 5: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Проблемы

—  Разработчики коммитят бажный код

—  Тестировщики не находят баги или не успевают проверить фичу

5

Page 6: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Последствия

—  Узнаем о багах при подготовке к релизу

—  Релиз затягивается или переносится

6

Page 7: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

а не при подготовке к релизу“

Page 8: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

Page 9: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Continuous Integration —

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

этапе программирования фичи

9

Page 10: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Continuous

Integration

Page 11: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Интеграционная

сборка≤ 5 min

Page 12: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Что у нас есть

—  Ветка с новой фичей

—  Тесты

—  Система деплоя

12

Page 13: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

1. Деплой фичи

2. Выполнение тестов

—  Когда все хорошо, сливаем фичу в мастер

—  Когда что­то упало, сообщаем о проблеме

13

Page 14: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

6 часов

Page 15: Highway to Сontinuous Integration, Денис Трифонов (2GIS)
Page 16: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

—  Деплой за 3 минуты

—  Тесты за 5 часов 57 минут

16

Page 17: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

12 000 тестов

Page 18: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

—  Максимальное время выполнения одного теста 2 минуты

—  Среднее время выполнения одного теста 1,5 секунды

—  PHPUnit использует одно ядро (из 16) процессора

18

Page 19: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

ParaTest

github.com/brianium/paratest

Поддержка параллельного выполнения тестов на PHPUnit

19

Page 20: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Пример

$ paratest -p 16 --phpunit ./phpunit \

-c ./phpunit.xml ./tests

20

Page 21: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

50 минут

Page 22: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

—  Долгая интеграция, но стабильный мастер

—  Быстрая интеграция, но возможные баги в мастере

22

Page 23: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

—  Оставляем только приоритетные тесты

—  Оставляем только формат JSON (убрали JSONP и XML)

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

23

Page 24: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

5 минут

Page 25: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Еще быстрее?

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

только приложения

25

Page 26: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

—  Мелкие правки с помощью Phing (только приложения)

—  Большие правки с помощью Chef (приложения + окружение)

26

Page 27: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

3 минуты

Page 28: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

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

самому писать в JIRA о смене статуса фичи

28

Page 29: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

—  Комментарий в тикете об автоматическом мерже веток

—  Метка у тикета при попадании в мастер

29

Page 30: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

JIRA REST API Client

github.com/chobie/jira­api­restclient

API­клиент для JIRA на PHP

30

Page 31: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Пример (PHP)

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

$client->editIssue($jiraIssue, [

'fields' => ['labels' => $labels]

]);

31

Page 32: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

Feature Branch -> Deploy -> Priority Tests

-> Merge to Master -> Mark Issue in JIRA

32

Page 33: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Профит

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

слить ее в мастер

33

Page 34: Highway to Сontinuous Integration, Денис Трифонов (2GIS)
Page 35: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Но...

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

35

Page 36: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

Master Branch -> Deploy -> Full Tests

36

Page 37: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

Page 38: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

Master Branch -> RC -> Deploy -> Full Tests

-> Merge to Stable -> Mark Issues in JIRA

38

Page 39: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Профит

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

39

Page 40: Highway to Сontinuous Integration, Денис Трифонов (2GIS)
Page 41: Highway to Сontinuous Integration, Денис Трифонов (2GIS)
Page 42: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Как так?!

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

42

Page 43: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Задача

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

состояние окружения

43

Page 44: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

—  Open Stack

—  Virtual Box

—  Docker

—  Другие технологии контейнеризации и виртуализации

44

Page 45: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

—  API­нода

—  Нода с тестами

—  Любая нода по требованию за 1 минуту

45

Page 46: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

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

46

Page 47: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Профит

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

47

Page 48: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

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

вылетели ошибки во время разворачивания API

48

Page 49: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

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

49

Page 50: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Профит

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

ошибок

50

Page 51: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Итого

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

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

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

51

Page 52: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Итого

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

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

52

Page 53: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Результат

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

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

53

Page 54: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Вывод

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

программирования фичи

54

Page 55: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

Continuous Integration —разработка без скоростных

ограничений

Page 56: Highway to Сontinuous Integration, Денис Трифонов (2GIS)
Page 57: Highway to Сontinuous Integration, Денис Трифонов (2GIS)

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

[email protected]

dentrifonov.github.io

Спасибо!