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

Preview:

Citation preview

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

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

3

Яндекс

4

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

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

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

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

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

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

5

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

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

Разработка

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

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

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

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

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

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

〉Debian-пакеты

6

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

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

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

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

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

7

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

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

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

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

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

8

Учения

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

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

〉Надежность

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

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

9

Принципы

Разработка

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

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

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

〉«Trust but check»

11

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

〉GitHub Enterprise

〉upstream & forks

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

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

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

12

Git flow

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

〉Frontend + Backend API

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

〉from XML to JSON

〉Infrastructure as a Service (OpenStack)

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

13

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

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

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

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

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

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

14

CocaineConfigurable Omnipotent Custom Applications Integrated Network Engine

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

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

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

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

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

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

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

16

Unit-тесты

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

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

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

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

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

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

17

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

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

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

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

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

18

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

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

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

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

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

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

19

Яндекс.Танк

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

20

Яндекс.Танк

21

Яндекс.Танк

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

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

〉Ручное тестирование безопасности, 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/

Сборка

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

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

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

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

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

24

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

25

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

pbuilder

debian-пакет

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

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

〉код проекта

и т.д.

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

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

.pbuilderrc

BINDMOUNTS=<path to cache>

HOOKDIR=<path to hooks>

26

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

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

27

Внутренний PyPI

〉Localshop

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

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

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

28

Внутренний PyPI

29

Fabric

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

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

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

сборка changelog

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

coverage diff

и т. д.

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

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

〉Тесты

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

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

31

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

〉TeamCity

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

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

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

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

32

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

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

33

TeamCity

34

Агенты

35

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

36

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

37

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

38

Conductor

39

Conductor

40

Conductor

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

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

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

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

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

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

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

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

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

41

Шаги

42

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

43

Coverage report

44

Coverage diff

45

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

Результаты

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

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

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

47

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

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

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

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

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

48

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

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

49

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

〉Контроль за стилем кода – 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

Источники

〉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

Источники

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

Разработчик

Контакты

andrey.kazarinovairjordan@yandex-team.ru

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