Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Как мы делаем раскладку Календаря@Mail.Ru

Как мы делаем раскладку Календаря@Mail.Ru

Владимир Рудных

Буквально на днях мы запустили Календарь Mail.Ru, написанный на Python. На встрече я расскажу, как мы организовали раскладку проекта на Django в бой, какой путь проходит код от коммита в git до появления его на боевых серверах, как мы отслеживаем результаты нашей работы и понимаем, что раскладка прошла успешно.

Moscow Python Meetup
PRO

November 21, 2012
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. Moscow Django MeetUp №7
    calendar.mail.ru

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  24. Moscow Django MeetUp №7
    Jenkins CI

    View Slide

  25. Moscow Django MeetUp №7
    Jenkins CI: report

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  40. Moscow Django MeetUp №7
    Sentry

    View Slide

  41. Moscow Django MeetUp №7
    Sentry

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  46. Moscow Django MeetUp №7
    Phabricator
    Code review

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  50. 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

    View Slide

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

    View Slide