53

Процессы разработки в Яндексе

Embed Size (px)

Citation preview

Page 1: Процессы разработки в Яндексе
Page 2: Процессы разработки в Яндексе

Процессы разработки в Яндексе

Андрей Казаринов, разработчик Python Almaty, Алматы, 15.09.2015

Page 3: Процессы разработки в Яндексе

3

Яндекс

Page 4: Процессы разработки в Яндексе

4

Яндекс.Паспорт

〉Общепортальная компонтента

〉Команда >5 человек

〉Высокая нагрузка на чтение (>60К rps)

〉Большое количество интеграций

〉Работа с персональными данными

Page 5: Процессы разработки в Яндексе

5

Цикл backend разработки

Постановка задачи

Разработка

ТестированиеСборка

Деплоймент Непрерывная интеграция

Page 6: Процессы разработки в Яндексе

〉Частые релизы (2-3 раза в неделю) + хотфиксы

〉До 10 одновременных разработчиков проекта

〉Много подпроектов, микросервисов, библиотек, пакетов (>20)

〉Много зависимостей, включая бинарные (>10)

〉Debian-пакеты

6

Условия разработки

Page 7: Процессы разработки в Яндексе

〉Несколько окружений (development, testing, prestable, production)

〉Большое количество серверов (от 3-х до нескольких сотен)

〉Разные платформы Ubuntu (lucid, precise, trusty)

〉Необходимость переживать учения (N-1 датацентр)

7

Условия эксплуатации

Page 8: Процессы разработки в Яндексе

〉N-1 датацентр

〉Плановые – замена сетевого оборудования

〉Внеплановые – бешеный экскаваторщик, котик в подстанции

〉Периодически

8

Учения

Подробнее: Как и для чего Яндекс отключает собственные дата-центры – https://clck.ru/9aWTK

Сервис без downtime и желательно без read-only

Page 9: Процессы разработки в Яндексе

〉Надежность

〉Отказоустойчивость

〉Масштабируемость

9

Принципы

Page 10: Процессы разработки в Яндексе

Разработка

Page 11: Процессы разработки в Яндексе

〉«Собираем всех в одно гнездо» – все разработчики и проекты разрабатываются на одной dev-машине

〉«Virtualenv в каждый дом»

〉«Береги код смолоду» (pep8, flake8, … )

〉«Trust but check»

11

Наши принципы

Page 12: Процессы разработки в Яндексе

〉GitHub Enterprise

〉upstream & forks

〉upstream/master всегда работоспособен

〉force push запрещен в upstream

〉Pull requests (2 ревьюера)

12

Git flow

Page 13: Процессы разработки в Яндексе

〉Микросервисы

〉Frontend + Backend API

〉HTTP/HTTPS, решительное нет CORBA

〉from XML to JSON

〉Infrastructure as a Service (OpenStack)

〉PaaS хостинг приложение (Cocaine)

13

Архитектурные принципы

Page 14: Процессы разработки в Яндексе

