Upload
andrey-kazarinov
View
230
Download
3
Embed Size (px)
Citation preview
Непрерывная интеграция Python-проектов в Яндексе
Андрей Казаринов, разработчик Python Party, Москва, 02.09.2015
〉Большое количество времени уходит на поддержание процесса разработки (тестирование, сборка релиза, выкладка)
〉Чем позже найден баг, тем он дороже
3
Проблема
Решение – автоматизация
〉Частые релизы (2-3 раза в неделю) + хотфиксы
〉До 10 одновременных разработчиков проекта
〉Много подпроектов, микросервисов, библиотек, пакетов (>20)
〉Много зависимостей, включая бинарные (10-50)
〉Несколько окружений (development, testing, prestable, production)
〉Большое количество серверов (10-100)
〉Разные платформы (lucid, precise, trusty)
〉Debian-пакеты
4
Условия
〉Каждое изменение должно интегрироваться
〉Тесты
〉Быстрая сборка (<10 минут)
〉Интеграция на выделенной машине
5
Принципы непрерывной интеграции
Решение
〉«Собираем всех в одно гнездо» – все разработчики и проекты разрабатываются на одной dev-машине
〉«Virtualenv в каждый дом»
〉«Береги код смолоду» (pep8, flake8, … )
〉«Trust but check» – GitHub Enterprise, pull requests, code review
7
Разработка
〉Unit-тесты (>10к тестов в одном из проектов) – unittest2, nose, pytest
〉Code coverage (в среднем 70-80%)
〉Моки внешних сервисов
〉Приемочные тесты пишутся тестировщиками
〉Ручное тестирование отдельных компонент
8
Тестирование
〉Pbuilder – изоляция окружения сборки пакета
〉Сборка debian-пакета – распространение кода
〉Cобираем virtualenv и кладем его в debian-пакет – изоляция python-зависимостей
〉Кэшируем Python Wheels – ускорение сборки
〉Python-библиотеки загружаем на внутренний PyPI – переиспользование кода
9
Пакетирование
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
Процесс пакетирования
〉Созданное окружение в pbuilder уничтожается
〉Прокидываем директории для кэша из системы при инициализации образа
.pbuilderrc
BINDMOUNTS=<path to cache>
HOOKDIR=<path to hooks>
11
Хитрости кэширование Python Wheels
〉TeamCity
〉Агенты для проекта и есть общий пул агентов
〉Шаблоны сборок
〉Интеграция с GitHub
〉Conductor – установка пакета на сервера (внутренний продукт)
12
Система непрерывной интеграции
13
TeamCity
14
Агенты
15
Шаблоны сборок
16
Интеграция с GitHub
17
Интеграция с GitHub
18
Conductor
19
Conductor
20
Conductor
1. Сборка пакета
1. Создание изолированного окружения
2. Сборка virtualenv с тестовыми утилитами
3. Тестирование с coverage
4. Сборка продакшен virtualenv
2. Публикация результатов coverage в GitHub (в pull request)
3. Загрузка debian-пакета на внутренний debian-репозиторий
4. Загрузка python-пакета на внутренний PyPI (в случае библиотеки)
5. Тикет в систему деплоя пакетов (Conductor)
21
Шаги
22
Публикация результатов coverage в GitHub
23
Публикация результатов coverage в GitHub
24
Внутренний PyPI
25
Conductor
Результаты
〉Выявление багов на раннем этапе – дешевле разработка
〉Частые релизы – ускоренный feedback
〉Аккуратный однотипный код – легче поддерживать
27
Для менеджеров
〉На одной машине могут стоять пакеты с зависимостями различных версий (virtualenv)
〉Пакет собирается в окружении близком к production (pbuilder)
〉Легко создавать новые сборки (унифицикация сборок, шаблоны)
〉Быстрая сборка пакета (до 10 минут) (кэширования Python Wheels)
28
Для разработчиков
Спасибо за внимание!