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

Post on 21-Jun-2015

494 views 6 download

Tags:

description

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

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

Highway toContinuous Integration

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

Обо мне

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

2

api.2gis.ru

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

—  Геоданные

—  Карты

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

3

Справочное 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/jira­api­restclient

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 —разработка без скоростных

ограничений

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

de.trifonov@2gis.ru

dentrifonov.github.io

Спасибо!