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