Непрерывная интеграция python-проектов в Яндексе
TRANSCRIPT
![Page 1: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/1.jpg)
![Page 2: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/2.jpg)
Непрерывная интеграция Python-проектов в Яндексе
Андрей Казаринов, разработчик Python Party, Москва, 02.09.2015
![Page 3: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/3.jpg)
〉Большое количество времени уходит на поддержание процесса разработки (тестирование, сборка релиза, выкладка)
〉Чем позже найден баг, тем он дороже
3
Проблема
Решение – автоматизация
![Page 4: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/4.jpg)
〉Частые релизы (2-3 раза в неделю) + хотфиксы
〉До 10 одновременных разработчиков проекта
〉Много подпроектов, микросервисов, библиотек, пакетов (>20)
〉Много зависимостей, включая бинарные (10-50)
〉Несколько окружений (development, testing, prestable, production)
〉Большое количество серверов (10-100)
〉Разные платформы (lucid, precise, trusty)
〉Debian-пакеты
4
Условия
![Page 5: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/5.jpg)
〉Каждое изменение должно интегрироваться
〉Тесты
〉Быстрая сборка (<10 минут)
〉Интеграция на выделенной машине
5
Принципы непрерывной интеграции
![Page 6: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/6.jpg)
Решение
![Page 7: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/7.jpg)
〉«Собираем всех в одно гнездо» – все разработчики и проекты разрабатываются на одной dev-машине
〉«Virtualenv в каждый дом»
〉«Береги код смолоду» (pep8, flake8, … )
〉«Trust but check» – GitHub Enterprise, pull requests, code review
7
Разработка
![Page 8: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/8.jpg)
〉Unit-тесты (>10к тестов в одном из проектов) – unittest2, nose, pytest
〉Code coverage (в среднем 70-80%)
〉Моки внешних сервисов
〉Приемочные тесты пишутся тестировщиками
〉Ручное тестирование отдельных компонент
8
Тестирование
![Page 9: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/9.jpg)
〉Pbuilder – изоляция окружения сборки пакета
〉Сборка debian-пакета – распространение кода
〉Cобираем virtualenv и кладем его в debian-пакет – изоляция python-зависимостей
〉Кэшируем Python Wheels – ускорение сборки
〉Python-библиотеки загружаем на внутренний PyPI – переиспользование кода
9
Пакетирование
![Page 10: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/10.jpg)
sudo pbuilder --login --save-after-login —basetgz <путь до образа>
apt-get update
cd <project path>
debuild
virtualenv --system-site-packages <env-dir>
. <env-dir>/bin/activate
pip wheel -w “/tmp/wheels” -f “/tmp/.cache/wheels" -r requirements.txt
pip install --use-wheel --no-index -f "/tmp/.cache/wheels" -r requirements.txt
py.test --cov <module> tests
10
Процесс пакетирования
![Page 11: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/11.jpg)
〉Созданное окружение в pbuilder уничтожается
〉Прокидываем директории для кэша из системы при инициализации образа
.pbuilderrc
BINDMOUNTS=<path to cache>
HOOKDIR=<path to hooks>
11
Хитрости кэширование Python Wheels
![Page 12: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/12.jpg)
〉TeamCity
〉Агенты для проекта и есть общий пул агентов
〉Шаблоны сборок
〉Интеграция с GitHub
〉Conductor – установка пакета на сервера (внутренний продукт)
12
Система непрерывной интеграции
![Page 13: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/13.jpg)
13
TeamCity
![Page 14: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/14.jpg)
14
Агенты
![Page 15: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/15.jpg)
15
Шаблоны сборок
![Page 16: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/16.jpg)
16
Интеграция с GitHub
![Page 17: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/17.jpg)
17
Интеграция с GitHub
![Page 18: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/18.jpg)
18
Conductor
![Page 19: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/19.jpg)
19
Conductor
![Page 20: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/20.jpg)
20
Conductor
![Page 21: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/21.jpg)
1. Сборка пакета
1. Создание изолированного окружения
2. Сборка virtualenv с тестовыми утилитами
3. Тестирование с coverage
4. Сборка продакшен virtualenv
2. Публикация результатов coverage в GitHub (в pull request)
3. Загрузка debian-пакета на внутренний debian-репозиторий
4. Загрузка python-пакета на внутренний PyPI (в случае библиотеки)
5. Тикет в систему деплоя пакетов (Conductor)
21
Шаги
![Page 22: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/22.jpg)
22
Публикация результатов coverage в GitHub
![Page 23: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/23.jpg)
23
Публикация результатов coverage в GitHub
![Page 24: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/24.jpg)
24
Внутренний PyPI
![Page 25: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/25.jpg)
25
Conductor
![Page 26: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/26.jpg)
Результаты
![Page 27: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/27.jpg)
〉Выявление багов на раннем этапе – дешевле разработка
〉Частые релизы – ускоренный feedback
〉Аккуратный однотипный код – легче поддерживать
27
Для менеджеров
![Page 28: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/28.jpg)
〉На одной машине могут стоять пакеты с зависимостями различных версий (virtualenv)
〉Пакет собирается в окружении близком к production (pbuilder)
〉Легко создавать новые сборки (унифицикация сборок, шаблоны)
〉Быстрая сборка пакета (до 10 минут) (кэширования Python Wheels)
28
Для разработчиков
![Page 29: Непрерывная интеграция Python-проектов в Яндексе](https://reader034.vdocuments.net/reader034/viewer/2022051318/58a3054c1a28abea508b58ab/html5/thumbnails/29.jpg)
Спасибо за внимание!