Slide 1

Slide 1 text

Как мы делаем раскладку Календаря Владимир Рудных

Slide 2

Slide 2 text

Moscow Django MeetUp №7 Обо мне • тимлид Календаря Mail.Ru • pythonista • бывший перловик • ленивый программист

Slide 3

Slide 3 text

Moscow Django MeetUp №7 Календарь Mail.Ru • calendar.mail.ru • написан на Python • Django framework • PostgreSQL • Rich Internet Application • RESTful API • шаблонизация на клиенте (Fest)

Slide 4

Slide 4 text

Moscow Django MeetUp №7 calendar.mail.ru

Slide 5

Slide 5 text

Moscow Django MeetUp №7 Разработка в Mail.Ru Тестовое окружение Production Офисная сеть (разработчики)

Slide 6

Slide 6 text

Moscow Django MeetUp №7 как? Раскладка проекта серверы серверы репозиторий git много серверов

Slide 7

Slide 7 text

Moscow Django MeetUp №7 Ахаха, мы же не перловики! Раскладка проекта серверы серверы репозиторий git много серверов "rsync" ?

Slide 8

Slide 8 text

Moscow Django MeetUp №7 Раскладка проекта

Slide 9

Slide 9 text

Moscow Django MeetUp №7 Вся мощь Python с нами! Раскладка проекта

Slide 10

Slide 10 text

Moscow Django MeetUp №7 • setuptools • distribute • easy_install • pip Раскладка проекта

Slide 11

Slide 11 text

Moscow Django MeetUp №7 Раскладка проекта • python setup.py install • pip install package • pip install -r requirements.txt

Slide 12

Slide 12 text

Moscow Django MeetUp №7 NO WAY! Раскладка проекта

Slide 13

Slide 13 text

Moscow Django MeetUp №7 Загаживать систему пакетами? Что делать с зависимостями? Как отслеживать их версии? Раскладка проекта

Slide 14

Slide 14 text

Moscow Django MeetUp №7 А если нужна другая версия Python? А что делать, если нужно откатиться? Что делать с зависимостями при откате? Раскладка проекта

Slide 15

Slide 15 text

Moscow Django MeetUp №7 АД Раскладка проекта

Slide 16

Slide 16 text

Moscow Django MeetUp №7 Вспоминаем про virtualenv Раскладка проекта

Slide 17

Slide 17 text

Moscow Django MeetUp №7 Vitrualenv • весь проект в одном месте • со всеми зависимостями • любые версии Python и модулей • не засоряет систему

Slide 18

Slide 18 text

Moscow Django MeetUp №7 Но как раскладывать? Makefile? Fabric? RPM*! Раскладка проекта * RPM, DEB или любой другой формат пакетов

Slide 19

Slide 19 text

Moscow Django MeetUp №7 RPM • весь проект со всеми зависимостями • в одном пакете • накатить/откатить - без проблем • версионность пакетов • версионность отдельных модулей • не засоряет систему • админы умеют (привет, CPAN!)

Slide 20

Slide 20 text

Moscow Django MeetUp №7 Как собирать? Jenkins CI RPM

Slide 21

Slide 21 text

Moscow Django MeetUp №7 сборка RPM • пишем fabfile для запуска сборки • пишем SPEC-файл для RPM • заводим задачу в Jenkins CI • ... • пушим ветку в git, получаем RPM: - git master -> RPM stable - git prerelease -> RPM testing

Slide 22

Slide 22 text

Moscow Django MeetUp №7 Jenkins CI Задачи в Jenkins: • development - все ветки • prerelease - ветка prerelease • release - ветка master

Slide 23

Slide 23 text

Moscow Django MeetUp №7 плюшки Jenkins • автоматическая сборка RPM • continuous integration • тесты • lint • coverage • change log • мгновенная обратная связь

Slide 24

Slide 24 text

Moscow Django MeetUp №7 Jenkins CI

Slide 25

Slide 25 text

