highway to continuous integration — Денис Трифонов, 2ГИС

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

Upload: 2-

Post on 16-Jul-2015

444 views

Category:

Technology


2 download

TRANSCRIPT

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

ContinuousIntegration

Интеграционнаясборка ≤ 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

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

—  Virtual Box

—  Open Stack

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

Что дальше?

Continuous Delivery

CI -> Staging -> Load Testing -> Release

57

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

 [email protected]

 dentrifonov.github.io

Спасибо!