〉OpenSource (https://github.com/cocaine)

〉Использует docker-контейнеры

〉Легко масштабируется

〉Легкий деплоймент

〉Есть адаптеры под разные языки, в том числе Python

14

CocaineConfigurable Omnipotent Custom Applications Integrated Network Engine

Подробнее: https://tech.yandex.ru/cocaine/

Page 15: Процессы разработки в Яндексе

Тестирование

Page 16: Процессы разработки в Яндексе

〉Unit-тесты пишутся разработчиками (unittest2, nose, pytest)

〉Code coverage (в среднем 70-80%, >10к тестов в одном из проектов)

〉Моки внешних сервисов

〉Часто запускаются разработчиками

〉Прогоняются при сборке

16

Unit-тесты

Page 17: Процессы разработки в Яндексе

〉Пишутся тестировщиками

〉Автоматизируем там, где это возможно

〉Ansible – тестовые сценарии

〉HTML Elements – тестирование интерфейсов

〉Allure Framework – построение отчетов

〉Запускаются тестировщиками перед релизом

17

Функциональное тестирование

Page 18: Процессы разработки в Яндексе

〉Оценка производительности для расчета количества серверов

〉Сравнение различных технологических решений

〉Выявление скрытых багов, проявляющихся под нагрузкой

〉Периодическая регрессионная проверка производительности

18

Нагрузочное тестирование

Page 19: Процессы разработки в Яндексе

〉Яндекс.Танк

мониторинг ресурсов интерфейс для вывода графиков и управления «стрельбой» модульность различные профили нагрузки поддержка различных протоколов (HTTP/SMTP/POP3/FTP/DNS)

〉«Стрельба» ведется на отдельном нагрузочном стенде

〉«Мишень» –микросервис или отдельный функционал сервиса

〉«Патроны» – подготовленные HTTP запросы

19

Яндекс.Танк

Подробнее: Яндекс.Танк – https://tech.yandex.ru/tank/

Page 20: Процессы разработки в Яндексе

20

Яндекс.Танк

Page 21: Процессы разработки в Яндексе

21

Яндекс.Танк

HTTP и сетевые ошибки

Распределение времен ответа

Page 22: Процессы разработки в Яндексе

〉Ручное тестирование безопасности, Bugs Bounty

〉Чеклист запуска проекта

〉Сканирование уязвимостей – w3af (CSRF, XSS, доступы)

〉Checkmarx/Coverity – статический анализ кода на уязвимости

Server-Side Request Forgery (SSRF) Remote Code Execution (RCE) Insecure Randomness Open redirects и другие

22

Тестирование безопасности

Подробнее: Охота за ошибками – https://yandex.ru/bugbounty/

Page 23: Процессы разработки в Яндексе

Сборка

Page 24: Процессы разработки в Яндексе

〉Pbuilder – изоляция окружения сборки пакета

〉Сборка debian-пакета – распространение кода

〉Cобираем virtualenv и кладем его в debian-пакет – изоляция python-зависимостей

〉Кэшируем Python Wheels – ускорение сборки

〉Python-библиотеки загружаем на внутренний PyPI – переиспользование кода

24

Пакетирование

Page 25: Процессы разработки в Яндексе

25

Пакетирование

pbuilder

debian-пакет

VirtualEnvконфигурации

скрипты запуска〉python-зависимости

〉код проекта

и т.д.

Page 26: Процессы разработки в Яндексе

〉Созданное окружение в pbuilder уничтожается

〉Прокидываем директории для кэша из системы при инициализации образа

.pbuilderrc

BINDMOUNTS=<path to cache>

HOOKDIR=<path to hooks>

26

Хитрости кэширование Python Wheels

Подробнее: Pip install – почему так медленно? https://clck.ru/9ab2b

Page 27: Процессы разработки в Яндексе

27

Внутренний PyPI

〉Localshop

сотни пользователей

сотни пакетов

〉Зеркало «большого» PyPI

Page 28: Процессы разработки в Яндексе

28

Внутренний PyPI

Page 29: Процессы разработки в Яндексе

29

Fabric

〉Альтернатива make

〉Автоматизация шагов сборки

〉Утилиты для разработки

сборка changelog

публикация coverage в GitHub

coverage diff

и т. д.

Page 30: Процессы разработки в Яндексе

Непрерывная интеграция

Page 31: Процессы разработки в Яндексе

〉Каждое изменение должно интегрироваться

〉Тесты

〉Быстрая сборка (<10 минут)

〉Интеграция на выделенной машине

31

Принципы непрерывной интеграции

Page 32: Процессы разработки в Яндексе

〉TeamCity

〉Агенты для проекта и есть общий пул агентов

〉Шаблоны сборок

〉Интеграция с GitHub

〉Conductor – установка пакета на сервера (внутренний продукт)

32

Система непрерывной интеграции

Подробнее: Непрерывная интеграция Python-проектов в Яндексе – https://clck.ru/9aWTZ

Page 33: Процессы разработки в Яндексе

33

TeamCity

Page 34: Процессы разработки в Яндексе

34

Агенты

Page 35: Процессы разработки в Яндексе

35

Шаблоны сборок

Page 36: Процессы разработки в Яндексе

36

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

Page 37: Процессы разработки в Яндексе

37

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

Page 38: Процессы разработки в Яндексе

38

Conductor

Page 39: Процессы разработки в Яндексе

39

Conductor

Page 40: Процессы разработки в Яндексе

40

Conductor

Page 41: Процессы разработки в Яндексе

1. Сборка пакета

1. Создание изолированного окружения

2. Сборка virtualenv с тестовыми утилитами

3. Тестирование с coverage

4. Сборка продакшен virtualenv

2. Публикация результатов coverage в GitHub (в pull request)

3. Загрузка debian-пакета на внутренний debian-репозиторий

4. Загрузка python-пакета на внутренний PyPI (в случае библиотеки) 

5. Тикет в систему деплоймента пакетов (Conductor)

41

Шаги

Page 42: Процессы разработки в Яндексе

42

Публикация результатов coverage в GitHub

Page 43: Процессы разработки в Яндексе

43

Coverage report

Page 44: Процессы разработки в Яндексе

44

Coverage diff

Page 45: Процессы разработки в Яндексе

45

Тикет в систему деплоймента (Conductor)

Page 46: Процессы разработки в Яндексе

Результаты

Page 47: Процессы разработки в Яндексе

〉Выявление багов на раннем этапе – дешевле разработка

〉Частые релизы – ускоренный feedback

〉Аккуратный однотипный код – легче поддерживать

47

Для менеджеров

Page 48: Процессы разработки в Яндексе

〉На одной машине могут стоять пакеты с зависимостями различных версий (virtualenv)

〉Пакет собирается в окружении близком к production (pbuilder)

〉Легко создавать новые сборки (унифицикация сборок, шаблоны)

〉Быстрая сборка пакета (до 10 минут) (кэширования Python Wheels)

48

Для разработчиков

Page 49: Процессы разработки в Яндексе

Надежность vs Скорость разработки

49

Page 50: Процессы разработки в Яндексе

Спасибо за внимание!

Page 51: Процессы разработки в Яндексе

〉Контроль за стилем кода – https://events.yandex.ru/lib/talks/2444/

〉Как и для чего Яндекс отключает собственные дата-центры –  http://habrahabr.ru/company/yandex/blog/243033/

〉Pip install – почему так медленно? https://events.yandex.ru/lib/talks/3070/

〉Непрерывная интеграция Python-проектов в Яндексе –  https://events.yandex.ru/lib/talks/3071/

51

Источники

Page 52: Процессы разработки в Яндексе

〉Cocaine – https://tech.yandex.ru/cocaine/

〉HTML Elements – https://tech.yandex.ru/html-elements/

〉Allure Framework – http://allure.qatools.ru

〉Яндекс.Танк – https://tech.yandex.ru/tank/

〉Checkmarx – https://www.checkmarx.com

〉PyPI localshop – https://pypi.python.org/pypi/localshop

〉TeamCity – https://www.jetbrains.com/teamcity/

〉w3af – https://github.com/andresriancho/w3af/

52

Источники

Page 53: Процессы разработки в Яндексе

Андрей Казаринов

Разработчик

Контакты

[email protected]

Python-вакансии в Яндексе – https://jobs.yandex.ru