Как мы делаем раскладку Календаря Владимир Рудных
May 22, 2015
Как мы делаемраскладку Календаря
Владимир Рудных
Moscow Django MeetUp №7
Обо мне
• тимлид Календаря Mail.Ru
• pythonista
• бывший перловик
• ленивый программист
Moscow Django MeetUp №7
Календарь Mail.Ru
• calendar.mail.ru
• написан на Python
• Django framework
• PostgreSQL
• Rich Internet Application
• RESTful API
• шаблонизация на клиенте (Fest)
Moscow Django MeetUp №7
calendar.mail.ru
Moscow Django MeetUp №7
Разработка в Mail.Ru
Тестовое окружение
Production
Офисная сеть(разработчики)
Moscow Django MeetUp №7
как?
Раскладка проекта
серверысерверырепозиторий
gitмного
серверов
Moscow Django MeetUp №7
Ахаха, мы же не перловики!
Раскладка проекта
серверысерверырепозиторий
gitмного
серверов"rsync"
?
Moscow Django MeetUp №7
Раскладка проекта
Moscow Django MeetUp №7
Вся мощь Python
с нами!
Раскладка проекта
Moscow Django MeetUp №7
• setuptools
• distribute
• easy_install
• pip
Раскладка проекта
Moscow Django MeetUp №7
Раскладка проекта
• python setup.py install
• pip install package
• pip install -r requirements.txt
Moscow Django MeetUp №7
NO WAY!
Раскладка проекта
Moscow Django MeetUp №7
Загаживать систему пакетами?
Что делать с зависимостями?
Как отслеживать их версии?
Раскладка проекта
Moscow Django MeetUp №7
А если нужна другая версия Python?
А что делать, еслинужно откатиться?
Что делать с зависимостямипри откате?
Раскладка проекта
Moscow Django MeetUp №7
АД
Раскладка проекта
Moscow Django MeetUp №7
Вспоминаем про
virtualenv
Раскладка проекта
Moscow Django MeetUp №7
Vitrualenv
• весь проект в одном месте
• со всеми зависимостями
• любые версии Python и модулей
• не засоряет систему
Moscow Django MeetUp №7
Но как раскладывать?
Makefile? Fabric?
RPM*!
Раскладка проекта
* RPM, DEB или любой другой формат пакетов
Moscow Django MeetUp №7
RPM
• весь проект со всеми зависимостями
• в одном пакете
• накатить/откатить - без проблем
• версионность пакетов
• версионность отдельных модулей
• не засоряет систему
• админы умеют (привет, CPAN!)
Moscow Django MeetUp №7
Как собирать?
Jenkins CI
RPM
Moscow Django MeetUp №7
сборка RPM
• пишем fabfile для запуска сборки
• пишем SPEC-файл для RPM
• заводим задачу в Jenkins CI
• ...
• пушим ветку в git, получаем RPM:
- git master -> RPM stable
- git prerelease -> RPM testing
Moscow Django MeetUp №7
Jenkins CI
Задачи в Jenkins:
• development - все ветки
• prerelease - ветка prerelease
• release - ветка master
Moscow Django MeetUp №7
плюшки Jenkins
• автоматическая сборка RPM
• continuous integration
• тесты
• lint
• coverage
• change log
• мгновенная обратная связь
Moscow Django MeetUp №7
Jenkins CI
Moscow Django MeetUp №7
Jenkins CI: report
Moscow Django MeetUp №7
Jenkins jobs
dev prerelease release
pylint ✔
flake8 ✔ ✔
coverage ✔ ✔
tests ✔ ✔ ✔
RPM ✔ ✔
Moscow Django MeetUp №7
Разложили, что дальше?
Как узнать, что всё хорошо?
Нужен мониторинг!
Раскладка проекта
Moscow Django MeetUp №7
Мониторинг
• метрики в Graphite (+Statsd)
• ошибки в Sentry
• дежурные администраторы
• обращения пользователей
в службу поддержки
Moscow Django MeetUp №7
Что будем мониторить?
Да всё будем мониторить!
Graphite
Moscow Django MeetUp №7
Graphite
• количество запросов
• тип запросов
• время выполнения
• время ожидания
• таймауты
• количество ошибок
• выкладки и рестарты
Moscow Django MeetUp №7
Где будем мониторить?
Да везде будем мониторить!
Graphite
Moscow Django MeetUp №7
Graphite
• клиент (браузер)
• сервер (cpu, memory, hardware)
• nginx
• uwsgi
• приложение
• БД
• обвязка (очереди, рассыльщики)
Moscow Django MeetUp №7
Разложились.
Есть ошибки.
Что делать?
Раскладка проекта
Moscow Django MeetUp №7
Просить админов
погрепать логи?
Раскладка проекта
Moscow Django MeetUp №7
Раскладка проекта
Moscow Django MeetUp №7
Sentry!
Раскладка проекта
Moscow Django MeetUp №7
Получаем все ошибки
Frontend + Backend
в удобном виде.
Realtime!
Sentry
Moscow Django MeetUp №7
Sentry
• url ошибки
• данные запроса (request)
• полный stacktrace ошибки
• версии модулей
• информация о пользователе
(email, браузер, ОС)
Для каждой ошибки!
Moscow Django MeetUp №7
За исключением
приватных данных
пользователя =)
“password”: “********”
Sentry
Moscow Django MeetUp №7
Sentry
Moscow Django MeetUp №7
Sentry
Moscow Django MeetUp №7
Но как
избежать ошибок?
Раскладка проекта
Moscow Django MeetUp №7
Тестирование+
Code review
Раскладка проекта
Moscow Django MeetUp №7
Тестирование
• nose
• factory_boy
• mock
• Selenium (coming soon...)
Moscow Django MeetUp №7
Тестирование
• модульное
• функциональное
• регрессионное
• альфа (тестировщики)
• бета (пользователи)
Moscow Django MeetUp №7
Phabricator
Code review
Moscow Django MeetUp №7
Code review
• подписка на коммиты (с фильтрами)
• аудит и рецензирование коммитов
• просмотр кода и diff’ов
Moscow Django MeetUp №7
Подведём итоги
Moscow Django MeetUp №7
Best practice• пишем на Python
• используем virtualenv
• менеджеры пакетов ОС (RPM)
• автоматизируем процесс (Jenkins)
• мониторим всё и вся
• тесты, тесты, тесты!
• обратная совместимость кода
• code review, code style + lint
Moscow Django MeetUp №7
Ссылки
• Virtualenv: virtualenv.org
• Jenkins: jenkins-ci.org
• Graphite: graphite.wikidot.com
• Statsd: github.com/etsy/statsd
• Sentry: getsentry.com
• Phabricator: phabricator.org
Moscow Django MeetUp №7
Контакты
•Владимир Рудных
• github.com/dreadatour
• dreadatour.habrahabr.ru