Непрерывная интеграция Python-проектов в Яндексе

Preview:

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

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

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

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

Разработчик

Контакты

andrey.kazarinovairjordan@yandex-team.ru

Recommended