Moscow Django MeetUp №7 Jenkins CI: report

Slide 26

Slide 26 text

Moscow Django MeetUp №7 Jenkins jobs dev prerelease release pylint ✔ flake8 ✔ ✔ coverage ✔ ✔ tests ✔ ✔ ✔ RPM ✔ ✔

Slide 27

Slide 27 text

Moscow Django MeetUp №7 Разложили, что дальше? Как узнать, что всё хорошо? Нужен мониторинг! Раскладка проекта

Slide 28

Slide 28 text

Moscow Django MeetUp №7 Мониторинг • метрики в Graphite (+Statsd) • ошибки в Sentry • дежурные администраторы • обращения пользователей в службу поддержки

Slide 29

Slide 29 text

Moscow Django MeetUp №7 Что будем мониторить? Да всё будем мониторить! Graphite

Slide 30

Slide 30 text

Moscow Django MeetUp №7 Graphite • количество запросов • тип запросов • время выполнения • время ожидания • таймауты • количество ошибок • выкладки и рестарты

Slide 31

Slide 31 text

Moscow Django MeetUp №7 Где будем мониторить? Да везде будем мониторить! Graphite

Slide 32

Slide 32 text

Moscow Django MeetUp №7 Graphite • клиент (браузер) • сервер (cpu, memory, hardware) • nginx • uwsgi • приложение • БД • обвязка (очереди, рассыльщики)

Slide 33

Slide 33 text

Moscow Django MeetUp №7 Разложились. Есть ошибки. Что делать? Раскладка проекта

Slide 34

Slide 34 text

Moscow Django MeetUp №7 Просить админов погрепать логи? Раскладка проекта

Slide 35

Slide 35 text

Moscow Django MeetUp №7 Раскладка проекта

Slide 36

Slide 36 text

Moscow Django MeetUp №7 Sentry! Раскладка проекта

Slide 37

Slide 37 text

Moscow Django MeetUp №7 Получаем все ошибки Frontend + Backend в удобном виде. Realtime! Sentry

Slide 38

Slide 38 text

Moscow Django MeetUp №7 Sentry • url ошибки • данные запроса (request) • полный stacktrace ошибки • версии модулей • информация о пользователе (email, браузер, ОС) Для каждой ошибки!

Slide 39

Slide 39 text

Moscow Django MeetUp №7 За исключением приватных данных пользователя =) “password”: “********” Sentry

Slide 40

Slide 40 text

Moscow Django MeetUp №7 Sentry

Slide 41

Slide 41 text

Moscow Django MeetUp №7 Sentry

Slide 42

Slide 42 text

Moscow Django MeetUp №7 Но как избежать ошибок? Раскладка проекта

Slide 43

Slide 43 text

Moscow Django MeetUp №7 Тестирование + Code review Раскладка проекта

Slide 44

Slide 44 text

Moscow Django MeetUp №7 Тестирование • nose • factory_boy • mock • Selenium (coming soon...)

Slide 45

Slide 45 text

Moscow Django MeetUp №7 Тестирование • модульное • функциональное • регрессионное • альфа (тестировщики) • бета (пользователи)

Slide 46

Slide 46 text

Moscow Django MeetUp №7 Phabricator Code review

Slide 47

Slide 47 text

Moscow Django MeetUp №7 Code review • подписка на коммиты (с фильтрами) • аудит и рецензирование коммитов • просмотр кода и diff’ов

Slide 48

Slide 48 text

Moscow Django MeetUp №7 Подведём итоги

Slide 49

Slide 49 text

Moscow Django MeetUp №7 Best practice • пишем на Python • используем virtualenv • менеджеры пакетов ОС (RPM) • автоматизируем процесс (Jenkins) • мониторим всё и вся • тесты, тесты, тесты! • обратная совместимость кода • code review, code style + lint

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

Moscow Django MeetUp №7 Контакты •Владимир Рудных • [email protected] • github.com/dreadatour • dreadatour.habrahabr.ru