Автоматизация тестовойинфраструктуры
Антон Галицын, 2GIS
1 / 100
О себе
Разработчик в отделе Infrastruсture &
Operations
Работал в команде OpenStack
Занимаюсь автоматизацией деплойментапроектов 2ГИСа
2 / 100
У нас есть приложение!
3 / 100
Приложение
C, gcc 4.9.3, Linux 4.2
$ ./codefest
Codefest is IT conference!
4 / 100
Где будем тестировать?
5 / 100
Локально
➕
Просто
А зачем что-то еще?
7 / 100
А что с Windows и OS X?
8 / 100
Локально
➖
Разные операционные системы
9 / 100
OK, Linux!
10 / 100
Упс...
Some packages could not be installed.
codefest: Depends: libstdc++6 (>= 5.2) but 4.9.2-10 is to be installed
E: Unable to correct problems.
11 / 100
Локально
➖
Разные операционные системы
Проблемы с зависимостями
12 / 100
Локально
13 / 100
Локально, с изоляцией
14 / 100
Локально, с изоляцией
VirtualBox
KVM
LXC
Docker
15 / 100
Где будем тестировать?
Шаг 1 - создать окружение
16 / 100
Любое окружение надо конфигурировать
17 / 100
Конфигурация
Documentation-driven
Scripts (bash, python, perl)
Configuration management (chef, ansible, puppet)
18 / 100
Где будем тестировать?
Шаг 1 - создать окружение
Шаг 2 - настроить окружение
19 / 100
Тестируем!
✔ Шаг 1 - создать окружение
✔ Шаг 2 - настроить окружение
Прогоняем тесты, смотрим результаты
20 / 100
Автотесты показывают разныерезультаты!
21 / 100
Достоверные результаты автотестов
22 / 100
Достоверные результаты автотестов
Результат автотестов повторяем
23 / 100
Достоверные результаты автотестов
Результат автотестов повторяем
Автотесты находят баги
24 / 100
Проблемы
25 / 100
Проблемы
Окружений > 1
26 / 100
Проблемы
Окружений > 1
Неоднородная инфраструктура
27 / 100
Проблемы
Окружений > 1
Неоднородная инфраструктура
Автотесты оставляют артефакты (tmp файлы,cache, неконсистентная база)
28 / 100
Решение
Список окружений
30 / 100
Решение
Список окружений
Конфигурация в коде
31 / 100
Решение
Список окружений
Конфигурация в коде
Инфраструктура по требованию
32 / 100
Решение
Список окружений
Конфигурация в коде
Инфраструктура по требованию
"Чистые" автотесты
33 / 100
Решение
Список окружений
Конфигурация в коде
Инфраструктура по требованию
"Чистые" автотесты
34 / 100
Универсальный инструмент
✔ Шаг 1 - vagrant provider (Vbox, LXC, Docker,
Digital Ocean)
✔ Шаг 2 - vagrant provisioner (shell, chef, ansible,
puppet)
$ vagrant up
35 / 100
Что у нас есть?
✔ Список окружений
✔ Конфигурация в коде
✔ Инфраструктура по требованию
36 / 100
Переписываем приложение!
37 / 100
Better Web
39 / 100
Service-oriented
40 / 100
Microservices
41 / 100
Где будем тестировать?
42 / 100
Удаленно
43 / 100
Варианты
44 / 100
Варианты
Публичное облако (AWS, Digital Ocean,
Rackspace)
45 / 100
Варианты
Публичное облако (AWS, Digital Ocean,Rackspace)
Приватное облако (VMware, HP)
46 / 100
Варианты
Публичное облако (AWS, Digital Ocean,Rackspace)
Приватное облако (VMware, HP)
Приватное облако open-source (ApacheCloudstack, OpenStack)
47 / 100
Я просто хотел запустить тесты!
48 / 100
2ГИС
Cправочник и карты
Web, Mobile, Desktop
35 команд
50 / 100
Команды
Разные языки
Интеграции
51 / 100
Потребности команд
Автоматизированное тестирование
Достоверные результаты
52 / 100
Итог
35 команд
Интеграции
Автоматизированное тестирование
53 / 100
Где будем тестировать?
54 / 100
Что у нас есть?
✔ Свое железо
55 / 100
Что у нас есть?
✔ Свое железо
✔ Системные администраторы
56 / 100
Что у нас есть?
✔ Свое железо
✔ Системные администраторы
✔ Опыт в виртуализации
57 / 100
Инфраструктура компании не готова
58 / 100
Проблемы инфраструктуры
Конец 2013 года - Proxmox Virtual Environment
59 / 100
Проблемы инфраструктуры
Конец 2013 года - Proxmox Virtual Environment
Создание виртуалок вручную по тикету
60 / 100
Проблемы инфраструктуры
Конец 2013 года - Proxmox Virtual Environment
Создание виртуалок вручную по тикету
Нет разделения по проектам
61 / 100
Проблемы инфраструктуры
Конец 2013 года - Proxmox Virtual Environment
Создание виртуалок вручную по тикету
Нет разделения по проектам
Слабый API, платные плагины
62 / 100
Пора что-то менять!
63 / 100
Требования к решению
64 / 100
Требования к решению
Эффективная утилизация железа
65 / 100
Требования к решению
Эффективная утилизация железа
Командные ресурсы
66 / 100
Требования к решению
Эффективная утилизация железа
Командные ресурсы
Модульность
67 / 100
Требования к решению
Эффективная утилизация железа
Командные ресурсы
Модульность
Легко дорабатывать
68 / 100
Требования к решению
Эффективная утилизация железа
Командные ресурсы
Модульность
Легко дорабатывать
API
69 / 100
Требования к решению
Эффективная утилизация железа
Командные ресурсы
Модульность
Легко дорабатывать
API
Изоляция70 / 100
Варианты
Публичное облако (AWS, Digital Ocean,Rackspace)
Приватное облако (VMware, HP)
✔ Приватное облако open-source (ApacheCloudstack, OpenStack)
71 / 100
Что такое OpenStack?
OpenStack - набор сервисов для построенияпубличного или приватного облака.
73 / 100
OpenStack - open software
Релиз раз в полгода status.openstack.org
Базовые компоненты github.com/openstack
Инкубатор github.com/stackforge
Конференции, встречи, Q&A, mail-lists
openstack.org/community
74 / 100
Контрибьюторы OpenStack
openstack.org/foundation/companies
Red Hat
Rackspace
IBM
Intel
Cisco75 / 100
Решение проблем инфраструктуры
76 / 100
Решение проблем инфраструктуры
✔ Эффективная утилизация железа
77 / 100
Решение проблем инфраструктуры
✔ Эффективная утилизация железа
✔ Командные ресурсы
78 / 100
Решение проблем инфраструктуры
✔ Эффективная утилизация железа
✔ Командные ресурсы
✔ Модульность
79 / 100
Решение проблем инфраструктуры
✔ Эффективная утилизация железа
✔ Командные ресурсы
✔ Модульность
✔ Легко дорабатывать
80 / 100
Решение проблем инфраструктуры
✔ Эффективная утилизация железа
✔ Командные ресурсы
✔ Модульность
✔ Легко дорабатывать
✔ API
81 / 100
Решение проблем инфраструктуры
✔ Эффективная утилизация железа
✔ Командные ресурсы
✔ Модульность
✔ Легко дорабатывать
✔ API
✔ Изоляция82 / 100
Инфраструктура по требованию
83 / 100
Инфраструктура по требованию
Создание стеков из шаблонов
server:
depends_on: [ ip_adress, dns_record ]
type: OS::Nova::Server
properties:
name: { get_param: name }
flavor: { get_param: flavor }
image: { get_param: image }
key_name: { get_param: key_name }
84 / 100
Инфраструктура по требованию
Создание стеков из шаблонов
$ heat stack-create API -f api.yml \ -P key_name="id_rsa" \ -P name=api-all-in-one \ -P flavor=medium \ -P image="ubuntu-14.04-x64"
85 / 100
Это было начало
86 / 100
Развитие автоматизации
87 / 100
Continuous integration
88 / 100
github.com/2gis/vmmaster
89 / 100
Нагрузочное тестирование
90 / 100
github.com/2gis/badger
91 / 100
github.com/2gis/badger-api
92 / 100
И мы будем писать еще!
93 / 100
Выводы
Используйте однородные окружения
95 / 100
Выводы
Используйте однородные окружения
Храните конфигурации в коде
96 / 100
Выводы
Используйте однородные окружения
Храните конфигурации в коде
Используйте "чистую" инфраструктуру потребованию
97 / 100
Собирайте достоверные результаты!
98 / 100
Спасибо!
Антон Галицын
[email protected]
github.com/agalitsyn
99 / 100
Нераскрытые темы про OpenStack
Эксплуатация
Деплой
Апгрейд
Тестирование
Разработка плагинов
Расследование инцидентов100 / 100