30

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

Embed Size (px)

Citation preview

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

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

Андрей Казаринов, разработчик Python Party, Москва, 02.09.2015

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

〉Большое количество времени уходит на поддержание процесса разработки (тестирование, сборка релиза, выкладка)

〉Чем позже найден баг, тем он дороже

3

Проблема

Решение – автоматизация

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

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

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

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

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

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

〉Большое количество серверов (10-100)

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

〉Debian-пакеты

4

Условия

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

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

〉Тесты

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

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

5

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

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

Решение

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

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

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

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

〉«Trust but check» – GitHub Enterprise, pull requests, code review

7

Разработка

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

〉Unit-тесты (>10к тестов в одном из проектов) – unittest2, nose, pytest

〉Code coverage (в среднем 70-80%)

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

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

〉Ручное тестирование отдельных компонент

8

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

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

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

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

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

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

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

9

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

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

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-проектов в Яндексе

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

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

.pbuilderrc

BINDMOUNTS=<path to cache>

HOOKDIR=<path to hooks>

11

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

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

〉TeamCity

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

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

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

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

12

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

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

13

TeamCity

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

14

Агенты

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

15

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

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

16

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

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

17

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

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

18

Conductor

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

19

Conductor

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

20

Conductor

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

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-проектов в Яндексе

22

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

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

23

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

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

24

Внутренний PyPI

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

25

Conductor

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

Результаты

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

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

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

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

27

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

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

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

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

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

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

28

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

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

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

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

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

Разработчик

Контакты

[email protected]